7 Commits

164 changed files with 7602 additions and 5895 deletions

1
.gitignore vendored
View File

@@ -1,5 +1,4 @@
/target/
/config/
!.mvn/wrapper/maven-wrapper.jar
### STS ###

2
.vscode/launch.json vendored
View File

@@ -71,7 +71,7 @@
"CYGNUS_LOGIN_PUBLIC_KEY": "file:${workspaceFolder}/config/keys/login-public.pem",
"CYGNUS_PAYLOAD_PRIVATE_KEY": "file:${workspaceFolder}/config/keys/case-save-private.pem",
"CYGNUS_PAYLOAD_PUBLIC_KEY": "file:${workspaceFolder}/config/keys/case-save-public.pem",
"CYGNUS_CLOUD_REQUEST_TIMEOUT": "PT10S",
"CYGNUS_CLOUD_REQUEST_TIMEOUT": "PT30S",
"CYGNUS_TOKEN_REFRESH_SKEW": "PT30S"
},
"vmArgs": "-Dserver.port=8080 -Djava.awt.headless=true -Dmatrix.webapp=${workspaceFolder}/cygnus-onprem-app/build/WebContent -Dmatrix.classes=${workspaceFolder}/cygnus-onprem-app/target/classes",

View File

@@ -0,0 +1 @@
eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiUlNBLU9BRVAtMjU2In0.rf8bViJPb5bRJHFamVoCftE0TLA1Gz7JyGnfcjtKEx3KiUL4SSbgYSUQlsKhCt8VJMWE--UpgbkM0Bv3pFVsMF_uh693MhFstEy_A6S3MODjoUV_bMLa_Zr1yH2Jwzud4LSyw-ctJ7G-vO8S_I6YML0HV5kNbobdFmMfXFLGKssVmM_Km0m57ZgSjj3zRii0cKpmdwwSbWoJC2y519TpKhIja0OZAoN1oB3IVKvERlFYCQYUpQmcRkzULGrlSoLIm9iqbRX4qMGhGISwVS6JdVtn9WjpSjF3xkUxN_QsVuYKYFL_kEKWSNepIcfoip7Ag9Qw_S1RZA_KO908MgrzGRbs2UIpxY9sAM8yZ-k1NTk0swV836s5pdDIP3PHovcd6iR8mqWBPt7mq7ES98vNeCZxqPLB_b1JuNfKsbLPdRIvEk2DTjZHeEi-yA1yl5uMi_1f4la6mgy65u_jLL_Ow28uZtj-8yQ3dR4lF3K7tkxQaB4LQiH5nl6lXEndpoPe.Cpu6VoHf2ptCue_L.uH-Pq1WZN-x_c71Iyx8X1QJa1JZRp9sYta9iUOmQ4W8x4Qh2wYm-_tpr8FEw56MLvIb8IH_gHVVLAJgXTmCZhyo26vJlPCtnMMPYFDrPRzTJv9Ewg7RMpsAh_kXFFK4UJ6Tgt_r7Tg_bnVOTKXodUjl3wVdMowZRX_ua-gKwLU-2LDWdqIRmuFDSOkMb1sFBZLPyjWHg_rThs-RwVa4YJdDi74s-L0WX0xRPXzeovu1-xvOgZ0xYf0ScbsFQgvK-JwAxOWsB1WKeHRqnnx5-apK6qtzhpiJ30c7ukPlrg2nieuJvkXOVuKBKXLVRLSViOH4HU76DD96btDUA0Cg2kEURpepucX0VWPyB7K3xb9v1AT42TUkW9wZzdmIs9saRo-ItuWzlCezvapLIsbqmYCs_rW2J3KgqXrUyy2mptn32sqaqQZnlNVu4wwboPCCrbl2MG5CYlYKrwaOHNg611j8sCDkIptm_UmPFnOnzvQYwURuDSgzswTIV5bTd_58yxag2yWwiMdGLMDbxxSUPQ6a4EbuDkqwmGBTSLiG7SaSFchSg6o9EflqK6k-u_rlixCxmfg1A6sa7nloW17dOxDzGKtmn9lBoaskL97nNrhP6ptftak7j4TIZulz1FUOSVoR8kXK8RNQMj-b6rg_MdSO9Ecq5hZsza1SzjkzKZvV-tpP6Wl6-rszCH6g3DIQAWN5aWdUkwuya1HqDDyVPbUOVQPsp4nhVC24QmnlbcqFwQdoCrikYKyX3Snc0H6_K4z9c6nURAdj6THwHmA9BfHtJniI_rEIvkmBk3yndi-H5eAjtxIoYSFQrSTWEFhgvk6bAKoR_xb_cHgzKOxYLBiO_FifkjkFDOlkVBuYnZEp3oRePDKgMDfL5Oxjuie4u-8yrH52Cd32yQzbvGplaXLLeEDf3i71dcz4LkO5DknScWG3G_SbKBpjlse-GKe3XYqRXeRIYLpyiX1MXph0b-Q.dvHU75ZR8wJFxoSacfkthw

View File

@@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
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
M/D4ZjXsfrW//BMF6+w2Bh4=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAloJtGMOLcTNWe1IgdrT8
uYucI1Vs02WjyUPZ7Po51iC67QmGdG0InzlBJYdkYtTz8eda+qArZMNGB0ChFs/7
xKPKASkMvVcrm4IYbth0DEIkXWAL7YXsWd8qdS+KsnxuC6TqvuA9Xq/PX4RmtAq4
bl0/1T2HZjJs53/b73l5NehcseZU129w+5lBqDwW5xh+1VnXNbc96za7BFfQSnfg
9WwaWSpo8Y57XATnV7s46yT8gNKM29INHJXs4aIrQ9tcLnTbDz9nhGceNgec3AhO
zc4TyCPugUiG9WD4ehsQr+7Cp30RqT5l9ZPvoBTpAdHLZ1r/jB+qY6+WkY6EsOJW
2xg9bUYoHXjMiFdi8OLXC4NTAPUquFOaIMfjxGaYQc8NoDMFiq3qdTWi2ndCOoxX
yFxYRP5pYs/oA46UAHZsCHaspjvl9jfR/abCALBtsFLwpLA9qqBws5ojXFH//UoX
E7dXnJziCFQNyJOhXtIhbQhtb3wJc6WSLtDrRpFtaJudAgMBAAE=
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
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
m/lDtrY4EpMy9FSQD1zb+qE=
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyfuM67QxEonEvC2Vf21
P+fxo406Z4C+zNzxH/8tCPhMH94Sklt10WXqSfQFfZbhJPVYoZL8m0NDI7ozI7lI
MPAhAVfcFOzO6VqpFGrzMgMqmnWLrxRsL3y1rjB3LnE84W+ATcS/mlk6rwbCfrSo
RRlY3i79ol8h36jhhaHT2/iGGO3uvqAQK334lQEOlqr+YL4Kkr/GMOm86bE4PcZS
JgCTAnlCQC7TUu6jGWuocmI1nNwLXPjQvXgc+HKtJEqFGf+a0fty9fLgaR2yIzlM
9i31r3kjeKzqVe2DeLTbttd8bVWU4/KmGg8rEchtwC8wR4inuDUjwJ3FwmdBrvDp
Ga1AM8yofdbs73Lv2EgkvRLvlgaWiX2P6KdlKGHeaDj9v0YWJbiFM4rc9y5hD3lG
2unhpvP/49OFXVBT2/pm86LmxSlwsun3G2LKNOXI646jhdVHQkIVcBiHTHYQOe9/
xLqx3ZiEM7witbzuJnxIkbj/8OFgH+WDUmTQVXtbz7vdAgMBAAE=
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
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
RqsZZ1cLu0TCOoNBkcSr79a6
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAtZc750+cxwDcG/lvpEHm
3fxFgp5X5df90s51R4ShKpV6dmDRYXnVil9GmXrJf/aGAqrsf6ZUvZWJrAJ2OO2X
Wt8tcqajnaWdM33BrH/QztTJkoGHZM1xLY5EpRaWo1LaG2gNGsaxG0ON9T1emKi7
XDEcI9Lmc/mhP6SuuUnvGwq1Z433vqGodorkU+T2jCfflhwfenvBcOk4GJZoJFlY
sjy9Dtlha70MJpdVFWffxs4UBhhkjckb7GbDTVxa3xvz1NEbkY2+oh/tJmuIuupA
7A6TnfYP1YPXPMRQFtSPaKMOeKW5J5IorvgQKr4C74HR9iBojJN2oJ6/BjfAaz7P
8kywLj2uo9gJemOm1wz8HZyZsz482GHa0wqpUcFfOIr0oTMiJtvLn/FSYVb5xvNg
3xWiGPMju32Z49XTX7VxTDsIjGx5wtDd4G8ILS3yUlKw0yufHacmy8Fn+Plk+Xtz
Bbz6rq4frV93/3mfVMPGgBDx8mLjVJovPBnXKBSX+SdbAgMBAAE=
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
MIIG/gIBADANBgkqhkiG9w0BAQEFAASCBugwggbkAgEAAoIBgQDOk7AQIpVbQp1n
CVUm1bu2SqprXBjUn4eG4V/+RuOYm/x/AVwaP67LLazlxfOByQ0fPcK/gqLxWdBq
RufzcpFM0i4y9iDCdo1jfkq9UpTlHwo8nvBXzIRTKFHKO1q5pj1NpVQfQxK0PeLN
xns996Ncm/FG0uND1Jf8r6OgezeaRbJYM1ib27p5wsGg/FboGkBeJQ5adKlzQg7a
eMZu+dgjvOzm1h0WNW0NN/hM5IgNd4Jdzuc1SF//JBUAQq8aavrhKKFlz7XVPkBc
nLV5USMXCPuFapxnGGC6Rpw6hTyhQ5E7Q7QfUchLwgJccGAovXsmr5+6sQieVTg9
+nW2QDt1iH2ddD3X6GZG1NJcDUGnNZ0jMLd9CqfBOwPpzIgOw91EH2JIlPLAU9sb
LAwhuHjAilQ5LezzcMG2nGPaofDvNzlD30E/gN3fySX16N91i4VhGZvOur4FlHuJ
zn8szv7yITFganPewUKvqokCUIMri2HpMKXZmPOClM4XemcLUjsCAwEAAQKCAYAn
FrkdBH5Ai4VfRtvPAmiHoO9Ia1/jc+BgPGs+oUlVykZn/ejgqqY3mgf6Xo+qQlHy
VGxycpTEmJsgURR483fdEnRdfkdKpMYySmZ4FpVIGayFNgoCgxeS6LE5VCvhrzww
YhVd6QI0CvXMvD77xc0qq/Nm1Gbeoe60iMOsjURDM+cAW47rxxMtERY0kSsctkLx
zY8+vI6H2bsXyfy6aRpmAMzPDTrpxehBtRKN8jxwV+naOFl1sqE/lSNILlYV6KID
HDRgnwVMJCtaYCF88MWuaQQ7O2pX/Ba1x42iZtLCX1ABw3N6/PsB/90KtSNp5Duu
naM50NpsFDqAnFXrB7rUM7OK3nnBGVDK4KpD+36HdhNSCvhO+Tz+GQnWh46dMx76
0yOlSLoIHdDozP4aQXiHnIKdm8gInTOyoQftm3+11ba9WL7n8xOFH5sAl0em44d2
NcYx49myiIk/1VI+SZzPRUxwU4pwXL4rMRXzkRuQLQ6KorKqL2d1iH+crpFVCWEC
gcEA9Wy8nqS/2Nq7A+ph2B+Kf1o4Dc8njRrIJRwUBeik8zIfbaH5TdGUrjAyFOdO
GaL0bLz02hkOh+vq4NpxqcvLZ4L+phPgeDvb8DFFkdYE2jtbAFFOidGIfplja0aL
FBiusu3myGD37/7dSQo7VM/TihO6BANbye+SOFBHmTRNjFy7z6JPZOfQKp+yWFHN
3DOemAsG4XdVnWfkLqW7aBzsePae7ivMidHffgr9kdxbMPBemovN5ppFXMMLG6VQ
xmrxAoHBANd6bE5f3zEvaBAQElUzHGB3sbAi7YZv/Oms2I0J+qQN9/a5N47VWys6
WKN6VB4ZHFU4wWPX56eARDONalmrNTOaMkOSOf/jAAstbMd0WjKs8/T0n80QCtD3
ti3HTR9Ls7gFcKzDwVMscnbpFtv8wa2tvIkNodrD9faiQ8ubZfcAyuL1suXEMFKb
dor8B/R7DNYztgZ31IeWuVPhhb4iSceWtWyRdaUXDaYG0jZcmWi5zFcFLjiFTckB
0RRaZwOX6wKBwHmMsxY3LjTuj7TuvirV5DgSrLRaJpKB8yI998S9ZgR0jJA1qk1a
QTLL9+HWdR3JURkRtIrX4hR7SUa3qZeYsVLA0/HY4lFqBBG/tV73CkwzHWzY1/b1
6Y4Z1d1pgLQhTVSc8rHHJMSeC2aDRMNKctBt2LDoIOuwVVDCodNEzit4OiQplPy6
uqSBl0iaq0Ql5KQUwgGkoqhkreRUfK6htJRsQGZhFtojMXcxZkh5REjGo3QTTZSq
TzQT/Uph49GBYQKBwQDELaZ7uJeIvUN+FFPMlAsK3Q6+cR5V3pGh4gcKaYJzaHBQ
hZLKjP9DHQzkUZRSDsSX5mNT1pcHDiWJ1f90ggae441Nrcz2ZqJ8iq/V693O813s
r+bpmOhwFocbqK9TheWq7fEGqfbSFc5k6pQwVy+yQ1I6aVnpxa2jDVqx/dpYhrUw
60ckH3lrTDUiFpHbiUhHoK7htqmdhKFYeCP+1lLbzx+AJ/K3CoUXmnA6pBXbngUn
WQUa2mrWTbwgTqopQF8CgcEA72nxgVESZclZQPxkAjnYQCPdhwioYFU2s1C2upNR
KQ4SQO7f1wjSrjj33THm6gzCpg3Wi9TCUYZoO/UFYHVtg3mUybwYowQTG1i35Xzy
TxaJLz3gL+0WrLqnifxSuxsp1AVMHYxbxyXdAawKtTexVJ0Z/L+e771Kyi8yjJtr
511v9Nr9GX4wIQb1OpXKynTqcE0P7OLKnr1ATNReM1jEMlaot2TP8sY7uj6CUgsL
5PO2cnRk24OsUqAswTBT2qjd
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAzpOwECKVW0KdZwlVJtW7
tkqqa1wY1J+HhuFf/kbjmJv8fwFcGj+uyy2s5cXzgckNHz3Cv4Ki8VnQakbn83KR
TNIuMvYgwnaNY35KvVKU5R8KPJ7wV8yEUyhRyjtauaY9TaVUH0MStD3izcZ7Pfej
XJvxRtLjQ9SX/K+joHs3mkWyWDNYm9u6ecLBoPxW6BpAXiUOWnSpc0IO2njGbvnY
I7zs5tYdFjVtDTf4TOSIDXeCXc7nNUhf/yQVAEKvGmr64SihZc+11T5AXJy1eVEj
Fwj7hWqcZxhgukacOoU8oUORO0O0H1HIS8ICXHBgKL17Jq+furEInlU4Pfp1tkA7
dYh9nXQ91+hmRtTSXA1BpzWdIzC3fQqnwTsD6cyIDsPdRB9iSJTywFPbGywMIbh4
wIpUOS3s83DBtpxj2qHw7zc5Q99BP4Dd38kl9ejfdYuFYRmbzrq+BZR7ic5/LM7+
8iExYGpz3sFCr6qJAlCDK4th6TCl2ZjzgpTOF3pnC1I7AgMBAAE=
-----END PUBLIC KEY-----

View File

@@ -0,0 +1,40 @@
-----BEGIN PRIVATE KEY-----
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
VkpSw8QqBfhHSViEh12BQZa2
-----END PRIVATE KEY-----

View File

@@ -0,0 +1,11 @@
-----BEGIN PUBLIC KEY-----
MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA2g0IbNxsNIZ6fKaGTHTQ
pUFfgJVq3x0SZ458xAQDL0l1PZ+lnMtvS3/ZZpbF99bLuqyzUuHwi+1BJ/Nled61
oK8RdJKfUPiQUshXfvWT4/sLsYO6H+v2qw2jBv6kx3h+teDiuHMbw6ikUECr5u1k
qkjb+ls3aijtWplmN25HRhwFB/l6/0xAhEQNA36EoNb+ufsDR/2aRQYGQ6qegynp
8bUt7JDf3hW1y76UCKlKteFfIOkp4zwY0YYq/NewgKlze08LBrX+zy5xr5Vn8nE0
ZtWY8vbNC33Sf6g5D1ZlA+HvquplAWS/rPymj+IN79FeXNegmyCxF/ZafsneaUBn
GpSgXYbyASpA+OkqUqJcBEeTI4rfRZPiyx3ztaibg+rgOEM/DUV5le2WyujnsQ75
IG4SrVu/XTmF08MN8/hD1+ydBVnhVa7bE4WctqgA1T/5BP7ivAB03a1BJHpKFRh/
Q/pO5ONIK8lNGG6aImLPmtJijEvOL0VsUdp+oO87VnTFAgMBAAE=
-----END PUBLIC KEY-----

View File

@@ -1,12 +1,17 @@
package com.cygnus.client;
import com.cygnus.client.model.CloudIdentitySession;
import com.cygnus.client.model.CloudDataItem;
import com.cygnus.client.model.CloudDataRequest;
import com.cygnus.client.model.CloudQueryResponse;
import com.cygnus.client.model.LoginPayload;
import com.cygnus.client.security.LoginEnvelopeEncryptor;
import com.cygnus.client.security.MachineTokenProvider;
import java.time.Clock;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.client.WebClient;
@@ -14,6 +19,9 @@ import reactor.core.publisher.Mono;
public class CloudIdentityClient {
private static final ParameterizedTypeReference<List<CloudDataItem>> CLOUD_DATA_LIST =
new ParameterizedTypeReference<>() { };
private final WebClient webClient;
private final MachineTokenProvider tokenProvider;
private final LoginEnvelopeEncryptor encryptor;
@@ -73,4 +81,17 @@ public class CloudIdentityClient {
.bodyToMono(CloudQueryResponse.class))
.timeout(properties.requestTimeout());
}
public Mono<List<CloudDataItem>> fetchData(String scope, Map<String, Object> data) {
return tokenProvider.accessToken()
.flatMap(token -> webClient.post()
.uri(properties.baseUri().resolve("/api/v1/platform/data"))
.header(HttpHeaders.AUTHORIZATION, "Bearer " + token)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.bodyValue(new CloudDataRequest(scope, Map.copyOf(data)))
.retrieve()
.bodyToMono(CLOUD_DATA_LIST))
.timeout(properties.requestTimeout());
}
}

View File

@@ -0,0 +1,6 @@
package com.cygnus.client.model;
import java.util.Map;
public record CloudDataItem(Object value, String label, String group, Map<String, Object> data) {
}

View File

@@ -0,0 +1,6 @@
package com.cygnus.client.model;
import java.util.Map;
public record CloudDataRequest(String scope, Map<String, Object> data) {
}

View File

@@ -0,0 +1,49 @@
package com.cygnus.cloud.platform.api;
import com.cygnus.cloud.platform.service.ScopedDataException;
import com.cygnus.cloud.platform.service.ScopedDataService;
import jakarta.validation.Valid;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/api/v1/platform/data")
public class ScopedDataController {
private static final Logger LOGGER = LoggerFactory.getLogger(ScopedDataController.class);
private final ScopedDataService service;
public ScopedDataController(ScopedDataService service) {
this.service = service;
}
@PostMapping
public Flux<ScopedDataItem> data(
@AuthenticationPrincipal Jwt machineJwt,
@Valid @RequestBody ScopedDataRequest request) {
if (machineJwt == null) throw new ScopedDataException("Machine authentication required");
try {
return service.fetch(UUID.fromString(machineJwt.getClaimAsString("tenant_id")), request);
} catch (IllegalArgumentException exception) {
throw new ScopedDataException("Machine tenant is invalid");
}
}
@ExceptionHandler(ScopedDataException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
Map<String, String> invalidRequest(ScopedDataException exception) {
LOGGER.warn("Scoped platform-data request rejected: {}", exception.getMessage());
return Map.of("code", "PLATFORM_DATA_INVALID", "message", exception.getMessage());
}
}

View File

@@ -0,0 +1,10 @@
package com.cygnus.cloud.platform.api;
import java.util.Map;
public record ScopedDataItem(
Object value,
String label,
String group,
Map<String, Object> data) {
}

View File

@@ -0,0 +1,10 @@
package com.cygnus.cloud.platform.api;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.Map;
public record ScopedDataRequest(
@NotBlank String scope,
@NotNull Map<String, Object> data) {
}

View File

@@ -0,0 +1,106 @@
package com.cygnus.cloud.platform.repository;
import com.cygnus.cloud.database.ReactiveDatabaseClient;
import com.cygnus.cloud.platform.api.ScopedDataItem;
import io.vertx.sqlclient.Row;
import io.vertx.sqlclient.Tuple;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.springframework.stereotype.Repository;
import reactor.core.publisher.Flux;
@Repository
public class ScopedDataRepository {
private static final String COMPANY_OPTIONS = """
SELECT ov.opt_value AS value,
ov.val_description AS label,
lower(o.description) || '.' AS group_name
FROM platform.company_options_mapping m
JOIN platform.options o ON o.option_id = m.option_id
JOIN platform.options_values ov ON ov.opt_value_id = m.opt_value_id
JOIN identity.company c ON c.company_id = m.company_id
WHERE c.tenant_id = $1
AND m.company_id = $2
AND o.isactive = 1
AND ov.isactive = 1
AND o.description = ANY($3::text[])
ORDER BY o.description, ov.val_description
""";
private static final String PORTFOLIO_OPTIONS = """
SELECT ov.opt_value AS value,
ov.val_description AS label,
lower(o.description) || '.' AS group_name
FROM platform.options_mapping m
JOIN platform.options o ON o.option_id = m.option_id
JOIN platform.options_values ov ON ov.opt_value_id = m.opt_value_id
JOIN identity.company c ON c.company_id = m.company_id
JOIN platform.company_branch_portfolios cbp
ON cbp.company_id = m.company_id
AND cbp.portfolio_reference = m.portfolio_reference
WHERE c.tenant_id = $1
AND m.company_id = $2
AND cbp.company_branch_id = $3
AND m.portfolio_reference = $4
AND o.isactive = 1
AND ov.isactive = 1
AND o.description = ANY($5::text[])
ORDER BY o.description, ov.val_description
""";
private static final String REPORT_DEFINITION = """
SELECT r.report_key, r.report_title, r.hide_leading_zero_columns,
c.column_key, c.column_label, c.display_order, c.alignment,
c.column_width, c.is_visible, c.is_totalled
FROM platform.report_definition r
JOIN platform.report_column_definition c ON c.report_key = r.report_key
WHERE r.report_key = $1
AND r.enabled = true
ORDER BY c.display_order
""";
private final ReactiveDatabaseClient database;
public ScopedDataRepository(ReactiveDatabaseClient database) {
this.database = database;
}
public Flux<ScopedDataItem> companyOptions(
UUID tenantId, short companyId, List<String> descriptions) {
return rows(COMPANY_OPTIONS, Tuple.of(tenantId, companyId, descriptions.toArray(String[]::new)));
}
public Flux<ScopedDataItem> portfolioOptions(
UUID tenantId, short companyId, short branchId, UUID portfolioReference,
List<String> descriptions) {
return rows(PORTFOLIO_OPTIONS,
Tuple.of(tenantId, companyId, branchId, portfolioReference,
descriptions.toArray(String[]::new)));
}
public Flux<ScopedDataItem> reportDefinition(String reportKey) {
return database.preparedQuery(REPORT_DEFINITION, Tuple.of(reportKey))
.flatMapMany(result -> Flux.fromIterable(result))
.map(row -> new ScopedDataItem(null, null, null, Map.of(
"reportKey", row.getString("report_key"),
"reportTitle", row.getString("report_title"),
"hideLeadingZeroColumns", row.getBoolean("hide_leading_zero_columns"),
"columnKey", row.getString("column_key"),
"columnLabel", row.getString("column_label"),
"displayOrder", row.getInteger("display_order"),
"alignment", row.getString("alignment"),
"columnWidth", row.getInteger("column_width"),
"visible", row.getBoolean("is_visible"),
"totalled", row.getBoolean("is_totalled"))));
}
private Flux<ScopedDataItem> rows(String sql, Tuple parameters) {
return database.preparedQuery(sql, parameters)
.flatMapMany(result -> Flux.fromIterable(result))
.map(this::item);
}
private ScopedDataItem item(Row row) {
return new ScopedDataItem(
row.getValue("value"), row.getString("label"), row.getString("group_name"), Map.of());
}
}

View File

@@ -0,0 +1,7 @@
package com.cygnus.cloud.platform.service;
public class ScopedDataException extends RuntimeException {
public ScopedDataException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,87 @@
package com.cygnus.cloud.platform.service;
import com.cygnus.cloud.platform.api.ScopedDataItem;
import com.cygnus.cloud.platform.api.ScopedDataRequest;
import com.cygnus.cloud.platform.repository.ScopedDataRepository;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
@Service
public class ScopedDataService {
public static final String COMPANY_OPTIONS = "company-options";
public static final String PORTFOLIO_OPTIONS = "portfolio-options";
public static final String REPORT_DEFINITION = "report-definition";
private final ScopedDataRepository repository;
public ScopedDataService(ScopedDataRepository repository) {
this.repository = repository;
}
public Flux<ScopedDataItem> fetch(UUID tenantId, ScopedDataRequest request) {
Map<String, Object> data = request.data();
String scope = request.scope().trim().toLowerCase(Locale.ROOT);
if (REPORT_DEFINITION.equals(scope)) {
return repository.reportDefinition(textValue(data, "reportKey"));
}
short companyId = shortValue(data, "companyId");
List<String> descriptions = descriptions(data);
return switch (scope) {
case COMPANY_OPTIONS -> repository.companyOptions(tenantId, companyId, descriptions);
case PORTFOLIO_OPTIONS -> repository.portfolioOptions(
tenantId, companyId, shortValue(data, "branchId"),
uuidValue(data, "portfolioReference"), descriptions);
default -> Flux.error(new ScopedDataException("Unsupported data scope"));
};
}
private String textValue(Map<String, Object> data, String name) {
String value = String.valueOf(data.getOrDefault(name, "")).trim();
if (value.isEmpty() || value.length() > 100 || !value.matches("[a-z0-9-]+")) {
throw new ScopedDataException(name + " is invalid");
}
return value;
}
private UUID uuidValue(Map<String, Object> data, String name) {
try {
return UUID.fromString(String.valueOf(data.get(name)));
} catch (RuntimeException exception) {
throw new ScopedDataException(name + " must be a valid UUID");
}
}
private short shortValue(Map<String, Object> data, String name) {
Object value = data.get(name);
try {
short result = value instanceof Number number
? number.shortValue() : Short.parseShort(String.valueOf(value));
if (result <= 0) throw new NumberFormatException();
return result;
} catch (RuntimeException exception) {
throw new ScopedDataException(name + " must be a positive number");
}
}
private List<String> descriptions(Map<String, Object> data) {
Object value = data.get("descriptions");
if (!(value instanceof List<?> values)) {
throw new ScopedDataException("descriptions must be a non-empty list");
}
List<String> result = values.stream()
.map(String::valueOf)
.map(String::trim)
.filter(text -> !text.isEmpty())
.map(text -> text.toUpperCase(Locale.ROOT))
.distinct()
.toList();
if (result.isEmpty() || result.size() > 20) {
throw new ScopedDataException("descriptions must contain between 1 and 20 values");
}
return result;
}
}

View File

@@ -38,6 +38,8 @@ public class CloudSecurityConfiguration {
.hasAuthority("SCOPE_identity.login")
.pathMatchers("/api/v1/queries/**")
.hasAuthority("SCOPE_identity.login")
.pathMatchers("/api/v1/platform/data")
.hasAuthority("SCOPE_identity.login")
.pathMatchers("/api/v1/admin/**")
.hasAuthority("SCOPE_cygnus.admin")
.anyExchange().authenticated())

View File

@@ -0,0 +1,38 @@
CREATE TABLE IF NOT EXISTS platform.report_definition (
report_key varchar(100) PRIMARY KEY,
report_title varchar(200) NOT NULL,
hide_leading_zero_columns boolean NOT NULL DEFAULT false,
enabled boolean NOT NULL DEFAULT true,
updated_at timestamptz NOT NULL DEFAULT current_timestamp
);
CREATE TABLE IF NOT EXISTS platform.report_column_definition (
report_key varchar(100) NOT NULL REFERENCES platform.report_definition(report_key) ON DELETE CASCADE,
column_key varchar(100) NOT NULL,
column_label varchar(100) NOT NULL,
display_order integer NOT NULL,
alignment varchar(10) NOT NULL DEFAULT 'left',
column_width integer NOT NULL DEFAULT 80,
is_visible boolean NOT NULL DEFAULT true,
is_totalled boolean NOT NULL DEFAULT false,
PRIMARY KEY (report_key, column_key)
);
INSERT INTO platform.report_definition(report_key, report_title, hide_leading_zero_columns)
VALUES ('hourly-mis', 'HOURLY MIS (EDP)', true)
ON CONFLICT (report_key) DO NOTHING;
INSERT INTO platform.report_column_definition
(report_key,column_key,column_label,display_order,alignment,column_width,is_visible,is_totalled)
VALUES ('hourly-mis','date','Date',0,'left',110,true,false),
('hourly-mis','total','Total',25,'center',70,true,true)
ON CONFLICT (report_key,column_key) DO NOTHING;
INSERT INTO platform.report_column_definition
(report_key,column_key,column_label,display_order,alignment,column_width,is_visible,is_totalled)
SELECT 'hourly-mis', 'hour'||hour, hour::text, hour+1, 'center', 55, true, true
FROM generate_series(0,23) hour
ON CONFLICT (report_key,column_key) DO NOTHING;
DELETE FROM platform.application_query
WHERE query_key = 'report-definition';

Binary file not shown.

View File

@@ -42,8 +42,9 @@ import org.springframework.stereotype.Service;
public class SwingInstallationWizard {
private static final String WELCOME = "welcome";
private static final String DATABASE = "database";
private static final String DEPLOYMENT = "deployment";
private static final String DETAILS = "details";
private static final String RUNTIME = "runtime";
private static final String INSTALLING = "installing";
private static final Color ACCENT = new Color(35, 97, 146);
private static final Color BACKGROUND = new Color(236, 243, 247);
@@ -68,7 +69,9 @@ public class SwingInstallationWizard {
private JPasswordField dockerPassword;
private JTextField outputDirectory;
private JTextField containerCloudServiceUrl;
private JTextField databaseUrl;
private JTextField databaseHost;
private JTextField databasePort;
private JTextField databaseName;
private JTextField databaseUsername;
private JPasswordField databasePassword;
private JTextField redisHost;
@@ -139,8 +142,9 @@ public class SwingInstallationWizard {
cardPanel = new JPanel(cards);
cardPanel.setBackground(BACKGROUND);
cardPanel.add(welcomePanel(), WELCOME);
cardPanel.add(databasePanel(), DATABASE);
cardPanel.add(deploymentPanel(), DEPLOYMENT);
cardPanel.add(detailsPanel(), DETAILS);
cardPanel.add(runtimePanel(), RUNTIME);
cardPanel.add(installingPanel(), INSTALLING);
root.add(cardPanel, BorderLayout.CENTER);
return root;
@@ -197,7 +201,8 @@ public class SwingInstallationWizard {
JPanel top = new JPanel(new BorderLayout());
top.setOpaque(false);
top.add(heading("Installation details"), BorderLayout.NORTH);
top.add(text("Enter the activation details supplied by Technobee."), BorderLayout.SOUTH);
top.add(text("Review and enter the activation details supplied by Technobee."),
BorderLayout.SOUTH);
panel.add(top, BorderLayout.NORTH);
JPanel form = new JPanel(new GridBagLayout());
@@ -209,6 +214,32 @@ public class SwingInstallationWizard {
licenseKey = new JPasswordField();
installationCode = new JTextField();
installationName = new JTextField();
int row = 0;
row = addField(form, row, "Client code", clientCode, null);
row = addField(form, row, "License key", licenseKey, null);
row = addField(form, row, "Installation code", installationCode, null);
addField(form, row, "Installation name", installationName, null);
panel.add(form, BorderLayout.CENTER);
JButton back = secondaryButton("Back");
back.addActionListener(event -> cards.show(cardPanel, DEPLOYMENT));
JButton install = primaryButton("Install");
install.addActionListener(event -> startInstallation());
panel.add(actions(back, install), BorderLayout.SOUTH);
return panel;
}
private JPanel deploymentPanel() {
JPanel panel = contentPanel();
panel.setLayout(new BorderLayout(0, 12));
JPanel top = new JPanel(new BorderLayout());
top.setOpaque(false);
top.add(heading("Docker and deployment"), BorderLayout.NORTH);
top.add(text("Configure the container image, registry and deployment location."),
BorderLayout.SOUTH);
panel.add(top, BorderLayout.NORTH);
JPanel form = formPanel();
containerCloudServiceUrl =
new JTextField(settings.containerCloudServiceUrl().toString());
containerCloudServiceUrl.setEditable(true);
@@ -220,10 +251,6 @@ public class SwingInstallationWizard {
outputDirectory = new JTextField(
settings.defaultOutputDirectory().toAbsolutePath().normalize().toString());
int row = 0;
row = addField(form, row, "Client code", clientCode, null);
row = addField(form, row, "License key", licenseKey, null);
row = addField(form, row, "Installation code", installationCode, null);
row = addField(form, row, "Installation name", installationName, null);
row = addField(
form,
row,
@@ -237,8 +264,11 @@ public class SwingInstallationWizard {
dockerImage,
null);
row = addField(form, row, "Docker registry", dockerRegistry, null);
row = addField(form, row, "Docker username", dockerUsername, null);
row = addField(form, row, "Docker password", dockerPassword, null);
row = addComponentField(
form,
row,
"Docker credentials",
credentialFields(dockerUsername, dockerPassword));
for (String field : profile.optionalInstallationFields()) {
JTextField input = new JTextField();
optionalFields.put(field, input);
@@ -254,31 +284,28 @@ public class SwingInstallationWizard {
panel.add(scroll, BorderLayout.CENTER);
JButton back = secondaryButton("Back");
back.addActionListener(event -> cards.show(cardPanel, WELCOME));
back.addActionListener(event -> cards.show(cardPanel, DATABASE));
JButton next = primaryButton("Next");
next.addActionListener(event -> cards.show(cardPanel, RUNTIME));
next.addActionListener(event -> cards.show(cardPanel, DETAILS));
panel.add(actions(back, next), BorderLayout.SOUTH);
return panel;
}
private JPanel runtimePanel() {
private JPanel databasePanel() {
JPanel panel = contentPanel();
panel.setLayout(new BorderLayout(0, 12));
JPanel top = new JPanel(new BorderLayout());
top.setOpaque(false);
top.add(heading("Runtime configuration"), BorderLayout.NORTH);
top.add(heading("Database and Redis"), BorderLayout.NORTH);
top.add(text("Configure the database and Redis services used by the "
+ profile.displayName() + " on-premises container."), BorderLayout.SOUTH);
panel.add(top, BorderLayout.NORTH);
JPanel form = new JPanel(new GridBagLayout());
form.setBackground(PANEL);
form.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(205, 217, 225)),
BorderFactory.createEmptyBorder(14, 16, 14, 16)));
databaseUrl = new JTextField("jdbc:postgresql://localhost:5432/matrix");
JPanel form = formPanel();
databaseHost = new JTextField("localhost");
databasePort = new JTextField("5432");
databaseName = new JTextField("matrix");
databaseUsername = new JTextField("postgres");
databasePassword = new JPasswordField();
redisHost = new JTextField("localhost");
@@ -287,9 +314,16 @@ public class SwingInstallationWizard {
cloudRequestTimeout = new JTextField("PT10S");
tokenRefreshSkew = new JTextField("PT30S");
int row = 0;
row = addField(form, row, "Database URL", databaseUrl, null);
row = addField(form, row, "Database username", databaseUsername, null);
row = addField(form, row, "Database password", databasePassword, null);
row = addComponentField(
form,
row,
"Database",
databaseConnectionFields());
row = addComponentField(
form,
row,
"Database credentials",
credentialFields(databaseUsername, databasePassword));
row = addField(form, row, "Redis host", redisHost, null);
row = addField(form, row, "Redis port", redisPort, null);
row = addField(form, row, "Redis password", redisPassword, null);
@@ -304,10 +338,10 @@ public class SwingInstallationWizard {
panel.add(form, BorderLayout.CENTER);
JButton back = secondaryButton("Back");
back.addActionListener(event -> cards.show(cardPanel, DETAILS));
JButton install = primaryButton("Install");
install.addActionListener(event -> startInstallation());
panel.add(actions(back, install), BorderLayout.SOUTH);
back.addActionListener(event -> cards.show(cardPanel, WELCOME));
JButton next = primaryButton("Next");
next.addActionListener(event -> cards.show(cardPanel, DEPLOYMENT));
panel.add(actions(back, next), BorderLayout.SOUTH);
return panel;
}
@@ -373,7 +407,7 @@ public class SwingInstallationWizard {
progressBar.setValue(0);
progressPercentage.setText("0%");
progressMessage.setText("Preparing installation");
cards.show(cardPanel, RUNTIME);
cards.show(cardPanel, DEPLOYMENT);
containerCloudServiceUrl.requestFocusInWindow();
});
@@ -415,8 +449,8 @@ public class SwingInstallationWizard {
button.setText("Check Docker and continue");
try {
get();
cards.show(cardPanel, DETAILS);
clientCode.requestFocusInWindow();
cards.show(cardPanel, DATABASE);
databaseHost.requestFocusInWindow();
} catch (Exception exception) {
showError(message(exception));
}
@@ -445,7 +479,12 @@ public class SwingInstallationWizard {
optionalValues(),
new RuntimeConfiguration(
containerCloudServiceUrl.getText(),
databaseUrl.getText(),
"jdbc:postgresql://"
+ databaseHost.getText().trim()
+ ":"
+ databasePort.getText().trim()
+ "/"
+ databaseName.getText().trim(),
databaseUsername.getText(),
new String(databaseSecret),
redisHost.getText(),
@@ -559,7 +598,9 @@ public class SwingInstallationWizard {
validateAbsoluteHttpUrl(
runtime.containerCloudServiceUrl(),
"Container cloud service URL");
if (runtime.databaseUrl().isBlank()
if (databaseHost.getText().isBlank()
|| databasePort.getText().isBlank()
|| databaseName.getText().isBlank()
|| runtime.databaseUsername().isBlank()
|| runtime.databasePassword().isBlank()) {
throw new IllegalArgumentException(
@@ -632,6 +673,95 @@ public class SwingInstallationWizard {
return row + 1;
}
private int addComponentField(
JPanel form,
int row,
String label,
Component input) {
GridBagConstraints labelConstraints = constraints(0, row);
labelConstraints.weightx = 0;
labelConstraints.fill = GridBagConstraints.NONE;
labelConstraints.anchor = GridBagConstraints.LINE_START;
JLabel fieldLabel = new JLabel(label);
fieldLabel.setFont(fieldLabel.getFont().deriveFont(Font.BOLD, 12f));
form.add(fieldLabel, labelConstraints);
GridBagConstraints inputConstraints = constraints(1, row);
inputConstraints.weightx = 1;
inputConstraints.fill = GridBagConstraints.HORIZONTAL;
form.add(input, inputConstraints);
return row + 1;
}
private JPanel formPanel() {
JPanel form = new JPanel(new GridBagLayout());
form.setBackground(PANEL);
form.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createLineBorder(new Color(205, 217, 225)),
BorderFactory.createEmptyBorder(14, 16, 14, 16)));
return form;
}
private JPanel databaseConnectionFields() {
JPanel fields = inlineFieldsPanel();
addInlineField(fields, databaseHost, 0, 0.50);
addInlineSeparator(fields, ":", 1);
addInlineField(fields, databasePort, 2, 0.15);
addInlineSeparator(fields, "/", 3);
addInlineField(fields, databaseName, 4, 0.35);
databaseHost.setToolTipText("Database host");
databasePort.setToolTipText("Database port");
databaseName.setToolTipText("Database name");
return fields;
}
private JPanel credentialFields(JTextField username, JTextField password) {
JPanel fields = inlineFieldsPanel();
addInlineLabel(fields, "Username", 0);
addInlineField(fields, username, 1, 0.5);
addInlineLabel(fields, "Password", 2);
addInlineField(fields, password, 3, 0.5);
return fields;
}
private JPanel inlineFieldsPanel() {
JPanel fields = new JPanel(new GridBagLayout());
fields.setOpaque(false);
return fields;
}
private void addInlineField(
JPanel panel,
JTextField field,
int column,
double weight) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = column;
constraints.weightx = weight;
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.insets = new Insets(0, column == 0 ? 0 : 5, 0, 0);
field.setPreferredSize(new Dimension(120, 29));
panel.add(field, constraints);
}
private void addInlineLabel(JPanel panel, String text, int column) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = column;
constraints.weightx = 0;
constraints.insets = new Insets(0, column == 0 ? 0 : 12, 0, 5);
JLabel label = new JLabel(text);
label.setForeground(new Color(75, 88, 99));
panel.add(label, constraints);
}
private void addInlineSeparator(JPanel panel, String text, int column) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = column;
constraints.weightx = 0;
constraints.insets = new Insets(0, 5, 0, 0);
panel.add(new JLabel(text), constraints);
}
private GridBagConstraints constraints(int column, int row) {
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = column;
@@ -664,6 +794,7 @@ public class SwingInstallationWizard {
JLabel label = new JLabel(value);
label.setFont(label.getFont().deriveFont(Font.BOLD, 19f));
label.setForeground(new Color(35, 48, 58));
label.setAlignmentX(Component.LEFT_ALIGNMENT);
return label;
}
@@ -677,6 +808,7 @@ public class SwingInstallationWizard {
private JPanel summaryRow(String label, String value) {
JPanel row = new JPanel(new BorderLayout(18, 0));
row.setOpaque(false);
row.setAlignmentX(Component.LEFT_ALIGNMENT);
row.setBorder(BorderFactory.createEmptyBorder(7, 0, 7, 0));
JLabel name = new JLabel(label);
name.setPreferredSize(new Dimension(130, 20));
@@ -691,7 +823,8 @@ public class SwingInstallationWizard {
JPanel row = new JPanel(new BorderLayout(18, 0));
row.setOpaque(false);
row.setAlignmentX(Component.LEFT_ALIGNMENT);
row.setMaximumSize(new Dimension(Integer.MAX_VALUE, 34));
row.setBorder(BorderFactory.createEmptyBorder(7, 0, 7, 0));
row.setMaximumSize(new Dimension(Integer.MAX_VALUE, 42));
JLabel name = new JLabel(label);
name.setFont(name.getFont().deriveFont(Font.BOLD));
name.setPreferredSize(new Dimension(130, 28));

View File

@@ -23,6 +23,7 @@ public class TechnobeeServiceInstallerApplication implements CommandLineRunner {
}
public static void main(String[] args) {
disableAccidentalSpringDebug(args);
SpringApplication application =
new SpringApplication(TechnobeeServiceInstallerApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
@@ -39,6 +40,18 @@ public class TechnobeeServiceInstallerApplication implements CommandLineRunner {
}
}
static void disableAccidentalSpringDebug(String[] args) {
boolean debugRequested = Arrays.stream(args)
.anyMatch(argument -> "--debug".equals(argument)
|| "--debug=true".equalsIgnoreCase(argument));
if (!debugRequested && System.getProperty("debug") == null) {
// DEBUG is commonly exported by developer tools with non-boolean
// values. Spring maps it to its own debug switch unless a more
// specific system property is present.
System.setProperty("debug", "false");
}
}
@Override
public void run(String... args) {
boolean cli = Arrays.asList(args).contains("--cli");

View File

@@ -0,0 +1,29 @@
package com.cygnus.installer;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
class TechnobeeServiceInstallerApplicationTest {
@AfterEach
void clearDebugProperty() {
System.clearProperty("debug");
}
@Test
void disablesDebugUnlessExplicitlyRequested() {
TechnobeeServiceInstallerApplication.disableAccidentalSpringDebug(new String[0]);
assertThat(System.getProperty("debug")).isEqualTo("false");
}
@Test
void preservesExplicitDebugRequest() {
TechnobeeServiceInstallerApplication.disableAccidentalSpringDebug(
new String[] {"--debug"});
assertThat(System.getProperty("debug")).isNull();
}
}

View File

@@ -42,6 +42,15 @@ public enum ApplicationMessage {
"The application details were saved successfully.", ""),
APPLICATIONS_LOADED(200, "APP-2002", "Applications loaded",
"The application records were loaded successfully.", ""),
DEDUPE_CHECK_COMPLETED(200, "DDP-2001", "Dedupe check completed",
"The dedupe check completed successfully.", ""),
DEDUPE_CHECK_FAILED(500, "DDP-5001", "Dedupe check failed",
"Cygnus could not complete the dedupe check.",
"Try again. If the issue continues, contact support."),
DEDUPE_DETAILS_LOADED(200, "DDP-2002", "Dedupe details loaded",
"Matching records were loaded successfully.", ""),
DEDUPE_DETAILS_SAVED(200, "DDP-2003", "Dedupe details saved",
"Dedupe remarks were saved successfully.", ""),
APPLICATION_LOAD_FAILED(500, "APP-5002", "Applications could not be loaded",
"Cygnus could not load the application details.",
"Try again. If the issue continues, share the reference ID with support."),

View File

@@ -0,0 +1,16 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class Allocation {
private List<CutOffRecord> allocationlist = new ArrayList<>();
private String allocTime;
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
}

View File

@@ -0,0 +1,13 @@
package lib.models;
import lombok.Data;
@Data
public class CaseGrid {
private String errMsg;
private String errDesc;
private String errCode;
private boolean processFlag;
private String portfolioId;
private String caseID;
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class CutOffList {
private List<CutOffRecord> cofflist = new ArrayList<>();
private String cutoffTime;
private String batch;
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
}

View File

@@ -0,0 +1,41 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class CutOffRecord {
private List<CutOffRecord> sublist = new ArrayList<>();
private String portfolioid;
private String portname;
private String customername;
private String apptype;
private String mvcode;
private String applno;
private boolean allocation;
private boolean sms;
private boolean telesheet;
private boolean earlier;
private boolean negative;
private int islocked;
private String lockedby;
private boolean docut;
private int ischanged;
private int totrv;
private int totov;
private int totpv;
private int totrtv;
private int tototv;
private int totref;
private boolean tv;
private boolean oprsend;
private String resiloc;
private String offloc;
private String proploc;
private String uuid;
private String repformat;
private String repfunction;
private String message;
private String portgroup;
}

View File

@@ -0,0 +1,13 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class CutoffPending {
private List<CutoffPendingRecord> pendingList = new ArrayList<>();
private String errMsg;
private String errCode = "1010";
private boolean processFlag;
}

View File

@@ -0,0 +1,20 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class CutoffPendingRecord {
private List<CutoffPendingRecord> sublist = new ArrayList<>();
private String cutoffTime;
private int total;
private String uuid;
private String portfolio;
private String customerName;
private boolean allocation;
private boolean telesheet;
private boolean earlier;
private boolean negative;
private boolean cutoff;
}

View File

@@ -0,0 +1,21 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class DedupeBatch {
private List<DedupeCase> cases = new ArrayList<>();
private String cutoffKey;
private String cutoffon;
private int totalAddresses;
private int totalCases;
private int islocked;
private String lockedby;
private Integer lockOwnerId;
}

View File

@@ -0,0 +1,22 @@
package lib.models;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class DedupeCase {
private String mvcode;
private String applno;
private String customername;
private String apptype;
private String uuid;
private int totrv;
private int totov;
private int totpv;
private String earlier;
private String negative;
private String lockedby;
}

View File

@@ -0,0 +1,20 @@
package lib.models;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class DedupeCaseSummary {
private String documentCaseId;
private Integer portfolioId;
private String mvCode;
private String fileNumber;
private String customerName;
private String applicationType;
private int residenceVisits;
private int officeVisits;
private int propertyVisits;
private String receivedOn;
private String done;
}

View File

@@ -0,0 +1,3 @@
package lib.models;
public record DedupeCheckData(String documentCaseId, int operation) { }

View File

@@ -0,0 +1,3 @@
package lib.models;
public record DedupeCheckRequest(String documentCaseId, int operation) { }

View File

@@ -0,0 +1,20 @@
package lib.models;
import lombok.Data;
@Data
public class DedupeDetails {
private String sessuuid;
private String uuid;
private String mvcode;
private String customername;
private String dob;
private String mobile;
private String resiaddress;
private String offaddress;
private String resiphone;
private String offphone;
private String earremarks;
private String negremarks;
private String category;
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import lombok.Data;
@Data
public class DedupeMatchRecord {
private String dedupeType;
private String foundOn;
private String remarks;
private String customerName;
private String dob;
private String residenceAddress;
private String officeAddress;
private String residencePhone;
private String officePhone;
private String mobile;
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class DedupeRun {
private List<DedupeBatch> batches = new ArrayList<>();
private String dedcutTime;
private String errMsg;
private String csrfToken;
}

View File

@@ -0,0 +1,21 @@
package lib.models;
import lombok.Data;
@Data
public class DedupeSendCase {
private String uuid;
private String mvcode;
private String applno;
private String customername;
private String apptype;
private String product;
private String earlier;
private String negative;
private String deduperunon;
private String bkbranchname;
private String fid;
private int dqid;
private String portname;
private String supervisor;
}

View File

@@ -0,0 +1,16 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class DedupeWorkspace {
private Integer portfolioId;
private List<Option> portfolios = new ArrayList<>();
private List<DedupeCaseSummary> cases = new ArrayList<>();
}

View File

@@ -0,0 +1,49 @@
package lib.models;
import java.time.LocalDate;
import java.util.Arrays;
public final class HourlyMisRecord {
private final long userId;
private final String displayName;
private final LocalDate receivedDate;
private final int[] hours = new int[24];
public HourlyMisRecord(long userId, String displayName, LocalDate receivedDate) {
this.userId = userId;
this.displayName = displayName;
this.receivedDate = receivedDate;
}
public long getUserId() { return userId; }
public String getDisplayName() { return displayName; }
public LocalDate getReceivedDate() { return receivedDate; }
public int getHour(int hour) { return hours[hour]; }
public void addCases(int hour, int cases) { hours[hour] += cases; }
public int getTotal() { return Arrays.stream(hours).sum(); }
public int getHour00() { return hours[0]; }
public int getHour01() { return hours[1]; }
public int getHour02() { return hours[2]; }
public int getHour03() { return hours[3]; }
public int getHour04() { return hours[4]; }
public int getHour05() { return hours[5]; }
public int getHour06() { return hours[6]; }
public int getHour07() { return hours[7]; }
public int getHour08() { return hours[8]; }
public int getHour09() { return hours[9]; }
public int getHour10() { return hours[10]; }
public int getHour11() { return hours[11]; }
public int getHour12() { return hours[12]; }
public int getHour13() { return hours[13]; }
public int getHour14() { return hours[14]; }
public int getHour15() { return hours[15]; }
public int getHour16() { return hours[16]; }
public int getHour17() { return hours[17]; }
public int getHour18() { return hours[18]; }
public int getHour19() { return hours[19]; }
public int getHour20() { return hours[20]; }
public int getHour21() { return hours[21]; }
public int getHour22() { return hours[22]; }
public int getHour23() { return hours[23]; }
}

View File

@@ -0,0 +1,12 @@
package lib.models;
import lombok.Data;
@Data
public class PhotoCases {
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class ReferenceSheet {
private List<CutOffRecord> tvrlist = new ArrayList<>();
private String teleSheetTime;
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
private String telePDFLink;
}

View File

@@ -0,0 +1,6 @@
package lib.models;
public record ReportColumnDefinition(
String columnKey, String label, int displayOrder, String alignment,
int width, boolean visible, boolean totalled) {
}

View File

@@ -0,0 +1,8 @@
package lib.models;
import java.util.List;
public record ReportDefinition(
String reportKey, String title, boolean hideLeadingZeroColumns,
List<ReportColumnDefinition> columns) {
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class SendDedupe {
private Integer portfolioid;
private String portname;
private String supervisor;
private int dqid;
private String fid;
private List<DedupeSendCase> caselist = new ArrayList<>();
private String suuid;
private String uuids;
}

View File

@@ -0,0 +1,16 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class SendToOperation {
private List<CutOffRecord> caselist = new ArrayList<>();
private String sendTime;
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
}

View File

@@ -0,0 +1,17 @@
package lib.models;
import java.util.ArrayList;
import java.util.List;
import lombok.Data;
@Data
public class Telesheet {
private List<CutOffRecord> tvrlist = new ArrayList<>();
private String teleSheetTime;
private String errMsg;
private String errDesc;
private String errCode;
private String sessUUID;
private boolean processFlag;
private String telePDFLink;
}

View File

@@ -9,12 +9,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -27,7 +28,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=4" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -41,13 +42,14 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1200px">
<form:form method="post" name="allocation" id="allocation" modelAttribute="allocation" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/alloc.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Allocation</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('allocation','_parent','allocation')"/>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="return submitCutoffForm('allocation','allocation')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -172,8 +174,9 @@
</table>
</div>
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitAllocation('allocation');" />
<form:hidden path="SessUUID" value="${allocation.getSessUUID()}"/>
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitAllocation('allocation');" />
</div>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
@@ -187,7 +190,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty allocation.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${allocation.getErrMsg()}',5000,200,300); </script>
<script>CygnusNotifications.showLegacy('${allocation.getErrMsg()}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -10,12 +10,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -28,7 +29,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=3" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -42,20 +43,23 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1100px">
<form:form method="post" name="cutOff" id="cutOff" modelAttribute="cutOff" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/cutlist.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Cut-Off List</span>
<div class="divselect" id="divbatch" style="width:85px;position:absolute;top:3px;right:30px;">
<div class="matrix-cutoff-title-actions">
<div class="divselect" id="divbatch">
<form:select path="Batch" multiple="false" id="batchlist" style="width:103px" onblur="validate(this,'t','');">
<form:option value="-1" label="BATCH" selected="true"/>
<form:option value="AM" label="AM" />
<form:option value="PM" label="PM" />
</form:select>
</div>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('cutoff','_parent','cutOff')"/>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="return submitCutoffForm('cutOff','cutoff')"/>
</div>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -88,7 +92,9 @@
<form:checkbox path="cofflist[${mystatus.index}].sms" id="sms${mystatus.count}" value="true" />
</td>
<td align="center">
<form:checkbox path="cofflist[${mystatus.index}].telesheet" id="ts${mystatus.count}" value="true" />
<form:checkbox path="cofflist[${mystatus.index}].telesheet" id="ts${mystatus.count}" value="true"
disabled="${record.totrtv le 0 and record.tototv le 0}"
title="${record.totrtv le 0 and record.tototv le 0 ? 'Tele-Sheet requires RTV or OTV' : ''}" />
</td>
<td align="center">
<form:checkbox path="cofflist[${mystatus.index}].earlier" id="ear${mystatus.count}" value="true" />
@@ -114,9 +120,10 @@
</table>
</div>
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitCutOff('cutOff');" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitCutOff('cutOff');" />
</div>
<form:hidden path="CutoffTime" value="${cutOff.getCutoffTime()}"/>
<form:hidden path="SessUUID" value="${cutOff.getSessUUID()}"/>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
@@ -130,7 +137,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty cutOff.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${cutOff.getErrMsg()}',3000,200,300); </script>
<script>CygnusNotifications.showLegacy('${fn:escapeXml(cutOff.getErrMsg())}');</script>
</c:if>
<!-- -->
<script>

View File

@@ -0,0 +1,98 @@
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" session="true" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Cygnus 1.0 | Cut-Off Pending</title>
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet">
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet">
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet">
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet">
<link href="/matrix/css/cutoff-workflows-v1.css?v=4" rel="stylesheet">
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet">
<script src="/matrix/js/lib/notifications.js?ver=1"></script>
<script src="/matrix/js/edp/cutoff/cutoff-pending.js?v=1" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
</head>
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-cutoff-workflow matrix-cutoff-pending">
<div id="PageFrame">
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<main id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" id="cutoffpending" modelAttribute="cutoffpending">
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"></c:if>
<section>
<header class="title">
<img class="matrix-title-icon" src="/matrix/images/cutlist.png" alt="">
<span class="matrix-title-text">Cut-Off Pending</span>
<button type="button" class="matrix-title-action matrix-icon-button" title="Refresh grid"
aria-label="Refresh grid" data-action="refresh">
<img src="/matrix/images/reload.png" alt="">
</button>
</header>
<div class="tableContainer">
<table id="cutlist">
<thead class="thead"><tr>
<th>S.No</th><th>Cut-Off Time</th><th>Allocation</th><th>Tele-Sheet</th>
<th>Earlier</th><th>Negative</th><th>Cut-Off</th>
</tr></thead>
<tbody>
<c:forEach items="${cutoffpending.pendingList}" var="record" varStatus="parentStatus">
<tr class="matrix-parent-row" data-parent-index="${parentStatus.index}">
<td>${parentStatus.count}</td>
<td>
<form:hidden path="pendingList[${parentStatus.index}].cutoffTime"/>
<form:hidden path="pendingList[${parentStatus.index}].total"/>
<button type="button" class="matrix-row-toggle" data-action="toggle" aria-expanded="false">
<span class="matrix-row-toggle__chevron">&#9654;</span>
<span>${fn:escapeXml(record.cutoffTime)} <strong>(${record.total})</strong></span>
</button>
</td>
<td><form:checkbox path="pendingList[${parentStatus.index}].allocation" data-parent-field="allocation"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].telesheet" data-parent-field="telesheet"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].earlier" data-parent-field="earlier"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].negative" data-parent-field="negative"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].cutoff" data-parent-field="cutoff"/></td>
</tr>
<tr class="matrix-expanded-row" data-child-row="${parentStatus.index}" hidden>
<td colspan="7">
<table class="matrix-nested-table">
<thead><tr>
<th>S.No</th><th>Portfolio</th><th>Customer Name</th><th>Allocation</th>
<th>Tele-Sheet</th><th>Earlier</th><th>Negative</th><th>Cut-Off</th>
</tr></thead>
<tbody>
<c:forEach items="${record.sublist}" var="child" varStatus="childStatus">
<tr data-child-index="${childStatus.index}">
<td>${childStatus.count}</td>
<td><form:hidden path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].uuid"/>${fn:escapeXml(child.portfolio)}</td>
<td>${fn:escapeXml(child.customerName)}</td>
<td><form:checkbox path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].allocation" data-child-field="allocation"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].telesheet" data-child-field="telesheet"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].earlier" data-child-field="earlier"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].negative" data-child-field="negative"/></td>
<td><form:checkbox path="pendingList[${parentStatus.index}].sublist[${childStatus.index}].cutoff" data-child-field="cutoff"/></td>
</tr>
</c:forEach>
<c:if test="${empty record.sublist}"><tr><td colspan="8" class="matrix-empty-row">No records found.</td></tr></c:if>
</tbody>
</table>
</td>
</tr>
</c:forEach>
<c:if test="${empty cutoffpending.pendingList}"><tr><td colspan="7" class="matrix-empty-row">No pending cut-offs found.</td></tr></c:if>
</tbody>
</table>
</div>
</section>
<c:if test="${not empty cutoffpending.pendingList}">
<footer class="matrix-workflow-actions"><button type="button" class="button" data-action="save">Save</button></footer>
</c:if>
</form:form>
</main>
</div>
<c:if test="${not empty cutoffpending.errMsg}"><script>CygnusNotifications.showLegacy('${fn:escapeXml(cutoffpending.errMsg)}');</script></c:if>
</body>
</html>

View File

@@ -9,11 +9,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/excel.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -40,6 +41,7 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="pcases" id="pcases" modelAttribute="pcases" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<div id="TablePanel" class="tableContainer">
<table border="0" cellspacing="0" width="100%" id="cutlist">
<thead class="thead">
@@ -111,7 +113,9 @@
</table>
</div>
<!-- <input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Upload & Update" id="btnsave" accesskey="S" onclick="return FinalizePhotoCase();" /> -->
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Upload & Update" id="btnsave" accesskey="S" onclick="return SendToMnimble();" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Upload & Update" id="btnsave" accesskey="S" onclick="return SendToMnimble();" />
</div>
<input type="hidden" value="${Sessvals.getUserID()}" id="usid"/>
</form:form>
</div>
@@ -124,7 +128,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty msg}">
<script language="javascript" type="text/javascript"> CallMessage('${msg}',3000,200,300); </script>
<script>CygnusNotifications.showLegacy('${msg}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -9,11 +9,12 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/excel.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -40,6 +41,7 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="pcases" id="pcases" modelAttribute="pcases" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<div id="TablePanel" class="tableContainer">
<table border="0" cellspacing="0" width="100%" id="cutlist">
<thead class="thead">
@@ -100,8 +102,10 @@
</tbody>
</table>
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return FinalizePhotoCase();" />
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Generate" id="btnexcel" accesskey="G" onclick="tableToExcel(document.getElementsByTagName('table'),'sheet1')" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Save" id="btnsave" accesskey="S" onclick="return FinalizePhotoCase();" />
<input type="button" class="button" name="btnsave" value="Generate" id="btnexcel" accesskey="G" onclick="tableToExcel(document.getElementsByTagName('table'),'sheet1')" />
</div>
<input type="hidden" value="${Sessvals.getUserID()}" id="usid"/>
</form:form>
</div>
@@ -114,7 +118,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty msg}">
<script language="javascript" type="text/javascript"> CallMessage('${msg}',3000,200,300); </script>
<script>CygnusNotifications.showLegacy('${msg}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -9,13 +9,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/allocation.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -28,7 +28,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=4" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -42,13 +42,14 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1200px">
<form:form method="post" name="refsheet" id="refsheet" modelAttribute="refsheet" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/telesheet.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Reference-Verification Sheet</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('refsheet','_parent','refsheet')"/>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="return submitCutoffForm('refsheet','refsheet')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -162,8 +163,9 @@
</c:if>
<!-- -->
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Generate" id="btnsave" accesskey="S" onclick="return ValidateSubmitRefsheet('refsheet');" />
<form:hidden path="SessUUID" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Generate" id="btnsave" accesskey="S" onclick="return ValidateSubmitRefsheet('refsheet');" />
</div>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
@@ -177,7 +179,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty refsheet.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${telesheet.getErrMsg()}',3000,200,300); </script>
<script>CygnusNotifications.showLegacy('${refsheet.getErrMsg()}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -9,12 +9,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -27,7 +28,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=4" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -41,13 +42,14 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1200px">
<form:form method="post" name="sendtoopr" id="sendtoopr" modelAttribute="sendtoopr" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/oprupd.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Send To Operation</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('sendtoopr','_parent','sendtoopr')"/>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="return submitCutoffForm('sendtoopr','sendtoopr')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -192,8 +194,9 @@
</table>
</div>
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitSopr('sendtoopr');" />
<form:hidden path="SessUUID" value="${sendtoopr.getSessUUID()}"/>
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Save" id="btnsave" accesskey="S" onclick="return ValidateSubmitSopr('sendtoopr');" />
</div>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
@@ -207,7 +210,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty sendtoopr.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${sendtoopr.getErrMsg()}',5000,200,300); </script>
<script>CygnusNotifications.showLegacy('${sendtoopr.getErrMsg()}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -9,13 +9,13 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/allocation.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -28,7 +28,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/cutoff-workflows-v1.css?v=4" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -42,13 +42,14 @@
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1200px">
<form:form method="post" name="telesheet" id="telesheet" modelAttribute="telesheet" >
<c:if test="${not empty _csrf}"><input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /></c:if>
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/telesheet.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Tele-Verification Sheet</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('telesheet','_parent','telesheet')"/>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="return submitCutoffForm('telesheet','telesheet')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -178,8 +179,9 @@
</c:if>
<!-- -->
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Generate" id="btnsave" accesskey="S" onclick="return ValidateSubmitTelesheet('telesheet');" />
<form:hidden path="SessUUID" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btnsave" value="Generate" id="btnsave" accesskey="S" onclick="return ValidateSubmitTelesheet('telesheet');" />
</div>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
@@ -193,7 +195,7 @@
<!-- -->
<!-- Process Message -->
<c:if test="${not empty telesheet.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${telesheet.getErrMsg()}',3000,200,300); </script>
<script>CygnusNotifications.showLegacy('${telesheet.getErrMsg()}');</script>
</c:if>
<!-- -->
</html>

View File

@@ -1,112 +1,85 @@
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@page language="java" session="true" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/dedupedo.js" type="text/javascript"></script>
<link href="/matrix/css/div.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/select.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/table.css" rel="stylesheet" type="text/css" />
<title>Cygnus 1.0 | Dedupe Do</title>
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
<meta charset="UTF-8">
<title>Cygnus 1.0 | Dedupe</title>
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet">
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet">
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet">
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet">
<link href="/matrix/css/dedupe-workflows-v1.css?v=12" rel="stylesheet">
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet">
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet">
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<script src="/matrix/js/edp/dedupe/dedupe-do.js?v=2" defer></script>
</head>
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-dedupe-workflow">
<div id='PageFrame'>
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="caseGrid" id="caseGrid" modelAttribute="caseGrid" >
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/commondet.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">List of Cases</span>
<div class="divselect" id="divportfolio" style="width:167px;position:absolute;top:3px;right:30px;">
<form:select path="PortfolioId" multiple="false" id="portlist" style="width:185px" onchange="SubmitForm('dedupecaselist','_parent','caseGrid')">
<form:option value="-1" label="SELECT PORTFOLIO" selected="true"/>
<c:forEach items="${portlist}" var="port">
<form:option value="${port[0]}" label="${port[1]}" />
</c:forEach>
</form:select>
</div>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('dedupecaselist','_parent','caseGrid')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
<table border="0" cellspacing="0" width="100%" id="casetable">
<thead class="thead">
<tr title="Row Title">
<td>S.No</td>
<td>MV Code</td>
<td>File No.</td>
<td>Customer Name</td>
<td>Type</td>
<td>RV</td>
<td>OV</td>
<td>PV</td>
<td>Received Date</td>
<td>Done</td>
<td></td>
</tr>
</thead>
<tbody class="scrollContent">
<c:forEach items="${caseList}" var="casedet" varStatus="status">
<tr id="row${status.count}">
<td>
<input type="hidden" name="uuid" id="row${status.count}uuid" value="${casedet[0]}" />
<input type="hidden" name="portid" id="row${status.count}portid" value="${casedet[1]}" />
${status.count}</td>
<td>${casedet[2]}</td>
<td>${casedet[3]}</td>
<td>${casedet[4]}</td>
<td>${casedet[5]}</td>
<td>${casedet[6]}</td>
<td>${casedet[7]}</td>
<td>${casedet[8]}</td>
<td>${casedet[9]}</td>
<td>${casedet[10]}</td>
<td id="row${status.count}col"></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</form:form>
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-dedupe-workflow"
data-context-path="${pageContext.request.contextPath}">
<div id="PageFrame">
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<main id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" action="${pageContext.request.contextPath}/ver/dedupecaselist"
id="dedupeWorkspace" modelAttribute="dedupeWorkspace">
<section class="matrix-dedupe-worklist">
<header class="title matrix-dedupe-worklist__header">
<span class="matrix-dedupe-worklist__heading">
<img class="matrix-title-icon" src="/matrix/images/commondet.png" alt="">
<span class="matrix-title-text">Dedupe Cases</span>
</span>
<span class="matrix-dedupe-worklist__actions">
<form:select path="portfolioId" id="portfolioId"
cssClass="form-select form-select-sm matrix-dedupe-worklist__portfolio"
aria-label="Portfolio">
<form:option value="-1" label="SELECT PORTFOLIO" />
<c:forEach items="${dedupeWorkspace.portfolios}" var="portfolio">
<form:option value="${portfolio.value}" label="${portfolio.label}" />
</c:forEach>
</form:select>
<button type="submit" class="matrix-dedupe-worklist__refresh"
title="Refresh cases" aria-label="Refresh cases">
<img src="/matrix/images/reload.png" alt="">
</button>
</span>
</header>
<div class="table-responsive matrix-dedupe-worklist__table-wrap">
<table class="table table-sm align-middle mb-0" id="dedupeCaseTable">
<thead>
<tr>
<th>S.No</th><th>MV Code</th><th>File No.</th><th>Customer Name</th>
<th>Type</th><th class="text-center">RV</th><th class="text-center">OV</th>
<th class="text-center">PV</th><th>Received On</th><th>Done</th>
</tr>
</thead>
<tbody>
<c:forEach items="${dedupeWorkspace.cases}" var="caseItem" varStatus="status">
<tr class="matrix-dedupe-worklist__row" tabindex="0"
data-case-id="${caseItem.documentCaseId}"
title="Open dedupe details">
<td>${status.count}</td><td>${caseItem.mvCode}</td>
<td>${caseItem.fileNumber}</td><td>${caseItem.customerName}</td>
<td>${caseItem.applicationType}</td>
<td class="text-center">${caseItem.residenceVisits}</td>
<td class="text-center">${caseItem.officeVisits}</td>
<td class="text-center">${caseItem.propertyVisits}</td>
<td>${caseItem.receivedOn}</td><td>${caseItem.done}</td>
</tr>
</c:forEach>
<c:if test="${dedupeWorkspace.portfolioId gt 0 and empty dedupeWorkspace.cases}">
<tr><td colspan="10" class="matrix-dedupe-worklist__empty">No cases found.</td></tr>
</c:if>
</tbody>
</table>
</div>
</section>
</form:form>
</main>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
InitPage();
</script>
<!-- -->
<!-- Process Message -->
<c:if test="${not empty caseGrid.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${caseGrid.getErrMsg()}',3000,200,300); </script>
</c:if>
<!-- -->
</html>

View File

@@ -12,10 +12,9 @@
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/progressbar.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/deduperun.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/dedupe/dedupe-run.js?ver=1" type="text/javascript" defer></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
@@ -28,7 +27,7 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=12" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
@@ -39,16 +38,16 @@
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-dedupe-workflow">
<div id='PageFrame'>
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<%-- Shared shell owns the authenticated user menu. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1200px">
<form:form method="post" name="deduperun" id="deduperun" modelAttribute="dedupeRun" >
<input type="hidden" name="curu" id="curu" value="${Sessvals.getUserID()}" />
<input type="hidden" id="dedupe-csrf-token" value="${dedupeRun.csrfToken}" />
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/dedupe.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Dedupe Run</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('rundedupe','_parent','deduperun')"/>
<div class="title matrix-dedupe-run__title">
<img class="matrix-title-icon" src="/matrix/images/dedupe.png" alt="" />
<span class="matrix-title-text">Dedupe Run</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" alt="" title="Refresh Grid" onclick="SubmitForm('rundedupe','_parent','deduperun')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -63,28 +62,28 @@
</tr>
</thead>
<tbody class="scrollContent">
<c:forEach items="${dedupeRun.dedupelist}" var="record" varStatus="mystatus">
<c:forEach items="${dedupeRun.batches}" var="record" varStatus="mystatus">
<tr title="${record.lockedby}">
<td>${mystatus.count}</td>
<td id="parent${mystatus.count}" onclick="ExpandList(this.id)" >
<form:hidden path="dedupelist[${mystatus.index}].lockedby" id="locby${mystatus.count}" value="${status.value}"/>
<form:hidden path="dedupelist[${mystatus.index}].cutoffon" id="cuttime${mystatus.count}" value="${status.value}"/>
<form:hidden path="batches[${mystatus.index}].lockedby" id="locby${mystatus.count}"/>
<form:hidden path="batches[${mystatus.index}].cutoffon" id="cuttime${mystatus.count}"/>
<span class="customLink" style="cursor:pointer">${record.cutoffon}</span>
</td>
<td align="center">
<form:hidden path="dedupelist[${mystatus.index}].totaddr" id="totaddr${mystatus.count}" value="${status.value}"/>${record.totaddr}
<form:hidden path="batches[${mystatus.index}].totalAddresses" id="totaddr${mystatus.count}"/>${record.totalAddresses}
</td>
<td align="center">
<form:hidden path="dedupelist[${mystatus.index}].totcase" id="totcase${mystatus.count}" value="${status.value}"/>${record.totcase}
<form:hidden path="batches[${mystatus.index}].totalCases" id="totcase${mystatus.count}"/>${record.totalCases}
</td>
<td align="center">
<form:hidden path="dedupelist[${mystatus.index}].islocked" id="locked${mystatus.count}" value="${status.value}" />
<form:hidden path="batches[${mystatus.index}].islocked" id="locked${mystatus.count}"/>
<c:choose>
<c:when test="${record.islocked gt 0}">
<img src="/matrix/images/locked.png"/>
</c:when>
<c:otherwise>
<input type="button" id="btndedupe" class="button" value="Run Earlier & Negative" onclick="showDedupePanel('cutlist${mystatus.count}')" />
<button type="button" class="btn btn-primary btn-sm js-run-dedupe" data-table="cutlist${mystatus.count}">Run Earlier &amp; Negative</button>
</c:otherwise>
</c:choose>
</td>
@@ -112,38 +111,39 @@
</tr>
</thead>
<tbody class="scrollContent">
<c:forEach items="${record.sublist}" var="record1" varStatus="mystatus1">
<tr title="${record1.lockedby}child" id="row${mystatus1.count}${mystatus.count}">
<c:forEach items="${record.cases}" var="record1" varStatus="mystatus1">
<tr title="${record1.lockedby}child" id="row${mystatus1.count}${mystatus.count}"
data-document-case-id="${record1.uuid}" data-earlier="${record1.earlier}" data-negative="${record1.negative}">
<td>${mystatus1.count}</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].lockedby" id="locby${mystatus1.count}child" value="${status.value}"/>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].mvcode" id="mvcode${mystatus1.count}child" value="${status.value}"/>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].uuid" id="uuid${mystatus1.count}${mystatus.count}" value="${status.value}"/>
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].lockedby" id="locby${mystatus1.count}child"/>
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].mvcode" id="mvcode${mystatus1.count}child"/>
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].uuid" id="uuid${mystatus1.count}${mystatus.count}"/>
<span>${record1.mvcode}</span>
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].applno" id="applno${mystatus1.count}child" value="${status.value}"/>${record1.applno}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].applno" id="applno${mystatus1.count}child"/>${record1.applno}
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].customername" id="cname${mystatus1.count}child" value="${status.value}"/>${record1.customername}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].customername" id="cname${mystatus1.count}child"/>${record1.customername}
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].apptype" id="ctype${mystatus1.count}child" value="${status.value}"/>${record1.apptype}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].apptype" id="ctype${mystatus1.count}child"/>${record1.apptype}
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].totrv" id="totrv${mystatus1.count}child" value="${status.value}"/>${record1.totrv}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].totrv" id="totrv${mystatus1.count}child"/>${record1.totrv}
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].totov" id="totov${mystatus1.count}child" value="${status.value}"/>${record1.totov}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].totov" id="totov${mystatus1.count}child"/>${record1.totov}
</td>
<td>
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].totpv" id="totpv${mystatus1.count}child" value="${status.value}"/>${record1.totpv}
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].totpv" id="totpv${mystatus1.count}child"/>${record1.totpv}
</td>
<td id="td${mystatus1.count}${mystatus.count}ear">
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].earlier" id="row${mystatus1.count}${mystatus.count}ear" value="${status.value}"/><span id="sp${mystatus1.count}${mystatus.count}ear">${record1.earlier}</span>
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].earlier" id="row${mystatus1.count}${mystatus.count}ear"/><span id="sp${mystatus1.count}${mystatus.count}ear">${record1.earlier}</span>
</td>
<td id="td${mystatus1.count}${mystatus.count}neg">
<form:hidden path="dedupelist[${mystatus.index}].sublist[${mystatus1.index}].negative" id="row${mystatus1.count}${mystatus.count}neg" value="${status.value}"/><span id="sp${mystatus1.count}${mystatus.count}neg">${record1.negative}</span>
<form:hidden path="batches[${mystatus.index}].cases[${mystatus1.index}].negative" id="row${mystatus1.count}${mystatus.count}neg"/><span id="sp${mystatus1.count}${mystatus.count}neg">${record1.negative}</span>
</td>
</tr>
</c:forEach>
@@ -158,20 +158,10 @@
</table>
</div>
</div>
<form:hidden path="SessUUID" value="${dedupeRun.getSessUUID()}"/>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
</div>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
</script>
<!-- -->
<!-- Process Message -->
<c:if test="${not empty dedupeRun.getErrMsg()}">
<script language="javascript" type="text/javascript"> CallMessage('${dedupeRun.getErrMsg()}',5000,200,300); </script>
</c:if>
<!-- -->
</html>

View File

@@ -8,12 +8,7 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/dedupedo.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<link href="/matrix/css/button.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/div.css" rel="stylesheet" type="text/css" />
@@ -25,12 +20,13 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=3" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<script src="/matrix/js/edp/dedupe/dedupe-send.js?v=1" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
</head>
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-dedupe-workflow">
@@ -38,7 +34,9 @@
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="senddedupe" id="senddedupe" modelAttribute="senddedupe" >
<form:form method="post" name="senddedupe" id="senddedupe" modelAttribute="senddedupe"
data-list-url="${pageContext.request.contextPath}/ver/dedupetosend"
data-generate-url="${pageContext.request.contextPath}/ver/senddedreports">
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
@@ -46,14 +44,13 @@
<img class="matrix-title-icon" src="/matrix/images/commondet.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">List of Cases</span>
<div class="divselect" id="divportfolio" style="width:167px;position:absolute;top:3px;right:30px;">
<form:select path="portfolioid" multiple="false" id="portlist" style="width:185px" onchange="SubmitForm('dedupetosend','_parent','senddedupe')">
<form:select path="portfolioid" multiple="false" id="portlist" style="width:185px">
<form:option value="-1" label="SELECT PORTFOLIO" selected="true"/>
<c:forEach items="${portlist}" var="port">
<form:option value="${port[0]}" label="${port[1]}" />
<form:option value="${port.value}" label="${port.label}" />
</c:forEach>
</form:select>
</div>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('senddedupe','_parent','senddedupe')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -75,26 +72,28 @@
</thead>
<tbody class="scrollContent">
<c:forEach items="${senddedupe.caselist}" var="casedet" varStatus="status">
<tr id="row${status.count}">
<tr id="row${status.count}" data-case-id="${casedet.uuid}">
<td>
<input type="hidden" name="uuid" id="row${status.count}uuid" value="${casedet[0]}" />
<input type="hidden" name="uuid" id="row${status.count}uuid" value="${casedet.uuid}" />
${status.count}</td>
<td>${casedet[1]}</td>
<td>${casedet[2]}</td>
<td>${casedet[3]}</td>
<td>${casedet[4]}</td>
<td>${casedet[5]}</td>
<td>${casedet[6]}</td>
<td>${casedet[7]}</td>
<td>${casedet[8]}</td>
<td>${casedet[9]}</td>
<td align="center"><input type="checkbox" name="chkrow${status.count}" id="chkrow${status.count}" checked onclick="checkList('chkrow','selall')" /></td>
<td>${casedet.mvcode}</td>
<td>${casedet.applno}</td>
<td>${casedet.customername}</td>
<td>${casedet.apptype}</td>
<td>${casedet.product}</td>
<td>${casedet.earlier}</td>
<td>${casedet.negative}</td>
<td>${casedet.deduperunon}</td>
<td>${casedet.bkbranchname}</td>
<td align="center"><input type="checkbox" value="${casedet.uuid}" checked /></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
<input type="button" class="button" name="btngenreport" style="float:right;margin-top:10px" value="Generate Report" id="btngenreport" accesskey="G" onclick="return ValidateSendDedupe('senddedupe');" />
<div class="matrix-workflow-actions">
<button type="button" class="button" name="btngenreport" id="btngenreport" accesskey="G">Generate Report</button>
</div>
</div>
<form:hidden path="uuids" id="hfdelstat" />
<form:hidden path="suuid" />
@@ -103,15 +102,9 @@
</form:form>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
InitSendDedupe();
</script>
<!-- -->
<!-- Process Message -->
<c:if test="${not empty msg}">
<script language="javascript" type="text/javascript">contentType="html"; CallMessage('${msg}',3000,200,300); </script>
<script>CygnusNotifications.show({type:"success", message:"${msg}"});</script>
</c:if>
<!-- -->
</html>

View File

@@ -9,12 +9,7 @@
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Cygnus 1.0 | Dedupe Viewer</title>
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/dedupedo.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<script src="/matrix/js/lib/notifications.js?ver=1" type="text/javascript"></script>
<link href="/matrix/css/button.css" rel="stylesheet" type="text/css" />
@@ -24,23 +19,22 @@
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/dedupe-workflows-v1.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-dialog-child.js" type="text/javascript"></script>
<link href="/matrix/css/select.css" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-dialog-child.js" type="text/javascript"></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<script src="/matrix/js/edp/dedupe/dedupe-match.js?v=1" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
</head>
<body class="matrix-shell matrix-v2 matrix-tool-workspace matrix-dedupe-workflow matrix-dedupe-match">
<div id='PageFrame'>
<!-- Title Bar -->
<%@ include file="/WEB-INF/app/fragments/app-title.jspf" %>
<!-- -->
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="dedupeDetails" id="dedupeDetails" modelAttribute="dedupeDetails" >
<form:form method="post" action="${pageContext.request.contextPath}/ver/updatededupe"
name="dedupeDetails" id="dedupeDetails" modelAttribute="dedupeDetails"
data-records-url="${pageContext.request.contextPath}/ver/deduperecords">
<!-- Parent Record Details -->
<div>
<div class="matrix-dedupe-match__source">
<form:hidden path="customername"/>
<form:hidden path="dob" id="cdob"/>
<form:hidden path="mobile" id="mob"/>
@@ -50,8 +44,8 @@
<form:hidden path="offaddress" id="oaddress"/>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/page.png" />
<span class="matrix-title-text">Source Record (MV Code - ${dedupeDetails.mvcode})&nbsp;&nbsp;&nbsp;(Category - ${dedupeDetails.category})</span>
<img class="matrix-title-icon" src="/matrix/images/page.png" alt="" />
<span class="matrix-title-text fw-bold">Source Record (MV Code - ${dedupeDetails.mvcode})&nbsp;&nbsp;&nbsp;(Category - ${dedupeDetails.category})</span>
</div>
<!-- -->
<!-- Form (Source Record) -->
@@ -85,13 +79,13 @@
</div>
<!-- -->
<!-- Earlier / Negative Details Container -->
<div style="border:1px solid #a7abb4;">
<div class="matrix-dedupe-match__comparison">
<table style="width:100%" border="0" cellspacing="0" >
<tr>
<td style="width:50%" valign="top">
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/ear_details.png" align="absmiddle" />
<img class="matrix-title-icon" src="/matrix/images/ear_details.png" alt="" />
<span class="matrix-title-text">Earlier Details <span id='efound'></span></span>
</div>
<!-- -->
@@ -117,24 +111,21 @@
<td colspan="4"><textarea style="width:443px;font-size:12pt" rows="4" id="earaddress" readonly="readonly" ></textarea></td>
</tr>
<tr>
<td>Residence Phone</td>
<td>Office Phone</td>
<td>Mobile Number</td>
<td></td>
<td colspan="4">
<div class="matrix-phone-grid">
<label>Residence Phone<input id="earrphone" readonly="readonly" /></label>
<label>Office Phone<input id="earophone" readonly="readonly" /></label>
<label>Mobile Number<input id="earmobile" readonly="readonly" /></label>
</div>
</td>
</tr>
<tr>
<td><input style="width:150px;font-size:12pt" id="earrphone" readonly="readonly" /></td>
<td><input style="width:150px;font-size:12pt" id="earophone" readonly="readonly" /></td>
<td><input style="width:112px;font-size:12pt" id="earmobile" readonly="readonly" /></td>
<td></td>
</tr>
<tr>
<td colspan="4">
<input type="button" class="button" name="btnfirst1" style="margin-top:5px;float:left" value="" id="btnfirst" accesskey="H" onclick="findRecord(1,1)" />
<input type="button" class="button" name="btnprev1" style="margin-top:5px;float:left" value="" id="btnprev" accesskey="J" onclick="findRecord(2,1)" />
<input type="button" class="button" name="btnnext1" style="margin-top:5px;float:left" value="" id="btnnext" accesskey="K" onclick="findRecord(3,1)" />
<input type="button" class="button" name="btnlast1" style="margin-top:5px;float:left" value="" id="btnlast" accesskey="L" onclick="findRecord(4,1)" />
<input type="button" class="button" name="btnear" style="margin-top:5px;float:right;margin-right:7px" value="Match Found" id="btnear" accesskey="9" onclick="addRemarks(1,'earremarks')" />
<td colspan="4" class="matrix-record-navigation">
<button type="button" class="matrix-record-nav matrix-record-nav--first" aria-label="First earlier match" accesskey="H" onclick="findRecord(1,1)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--previous" aria-label="Previous earlier match" accesskey="J" onclick="findRecord(2,1)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--next" aria-label="Next earlier match" accesskey="K" onclick="findRecord(3,1)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--last" aria-label="Last earlier match" accesskey="L" onclick="findRecord(4,1)"></button>
<button type="button" class="button matrix-match-action" id="btnear" accesskey="9" onclick="addRemarks(1,'earremarks')">Match Found</button>
</td>
</tr>
<tr>
@@ -148,7 +139,7 @@
<td valign="top" style="width:50%" id="tdneg">
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/neg_details.png" align="absmiddle" />
<img class="matrix-title-icon" src="/matrix/images/neg_details.png" alt="" />
<span class="matrix-title-text">Negative Details <span id='nfound'></span></span>
</div>
<!-- -->
@@ -173,25 +164,22 @@
<tr>
<td colspan="4"><textarea style="width:438px;font-size:12pt" rows="4" id="negaddress" readonly="readonly" ></textarea></td>
</tr>
<tr>
<td>Residence Phone</td>
<td>Office Phone</td>
<td>Mobile Number</td>
<td></td>
</tr>
<tr>
<td><input style="width:150px;font-size:12pt" id="negrphone" readonly="readonly" /></td>
<td><input style="width:150px;font-size:12pt" id="negophone" readonly="readonly" /></td>
<td><input style="width:112px;font-size:12pt" id="negmobile" readonly="readonly" /></td>
<td></td>
</tr>
<tr>
<td colspan="4">
<input type="button" class="button" name="btnfirst" style="margin-top:5px;float:left" value="" id="btnfirst" accesskey="U" onclick="findRecord(1,2)" />
<input type="button" class="button" name="btnprev" style="margin-top:5px;float:left" value="" id="btnprev" accesskey="I" onclick="findRecord(2,2)" />
<input type="button" class="button" name="btnnext" style="margin-top:5px;float:left" value="" id="btnnext" accesskey="O" onclick="findRecord(3,2)" />
<input type="button" class="button" name="btnlast" style="margin-top:5px;float:left" value="" id="btnlast" accesskey="P" onclick="findRecord(4,2)" />
<input type="button" class="button" name="btnear" style="margin-top:5px;float:right;margin-right:7px" value="Match Found" id="btnneg" accesskey="0" onclick="addRemarks(2,'negremarks')" />
<div class="matrix-phone-grid">
<label>Residence Phone<input id="negrphone" readonly="readonly" /></label>
<label>Office Phone<input id="negophone" readonly="readonly" /></label>
<label>Mobile Number<input id="negmobile" readonly="readonly" /></label>
</div>
</td>
</tr>
<tr>
<td colspan="4" class="matrix-record-navigation">
<button type="button" class="matrix-record-nav matrix-record-nav--first" aria-label="First negative match" accesskey="U" onclick="findRecord(1,2)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--previous" aria-label="Previous negative match" accesskey="I" onclick="findRecord(2,2)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--next" aria-label="Next negative match" accesskey="O" onclick="findRecord(3,2)"></button>
<button type="button" class="matrix-record-nav matrix-record-nav--last" aria-label="Last negative match" accesskey="P" onclick="findRecord(4,2)"></button>
<button type="button" class="button matrix-match-action" id="btnneg" accesskey="0" onclick="addRemarks(2,'negremarks')">Match Found</button>
</td>
</tr>
<tr>
@@ -207,13 +195,13 @@
</div>
<!-- -->
<!-- Earlier / Negative Details Container -->
<div style="border:1px solid #a7abb4;">
<div class="matrix-dedupe-match__remarks">
<table style="width:100%" border="0" cellspacing="0" >
<tr>
<td style="width:50%" valign="top">
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/ear_rem.png" id="earimg" align="absmiddle" onclick="editRemarks('earremarks')" />
<img class="matrix-title-icon" src="/matrix/images/ear_rem.png" id="earimg" alt="" onclick="editRemarks('earremarks')" />
<span class="matrix-title-text">Earlier Match Remarks</span>
<div class="nedtrem" id="ctrldiv">
<img src="/matrix/images/edit_rem.png" align="absmiddle" onclick="editRemarks('earremarks',1)" title="Remove current record remarks" />
@@ -224,7 +212,7 @@
<div id="FormPanel2" class="FormPanel">
<table align="center" class="matrix-form-controls" style="width:100%">
<tr>
<td><form:textarea path="earremarks" style="width:98%" rows="3" readonly="true" ></form:textarea></td>
<td><form:textarea path="earremarks" style="width:98%" rows="8" readonly="true" ></form:textarea></td>
</tr>
</table>
</div>
@@ -233,7 +221,7 @@
<td style="width:50%" valign="top">
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/neg_rem.png" align="absmiddle" />
<img class="matrix-title-icon" src="/matrix/images/neg_rem.png" alt="" />
<span class="matrix-title-text">Negative Match Remarks</span>
<div class="nedtrem" id="ctrldiv">
<img src="/matrix/images/edit_rem.png" align="absmiddle" onclick="editRemarks('negremarks',2)" title="Remove current record remarks" />
@@ -244,7 +232,7 @@
<div id="FormPanel2" class="FormPanel">
<table align="center" class="matrix-form-controls" style="width:100%">
<tr>
<td><form:textarea path="negremarks" style="width:98%" rows="3" readonly="true" ></form:textarea></td>
<td><form:textarea path="negremarks" style="width:98%" rows="8" readonly="true" ></form:textarea></td>
</tr>
</table>
</div>
@@ -259,23 +247,12 @@
<form:hidden path="uuid" />
<!-- -->
<input type="hidden" id="invalidfields" value="0" />
<input type="button" class="button" name="btncancel" style="margin-left:1px;margin-top:5px;float:right" value="Close" id="btncancel" accesskey="C" onclick="MatrixDialog.close(0)" />
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return SubmitForm('updatededupe','_parent','dedupeDetails');" />
<div class="matrix-workflow-actions">
<input type="button" class="button" name="btncancel" value="Close" id="btncancel" accesskey="C" onclick="MatrixDialog.close(0)" />
<button type="submit" class="button" name="btnsave" id="btnsave" accesskey="S">Save</button>
</div>
</form:form>
</div>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
FindMatchedRecords('${dedupeDetails.uuid}');
</script>
<!-- -->
<!-- Process Message -->
<c:if test="${not empty msg}">
<script language="javascript" type="text/javascript"> CallMessage('${msg}',3000,200,300); </script>
<c:if test="${status == true}">
<script language="javascript" type="text/javascript">MatrixDialog.close(1);</script>
</c:if>
</c:if>
<!-- -->
</html>

View File

@@ -41,11 +41,13 @@
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/punch-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/add-cases-v4.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/date-time-input-v1.css?v=1" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<script src="/matrix/js/lib/date-time-input-v1.js?v=1" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
</head>
@@ -219,7 +221,7 @@
DOB
</div>
<div class="inputcontainer">
<input type="text" id="dob" name="dob" maxlength="10" style="width:80px" value="" onkeydown="return addSlashes(this,event)" onblur="validate(this,'f','Date')" />
<input type="text" id="dob" name="dob" class="matrix-date-input" data-date-mode="date" maxlength="10" style="width:80px" value="" autocomplete="off" inputmode="numeric" placeholder="DD/MM/YYYY" onkeydown="return addSlashes(this,event)" onblur="validate(this,'f','Date')" />
</div>
</div>
<div class="widget">

View File

@@ -14,7 +14,7 @@
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />

View File

@@ -1,168 +0,0 @@
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@page language="java" session="true" %>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script language="javascript" src="/matrix/js/lib/constants.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/jquery1.7.2.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/uifuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/lib/jsfuncs.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/button.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/div.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/select.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/table.css" rel="stylesheet" type="text/css" />
<title>Cygnus 1.0 | Cutoff Pending</title>
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/edp-support-v1.css?v=1" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
</head>
<body class="matrix-v2 matrix-shell matrix-tool-workspace matrix-edp-support matrix-edp-process">
<div id='PageFrame'>
<%@ include file="/WEB-INF/app/fragments/app-shell-header.jspf" %>
<%-- Shared shell owns ${Sessvals.menuHtml}. --%>
<div id="formcontainer" class="matrix-tool-workspace__content" style="max-width:1100px">
<form:form method="post" name="cutoffpending" id="cutoffpending" modelAttribute="cutoffpending" >
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/cutlist.png" align="absmiddle" />
<span class="matrix-title-text" align="absmiddle">Cut-Off Pending</span>
<img class="matrix-title-action" src="/matrix/images/reload.png" title="Refresh Grid" onclick="SubmitForm('cutoffpending','_parent','cutoffpending')"/>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
<table border="0" cellspacing="0" width="100%" id="cutlist">
<thead class="thead">
<tr title="Row Title">
<td width="6%">S.No</td>
<td width="65%">Cutoff Time</td>
<td>Allocation</td>
<td>Telesheet</td>
<td>Earlier</td>
<td>Negative</td>
<td>CutOff</td>
</tr>
</thead>
<tbody class="scrollContent">
<c:forEach items="${cutoffpending.pendinglist}" var="record" varStatus="mystatus">
<tr title="parent">
<td>${mystatus.count}</td>
<td id="parent${mystatus.count}" onclick="ExpandList(this.id)" >
<form:hidden path="pendinglist[${mystatus.index}].cutofftime" id="cutofftime${mystatus.count}" value="${status.value}"/>
<form:hidden path="pendinglist[${mystatus.index}].total" id="total${mystatus.count}" value="${status.value}"/>
<span class="customLink" style="cursor:pointer">${record.cutofftime} <b>(${record.total})</b></span>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].allocation" id="chkalloc${mystatus.count}" value="false" onclick="ToggleChecks('chkalloc${mystatus.count}child',this.checked);checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);" />
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].telesheet" id="chktelesheet${mystatus.count}" value="false" onclick="ToggleChecks('chktelesheet${mystatus.count}child',this.checked);checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);" />
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].earlier" id="chkear${mystatus.count}" value="false" onclick="ToggleChecks('chkear${mystatus.count}child',this.checked);checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);" />
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].negative" id="chkneg${mystatus.count}" value="false" onclick="ToggleChecks('chkneg${mystatus.count}child',this.checked);checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);" />
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].cutoff" id="chkcutoff${mystatus.count}" value="false" onclick="ToggleMatrix('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child',this.checked,',');checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);" />
</td>
</tr>
<tr style="display:none" id="parent${mystatus.count}child" >
<c:choose>
<c:when test="${record.total lt 1}">
<td colspan="6" style="text-align:center;font-style: italic;color:#232323;text-transform: capitalize;">There are no Records.</td>
</c:when>
<c:otherwise>
<td colspan="8" align="right">
<table cellspacing="0" cellpadding="0" border="0" width="94%" style="border-color: #49a5df">
<thead class="thead">
<tr title="Heading">
<td width="6%">S.No</td>
<td>Portfolio</td>
<td width="60%">Name</td>
<td>Allocation</td>
<td>Telesheet</td>
<td>Earlier</td>
<td>Negative</td>
<td>Cutoff</td>
</tr>
</thead>
<tbody class="scrollContent">
<c:forEach items="${record.pendingsublist}" var="record1" varStatus="mystatus1">
<tr title="child">
<td>${mystatus1.count}</td>
<td>
<form:hidden path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].uuid" id="uuid${mystatus1.count}child" value="${status.value}"/>
<span>${record1.portfolio}</span>
</td>
<td>
<span>${record1.customername}</span>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].allocation" id="chkalloc${mystatus.count}child${mystatus1.count}" value="${status.value}" onclick="checkList('chkalloc${mystatus.count}child','chkalloc${mystatus.count}');checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);"/>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].telesheet" id="chktelesheet${mystatus.count}child${mystatus1.count}" value="${status.value}" onclick="checkList('chktelesheet${mystatus.count}child','chktelesheet${mystatus.count}');checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);"/>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].earlier" id="chkear${mystatus.count}child${mystatus1.count}" value="${status.value}" onclick="checkList('chkear${mystatus.count}child','chkear${mystatus.count}');checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);"/>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].negative" id="chkneg${mystatus.count}child${mystatus1.count}" value="${status.value}" onclick="checkList('chkneg${mystatus.count}child','chkneg${mystatus.count}');checkUncheckList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child','chkalloc${mystatus.count},chktelesheet${mystatus.count},chkear${mystatus.count},chkneg${mystatus.count},chkcutoff${mystatus.count}',',',',',${record.total},0);"/>
</td>
<td>
<form:checkbox path="pendinglist[${mystatus.index}].pendingsublist[${mystatus1.index}].cutoff" id="chkcutoff${mystatus.count}child${mystatus1.count}" value="${status.value}" onclick="checkList('chkcutoff${mystatus.count}child','chkcutoff${mystatus.count}');checkRowList('chkalloc${mystatus.count}child,chktelesheet${mystatus.count}child,chkear${mystatus.count}child,chkneg${mystatus.count}child,chkcutoff${mystatus.count}child',',',this.checked,${mystatus1.count});"/>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</td>
</c:otherwise>
</c:choose>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
<input type="button" class="button" name="btnsave" style="margin-top:5px;float:right" value="Save" id="btnsave" accesskey="S" onclick="return SubmitForm('savecutoffpending','_parent','cutoffpending');" />
<form:hidden path="SessUUID" value=""/>
</form:form>
<input type="hidden" id="invalidfields" value="0" />
<input type="hidden" id="selectedports" value="0" />
</div>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
InitPage();
</script>
<!-- Process Message -->
<c:if test="${not empty cutoffpending.getErrMsg()}">
<script language="javascript" type="text/javascript">contentType="html"; CallMessage('${cutoffpending.getErrMsg()}',8000,200,300); </script>
</c:if>
</html>

View File

@@ -6,10 +6,12 @@
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link href="<c:url value='/css/bootstrap-5.3.8.min.css' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-v2.css' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-shell-v2.css' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-theme-v2.css' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-v2.css?v=6' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-shell-v2.css?v=7' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-frame-dialog.css?v=6' />" rel="stylesheet" />
<link href="<c:url value='/css/matrix-theme-v2.css?v=4' />" rel="stylesheet" />
<script src="<c:url value='/js/matrix-shell-v2.js' />" defer></script>
<script src="<c:url value='/js/matrix-frame-dialog.js?v=2' />" defer></script>
<title>Cygnus 1.0 | <c:out value="${empty messageDetails.title ? 'Page unavailable' : messageDetails.title}" /></title>
</head>
<body class="matrix-v2 matrix-shell matrix-error-page matrix-error-page--${empty messageDetails.httpStatus ? 404 : messageDetails.httpStatus}">

View File

@@ -16,7 +16,7 @@
<script language="javascript" src="/matrix/js/ui/msgdialog.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/progressbar.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ui/select.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/cutoff.js" type="text/javascript"></script>
<script src="/matrix/js/edp/cutoff/cutoff.js?v=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js" type="text/javascript"></script>
<link href="/matrix/css/matrix.css" rel="stylesheet" type="text/css" />

View File

@@ -26,12 +26,14 @@
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-shell-v2.css?v=7" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/mis-filter-v4.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/mis-filter-v4.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/date-time-input-v1.css?v=2" rel="stylesheet" type="text/css" />
<script src="/matrix/js/bootstrap-5.3.8.bundle.min.js" defer></script>
<script src="/matrix/js/matrix-shell-v2.js" defer></script>
<link href="/matrix/css/matrix-frame-dialog.css?v=6" rel="stylesheet" type="text/css" />
<script src="/matrix/js/matrix-frame-dialog.js?v=2" defer></script>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
<script src="/matrix/js/lib/date-time-input-v1.js?v=2" defer></script>
<link href="/matrix/css/matrix-theme-v2.css?v=4" rel="stylesheet" type="text/css" />
</head>

View File

@@ -17,7 +17,7 @@
<link href="/matrix/css/bootstrap-5.3.8.min.css" rel="stylesheet" type="text/css" />
<link href="/matrix/css/matrix-v2.css?v=6" rel="stylesheet" type="text/css" />
<link href="/matrix/css/tool-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/mis-output-v1.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/mis-output-v1.css?v=7" rel="stylesheet" type="text/css" />
<title>Cygnus 1.0 | ${filter.title }</title>
<script src="/matrix/js/matrix-accessibility-v1.js?v=1" defer></script>
@@ -25,7 +25,16 @@
</head>
<body class="matrix-v2 matrix-mis-output">
<form:form method="post" name="filter" id="filter" modelAttribute="filter" >
<c:if test="${hourlyJasperReport}">
<div class="matrix-report-actions">
<button type="submit" class="btn btn-primary btn-sm" formaction="${pageContext.request.contextPath}/ver/dtmis/xlsx">Export XLSX</button>
<button type="submit" class="btn btn-outline-primary btn-sm" formaction="${pageContext.request.contextPath}/ver/dtmis/pdf">Export PDF</button>
<button type="submit" class="btn btn-outline-primary btn-sm" formaction="${pageContext.request.contextPath}/ver/dtmis/csv">Export CSV</button>
</div>
</c:if>
<div class="matrix-report-scroll">
${filter.html}
</div>
<input type="hidden" id="invalidfields" value="0" />
<form:hidden path="qid" />
<form:hidden path="title" />

View File

@@ -4,16 +4,57 @@
}
.matrix-cutoff-workflow .title {
margin-bottom: 10px;
display: flex !important;
align-items: center;
min-height: 38px;
margin: 0 !important;
padding: 6px 10px !important;
gap: 8px;
border: 1px solid #aebfce !important;
border-radius: 6px 6px 0 0;
background: #f7f9fb !important;
color: #263746 !important;
}
.matrix-cutoff-workflow .title > .divselect {
width: 132px !important;
margin-left: auto !important;
.matrix-cutoff-workflow .matrix-cutoff-title-actions {
display: flex;
align-items: center;
flex: 0 0 auto;
gap: 8px;
margin-left: auto;
}
.matrix-cutoff-workflow .title > .divselect select {
.matrix-cutoff-workflow .matrix-cutoff-title-actions > .divselect {
position: static !important;
width: 150px !important;
height: 28px !important;
margin: 0 !important;
}
.matrix-cutoff-workflow .matrix-cutoff-title-actions > .divselect select {
width: 100% !important;
height: 28px !important;
padding: 2px 28px 2px 8px !important;
font-size: 12px !important;
font-weight: 400 !important;
}
.matrix-cutoff-workflow .matrix-title-action {
position: static !important;
flex: 0 0 28px;
width: 28px !important;
height: 28px !important;
margin: 0 !important;
padding: 6px !important;
border: 0 !important;
border-radius: 4px;
cursor: pointer;
object-fit: contain;
}
.matrix-cutoff-workflow .matrix-title-action:hover,
.matrix-cutoff-workflow .matrix-title-action:focus {
background: #e5edf4;
}
.matrix-cutoff-workflow .tableContainer {
@@ -21,7 +62,7 @@
margin: 0;
overflow: auto;
border: 1px solid #c3d0da !important;
border-radius: 6px;
border-radius: 0 0 6px 6px;
background: #f4f8fb !important;
box-shadow: 0 2px 8px rgba(31, 52, 72, .08);
}
@@ -77,9 +118,23 @@
.matrix-cutoff-workflow .tableContainer table table {
width: calc(100% - 18px) !important;
margin: 8px 0 8px auto;
border: 1px solid #c7d4df;
border: 1px solid #9fb2c3;
border-radius: 4px;
background: #f8fafc;
background: #fff !important;
box-shadow: 0 2px 6px rgba(31, 52, 72, .12);
}
.matrix-cutoff-workflow .tableContainer > table > tbody > tr[id$="child"] > td {
padding: 6px 10px 8px !important;
background: #dfeaf3 !important;
}
.matrix-cutoff-workflow .tableContainer table table > tbody > tr > td {
background: #fff !important;
}
.matrix-cutoff-workflow .tableContainer table table > tbody > tr:nth-child(even) > td {
background: #f1f6fa !important;
}
.matrix-cutoff-workflow .tableContainer input[type="checkbox"] {
@@ -89,10 +144,42 @@
accent-color: #245a91;
}
.matrix-cutoff-workflow form > input.button {
.matrix-cutoff-workflow .matrix-workflow-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 8px;
min-height: 46px;
padding: 8px 10px;
border-top: 1px solid #b8c9d8;
background: #f7fafd;
}
.matrix-cutoff-workflow .matrix-workflow-actions > input.button {
min-width: 96px;
margin: 10px 0 0 8px !important;
float: right !important;
margin: 0 !important;
float: none !important;
}
.matrix-cutoff-workflow .matrix-workflow-actions .matrix-button,
.matrix-cutoff-workflow .matrix-workflow-actions > input.button,
.matrix-cutoff-workflow form > input.button,
.matrix-cutoff-workflow form > a.button {
min-height: 30px;
padding: 5px 14px !important;
border: 1px solid #245a91 !important;
border-radius: 4px !important;
color: #fff !important;
background: #28639b !important;
font-size: 12px !important;
font-weight: 600 !important;
line-height: 18px !important;
text-decoration: none !important;
}
.matrix-cutoff-workflow .customLink {
color: #245a91;
font-weight: 600;
}
.matrix-cutoff-workflow form::after {
@@ -114,3 +201,62 @@
width: calc(100% - 12px) !important;
}
}
.matrix-cutoff-pending .matrix-icon-button {
margin-left: auto !important;
background: transparent;
}
.matrix-cutoff-pending .matrix-icon-button img {
width: 16px;
height: 16px;
display: block;
}
.matrix-cutoff-pending .matrix-parent-row td:not(:nth-child(2)),
.matrix-cutoff-pending .matrix-nested-table td:not(:nth-child(2)):not(:nth-child(3)) {
text-align: center;
}
.matrix-cutoff-pending .matrix-row-toggle {
display: inline-flex;
align-items: center;
gap: 7px;
padding: 0;
border: 0;
color: #245a91;
background: transparent;
font: inherit;
font-weight: 600;
cursor: pointer;
}
.matrix-cutoff-pending .matrix-row-toggle__chevron {
width: 12px;
color: #516c82;
font-size: 9px;
}
.matrix-cutoff-pending .matrix-expanded-row > td {
padding: 8px 10px !important;
background: #dfeaf3 !important;
}
.matrix-cutoff-pending .matrix-nested-table {
width: 100% !important;
margin: 0 !important;
border: 1px solid #9fb2c3 !important;
background: #fff !important;
box-shadow: 0 2px 6px rgba(31, 52, 72, .12);
}
.matrix-cutoff-pending .matrix-nested-table tbody tr:nth-child(even) td {
background: #f1f6fa !important;
}
.matrix-cutoff-pending .matrix-empty-row {
padding: 18px !important;
text-align: center !important;
color: #65798a;
font-style: italic;
}

View File

@@ -0,0 +1,50 @@
.matrix-date-control {
position: relative;
display: flex;
width: 100%;
align-items: stretch;
}
.matrix-date-control > .matrix-date-input {
min-width: 0;
flex: 1 1 auto;
padding-right: 38px !important;
}
.matrix-date-control__button {
position: absolute;
top: 1px;
right: 1px;
bottom: 1px;
display: grid;
width: 34px;
padding: 0;
place-items: center;
border: 0;
border-left: 1px solid #c4d0da;
border-radius: 0 3px 3px 0;
background: #edf3f7;
color: #285f8f;
cursor: pointer;
}
.matrix-date-control__button:hover,
.matrix-date-control__button:focus-visible {
background: #dfeaf3;
outline: 0;
}
.matrix-date-control__picker {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
opacity: 0;
pointer-events: none;
}
.matrix-mis-filter .FormPanel .matrix-date-field {
width: 100%;
min-width: 0;
flex: 0 0 auto;
}

View File

@@ -1,12 +1,161 @@
.matrix-tool-workspace.matrix-dedupe-workflow {
padding: 0;
}
.matrix-dedupe-workflow .matrix-tool-workspace__content {
width: calc(100% - 24px) !important;
max-width: 1380px !important;
margin: 10px auto 0 !important;
}
.matrix-dedupe-workflow .title {
margin-bottom: 10px;
}
.matrix-dedupe-workflow .matrix-tool-workspace__content .title > .matrix-title-icon {
display: block;
width: 17px !important;
height: 17px !important;
flex: 0 0 17px;
margin: 0 !important;
object-fit: contain;
vertical-align: middle;
}
.matrix-dedupe-workflow .matrix-tool-workspace__content .title > .matrix-title-text {
line-height: 17px;
}
.matrix-dedupe-workflow .matrix-dedupe-run__title {
display: flex !important;
min-height: 38px;
align-items: center;
gap: 7px;
padding: 5px 10px !important;
}
.matrix-dedupe-workflow .matrix-dedupe-run__title > .matrix-title-action {
width: 17px !important;
height: 17px !important;
margin-left: auto !important;
object-fit: contain;
}
.matrix-dedupe-worklist {
overflow: hidden;
border: 1px solid #aebfcd;
border-radius: 5px;
background: #f4f8fb;
box-shadow: 0 3px 10px rgba(31, 52, 72, .09);
}
.matrix-dedupe-worklist__header {
display: flex !important;
min-height: 38px;
align-items: center;
gap: 12px;
margin: 0 !important;
padding: 4px 8px !important;
flex-wrap: nowrap !important;
}
.matrix-dedupe-worklist__heading,
.matrix-dedupe-worklist__actions {
display: flex;
align-items: center;
}
.matrix-dedupe-worklist__heading {
flex: 0 0 auto;
gap: 7px;
}
.matrix-dedupe-workflow .matrix-dedupe-worklist__header > .matrix-dedupe-worklist__actions {
min-width: 0;
flex: 1 1 auto;
gap: 7px;
flex-wrap: nowrap !important;
width: auto !important;
margin: 0 !important;
}
.matrix-dedupe-worklist__portfolio {
min-width: 0;
flex: 1 1 auto;
height: 29px !important;
padding: 2px 28px 2px 8px !important;
font-size: 13px !important;
font-weight: 400 !important;
width: 100% !important;
}
.matrix-dedupe-worklist__refresh {
display: inline-flex;
width: 29px;
height: 29px;
flex: 0 0 29px;
align-items: center;
justify-content: center;
padding: 0;
border: 0;
border-radius: 3px;
background: transparent;
}
.matrix-dedupe-worklist__refresh:hover,
.matrix-dedupe-worklist__refresh:focus-visible {
background: #e2ebf3;
outline: 1px solid #9fb5c7;
}
.matrix-dedupe-worklist__refresh img {
width: 16px;
height: 16px;
}
.matrix-dedupe-worklist__table-wrap {
margin: 0;
border: 0;
border-top: 1px solid #c3d0da;
border-radius: 0;
}
.matrix-dedupe-worklist__table-wrap thead th {
padding: 7px 9px;
color: #31475b;
background: #e8eef4;
border-color: #d3dce5;
font-size: 11px;
text-transform: uppercase;
white-space: nowrap;
}
.matrix-dedupe-worklist__table-wrap tbody td {
padding: 6px 9px;
border-color: #dce4eb;
background: #fff;
}
.matrix-dedupe-worklist__row {
cursor: pointer;
}
.matrix-dedupe-worklist__row:nth-child(even) td {
background: #edf3f7;
}
.matrix-dedupe-worklist__row:hover td,
.matrix-dedupe-worklist__row:focus td {
background: #dfedf8;
}
.matrix-dedupe-worklist__empty {
padding: 24px !important;
color: #637586;
text-align: center;
font-style: italic;
}
.matrix-dedupe-workflow .title > .divselect {
width: min(320px, 38vw) !important;
margin-left: auto !important;
@@ -70,14 +219,50 @@
.matrix-dedupe-workflow .tableContainer table table {
width: calc(100% - 18px) !important;
margin: 8px 0 8px auto;
border: 1px solid #c7d4df;
background: #f8fafc;
border: 1px solid #9fb2c3;
border-radius: 4px;
background: #fff !important;
box-shadow: 0 2px 6px rgba(31, 52, 72, .12);
}
.matrix-dedupe-workflow form > input.button {
/* Migration convention: nested data grids must remain visually distinct. */
.matrix-dedupe-workflow .tableContainer > table > tbody > tr:has(> td > table) > td {
padding: 6px 10px 8px !important;
background: #dfeaf3 !important;
}
.matrix-dedupe-workflow .tableContainer table table > tbody > tr > td {
background: #fff !important;
}
.matrix-dedupe-workflow .tableContainer table table > tbody > tr:nth-child(even) > td {
background: #f1f6fa !important;
}
.matrix-dedupe-workflow .matrix-workflow-actions {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 8px;
min-height: 46px;
padding: 8px 10px;
border-top: 1px solid #b8c9d8;
background: #f7fafd;
}
.matrix-dedupe-workflow .matrix-workflow-actions .button {
min-width: 108px;
margin: 10px 0 0 8px !important;
float: right !important;
margin: 0 !important;
float: none !important;
min-height: 30px;
padding: 5px 14px !important;
border: 1px solid #245a91 !important;
border-radius: 4px !important;
color: #fff !important;
background: #28639b !important;
font-size: 12px !important;
font-weight: 600 !important;
line-height: 18px !important;
}
.matrix-dedupe-workflow form::after {
@@ -106,39 +291,187 @@
overflow: hidden;
}
.matrix-dedupe-match #dedupeDetails .title {
box-sizing: border-box;
display: flex;
min-height: 36px;
align-items: center;
gap: 7px;
margin: 0 !important;
padding: 6px 9px !important;
border-bottom: 1px solid #aebfcd !important;
background: #eef3f7 !important;
font-size: 13px;
line-height: 20px;
}
.matrix-dedupe-match #dedupeDetails .title > .matrix-title-icon {
display: block;
width: 17px !important;
height: 17px !important;
flex: 0 0 17px;
margin: 0 !important;
object-fit: contain;
}
.matrix-dedupe-match #dedupeDetails .title > .matrix-title-text {
min-width: 0;
line-height: 20px;
}
.matrix-dedupe-match #dedupeDetails .title > .nedtrem {
display: inline-flex;
align-items: center;
margin-left: auto;
}
.matrix-dedupe-match #dedupeDetails .title > .nedtrem img {
width: 17px;
height: 17px;
object-fit: contain;
cursor: pointer;
}
.matrix-dedupe-match .FormPanel {
padding: 10px 12px;
padding: 5px 10px;
border: 0 !important;
background: #f4f8fb !important;
}
.matrix-dedupe-match .matrix-form-controls {
width: 100% !important;
border-spacing: 7px 4px;
table-layout: fixed;
border-spacing: 8px 2px;
margin-top: 0 !important;
margin-bottom: 0 !important;
}
.matrix-dedupe-match .matrix-form-controls td {
height: auto !important;
padding: 1px 8px !important;
color: #34495b;
font-size: 11px;
font-weight: 600;
line-height: 14px;
vertical-align: middle;
}
.matrix-dedupe-match .matrix-form-controls input:not([type="hidden"]),
.matrix-dedupe-match .matrix-form-controls textarea {
box-sizing: border-box;
width: 100% !important;
max-width: 100%;
min-height: 30px;
padding: 4px 7px !important;
border: 1px solid #b8c7d3 !important;
border-radius: 3px;
background: #fff !important;
color: #24313d;
font-size: 12px !important;
font-weight: 400 !important;
line-height: 20px;
}
.matrix-dedupe-match .matrix-form-controls input:not([type="hidden"]) {
width: 100% !important;
height: 30px !important;
}
.matrix-dedupe-match .matrix-dedupe-match__comparison,
.matrix-dedupe-match .matrix-dedupe-match__remarks {
border: 1px solid #aebfcd !important;
background: #dfeaf3;
}
.matrix-dedupe-match .matrix-dedupe-match__comparison > table,
.matrix-dedupe-match .matrix-dedupe-match__remarks > table {
width: 100%;
table-layout: fixed;
}
.matrix-dedupe-match .matrix-dedupe-match__comparison > table > tbody > tr > td + td,
.matrix-dedupe-match .matrix-dedupe-match__remarks > table > tbody > tr > td + td {
border-left: 1px solid #b8c9d8;
}
.matrix-dedupe-match .matrix-record-navigation {
display: flex;
align-items: center;
gap: 5px;
padding-top: 5px;
}
.matrix-dedupe-match .matrix-phone-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
width: 100%;
}
.matrix-dedupe-match .matrix-phone-grid label {
display: flex;
min-width: 0;
flex-direction: column;
gap: 3px;
margin: 0;
color: #34495b;
font-size: 11px;
font-weight: 600;
}
.matrix-dedupe-match .matrix-phone-grid input {
width: 100% !important;
min-width: 0;
}
.matrix-dedupe-match .matrix-record-nav {
width: 32px;
height: 29px;
flex: 0 0 32px;
padding: 0;
border: 1px solid #9fb3c4;
border-radius: 4px;
background-color: #f7fafc;
background-position: center;
background-repeat: no-repeat;
cursor: pointer;
}
.matrix-dedupe-match .matrix-record-nav:hover,
.matrix-dedupe-match .matrix-record-nav:focus-visible {
border-color: #28699d;
background-color: #e2edf6;
outline: none;
}
.matrix-dedupe-match .matrix-record-nav--first { background-image: url('/matrix/images/first.png'); }
.matrix-dedupe-match .matrix-record-nav--previous { background-image: url('/matrix/images/prev.png'); }
.matrix-dedupe-match .matrix-record-nav--next { background-image: url('/matrix/images/next.png'); }
.matrix-dedupe-match .matrix-record-nav--last { background-image: url('/matrix/images/last.png'); }
.matrix-dedupe-match .matrix-match-action {
width: auto !important;
min-width: 108px;
min-height: 29px;
margin: 0 0 0 auto !important;
padding: 4px 12px !important;
float: none !important;
background-image: none !important;
text-indent: 0 !important;
white-space: nowrap;
}
.matrix-dedupe-match .matrix-form-controls textarea {
resize: vertical;
}
.matrix-dedupe-match :is(#btnfirst, #btnprev, #btnnext, #btnlast) {
width: 30px !important;
min-width: 30px;
padding: 3px !important;
}
.matrix-dedupe-match :is(#btnear, #btnneg) {
color: #fff !important;
background-image: none !important;
background-color: #245a91 !important;
border-color: #245a91 !important;
text-indent: 0 !important;
white-space: nowrap;
}
@media (max-width: 760px) {

View File

@@ -64,25 +64,43 @@
}
.matrix-mis-filter .FormPanel {
padding: 20px 18px;
height: auto !important;
min-height: 0 !important;
padding: 16px 18px;
border: 1px solid #c9d4de;
border-radius: 0 0 5px 5px;
background: #fff;
}
.matrix-mis-filter .FormPanel table {
display: block;
width: 100%;
margin: 0;
}
.matrix-mis-filter .FormPanel table tbody,
.matrix-mis-filter .FormPanel table tr,
.matrix-mis-filter .FormPanel table tr td {
display: block;
width: 100%;
height: auto !important;
}
.matrix-mis-filter .FormPanel table tr td {
display: flex;
flex-wrap: wrap;
align-items: end;
gap: 14px 18px;
padding: 0;
}
.matrix-mis-filter .FormPanel table tr:first-child td {
display: grid;
gap: 12px;
}
.matrix-mis-filter .FormPanel table tr:last-child td {
display: flex;
justify-content: flex-end;
padding-top: 14px;
}
.matrix-mis-filter .FormPanel .widget {
display: flex;
min-width: 230px;
@@ -124,12 +142,15 @@
}
.matrix-mis-filter .FormPanel input.button {
width: auto !important;
min-width: 96px;
min-height: 34px;
padding: 6px 14px 6px 30px !important;
border-color: #7f8b96;
border-radius: 4px;
background-color: #e5e8eb;
float: none !important;
margin: 0 !important;
}
.matrix-mis-filter .FormPanel br {

View File

@@ -10,7 +10,7 @@
.matrix-mis-output form {
width: 100%;
max-width: 1600px;
max-width: none;
margin: 0 auto;
padding: 12px;
overflow: auto;
@@ -129,3 +129,43 @@
box-shadow: none;
}
}
.matrix-report-actions {
display: flex;
justify-content: flex-end;
gap: 6px;
margin: 0 0 0.5rem;
}
.matrix-report-scroll {
width: 100%;
max-width: 100%;
overflow-x: auto;
overflow-y: hidden;
padding-bottom: 6px;
}
.matrix-report-scroll .jrPage {
max-width: none;
}
.matrix-mis-output .jrPage {
margin: 0 auto;
background: #f7fafc;
border: 1px solid #9fb2c3;
box-shadow: 0 2px 8px rgba(38, 66, 89, 0.12);
}
.hourly-mis { width: 100%; box-sizing: border-box; padding: 18px; background: #f7fafc; border: 1px solid #9fb2c3; }
.hourly-mis__header { text-align: center; }
.hourly-mis__header h1 { margin: 0; font-size: 18px; font-weight: 700; }
.hourly-mis__header h2 { margin: 3px 0; font-size: 14px; font-weight: 700; }
.hourly-mis__header p, .hourly-mis__branch { margin: 5px 0; font-size: 14px; }
.hourly-mis__branch { font-weight: 700; }
.hourly-mis__table { width: 100%; table-layout: fixed; border-collapse: collapse; background: #fff; }
.hourly-mis__table th, .hourly-mis__table td { padding: 5px 4px; border: 1px solid #9fb2c3; font-size: 12px; text-align: center; }
.hourly-mis__table thead th { background: #dce7f1; font-weight: 700; }
.hourly-mis__table th:first-child, .hourly-mis__table td:first-child { width: 110px; text-align: left; }
.hourly-mis__operator th { background: #e3e8ed; text-align: left; }
.hourly-mis__operator span { display: block; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.hourly-mis__total th, .hourly-mis__total td { background: #dde8f1; font-weight: 700; }
.hourly-mis__empty { padding: 28px !important; color: #73808b; font-style: italic; text-align: center !important; }

View File

@@ -1,383 +0,0 @@
var currow=0;
var lastrow=0;
var negIndx=0;
var earIndx=0;
var earlier= new Array(1);
var negative= new Array(1);
var earpos=0;
var negpos=0;
var ctrlear="";
var ctrlneg="";
function InitPage()
{
$('form tbody.scrollContent tr').hover(function () {
$(this).addClass('rowhover');
}, function () {
$(this).removeClass('rowhover');
});
$('form tbody.scrollContent tr').click(function () {
currow=$(this).index();
GetRowData(this);
});
}
function ResetRow()
{
currow=0;
lastrow=$('#casetable tr').length-1;
}
function GetRowData(SelectedRow)
{
var rowId=$(SelectedRow).attr('id');
QueryStr="rand="+Math.round(Math.random()*4+1)+"&uuid="+$("#"+rowId+"uuid").val();
OpenMatrixDialog("dedupefound?"+QueryStr,"Dedupe Details").then(function(retVal) {
if(retVal==1)
{
$(SelectedRow).remove();
lastrow=currow-1;
changeRow();
}
});
}
function keyListen(param1,param2,e) {
var keycode = e.keyCode;
if(keycode==13)
{
GetRowData($('tr:eq('+currow+')', $("#casetable")));
}
else
{
if(keycode==40)
{
currow=currow+1;
if(currow>=$('#casetable tr').length){currow=1;lastrow=$('#casetable tr').length-1;}
changeRow();
}
if(keycode==38)
{
currow=currow-1;
if(currow<=0){currow=$('#casetable tr').length-1;lastrow=1;}
changeRow();
}
}
}
function changeRow()
{
$('tr:eq('+currow+')', $("#casetable")).addClass('rowhover');
$('tr:eq('+lastrow+')', $("#casetable")).removeClass('rowhover');
$('tr:eq('+currow+')', $("#casetable")).focus();
lastrow=currow;
}
function callkeydownhandler(evnt) {
var ev = evnt;
keyListen('','',ev);
}
window.document.addEventListener("keydown", callkeydownhandler, false);
function FindMatchedRecords(uuid)
{
$("#efoundon").html("<b>Loading</b> <img src='/matrix/images/loading.gif' align='absmiddle' />");
$("#nfoundon").html("<b>Loading</b> <img src='/matrix/images/loading.gif' align='absmiddle' />");
RunAjax("GET","deduperecords","uuid="+uuid,1);
}
function AfterResponse(response,oprID)
{
if(oprID==1)
{
negIndx=0;
earIndx=0;
if(response.trim()!='')
{
var rows=response.split(RowDelim);
for(rindx=0;rindx<rows.length;rindx++)
{
var cols=rows[rindx].split(ColDelim);
if(cols[0]=='EAR')
{
earlier[earIndx]=new Array(cols.length);
for(cindx=0;cindx<cols.length;cindx++)
{
earlier[earIndx][cindx]=cols[cindx];
}
earIndx=earIndx+1;
}
else if(cols[0]=='NEG')
{
negative[negIndx]=new Array(cols.length);
for(cindx=0;cindx<cols.length;cindx++)
{
negative[negIndx][cindx]=cols[cindx];
}
negIndx=negIndx+1;
}
}
}
//earIndx= earIndx==0 ? earIndx : earIndx-1;
//negIndx= negIndx==0 ? negIndx : negIndx-1;
$("#efound").html("<b>("+(earIndx==0 ? "No" : earIndx)+" Match Found)</b>");
$("#nfound").html("<b>("+(negIndx==0 ? "No" : negIndx)+" Match Found)</b>");
FillDetails(1);
FillDetails(2);
}
}
function findRecord(arrOpr,opr)
{
tempPos= opr==1 ? earpos:negpos;
maxLen= opr==1 ? earIndx-1:negIndx-1;
if(arrOpr==1) tempPos=0;
if(arrOpr==2)
{
if(tempPos>0) tempPos=tempPos-1;
else return false;
}
if(arrOpr==3)
{
if(tempPos<maxLen) tempPos=tempPos+1;
else return false;
}
if(arrOpr==4) tempPos=maxLen;
earpos= opr==1 ? tempPos:earpos;
negpos= opr==2 ? tempPos:negpos;
FillDetails(opr);
}
function FillDetails(opr)
{
if(opr==1)
{
if(earIndx > 0)
{
var addropt=MatchWith(earlier[earpos][1],'ear');
MatchFoundOn(earlier[earpos][2],'ear');
$("#earname").val(earlier[earpos][6]);
$("#eardob").val(earlier[earpos][7]);
if(addropt==1)
{
$("#earaddress").val(earlier[earpos][8]+" "+earlier[earpos][9]+" "+earlier[earpos][10]);
}
else if(addropt==2)
{
$("#earaddress").val(earlier[earpos][14]+" "+earlier[earpos][15]+" "+earlier[earpos][16]);
}
else if(addropt==3)
{
addr=earlier[earpos][8].trim()!='' ? ('Residence Address: '+earlier[earpos][8]+" "+earlier[earpos][9]+" "+earlier[earpos][10]):'';
addr=(addr.length > 0 ? addr+'\n\n':'')+(earlier[earpos][14].trim()!='' ? ('Office Address: '+earlier[earpos][14]+" "+earlier[earpos][15]+" "+earlier[earpos][16]):'');
$("#earaddress").val(addr);
}
$("#earrphone").val(earlier[earpos][11]);
$("#earophone").val(earlier[earpos][12]);
$("#earmobile").val(earlier[earpos][13]);
$("#efoundon").html("Match Found On : <b>"+earlier[earpos][1]+"</b>");
$("#efound").html("<b>("+(Number(earpos)+1)+" / "+ earIndx+" Match Found)</b>");
//$("#ecurrecord").html("Current Record : <b>"+(Number(earpos)+1)+"</b>");
}
else
{
$("#efoundon").html("<b>No Match Found</b>");
}
}
else if(opr==2)
{
if(negIndx > 0)
{
var addropt=MatchWith(negative[negpos][1],'neg');
MatchFoundOn(negative[negpos][1],'neg');
$("#negname").val(negative[negpos][6]);
$("#negdob").val(negative[negpos][7]);
if(addropt==1)
{
$("#negaddress").val(negative[negpos][8]+" "+negative[negpos][9]+" "+negative[negpos][10]);
}
else if(addropt==2)
{
$("#negaddress").val(negative[negpos][14]+" "+negative[negpos][15]+" "+negative[negpos][16]);
}
else if(addropt==3)
{
addr=negative[negpos][8].trim()!='' ? ('Residence Address: '+negative[negpos][8]+" "+negative[negpos][9]+" "+negative[negpos][10]):'';
addr=(addr.length > 0 ? addr+'\n\n':'')+(negative[negpos][14].trim()!='' ? ('Office Address: '+negative[negpos][14]+" "+negative[negpos][15]+" "+negative[negpos][16]):'');
$("#negaddress").val(addr);
}
$("#negrphone").val(negative[negpos][11]);
$("#negophone").val(negative[negpos][12]);
$("#negmobile").val(negative[negpos][13]);
$("#nfoundon").html("Match Found On : <b>"+negative[negpos][1]+"</b>");
$("#nfound").html("<b>("+(Number(negpos)+1)+" / "+negIndx+" Match Found)</b>");
//$("#efound").html("Current Record : <b>"+(Number(negpos)+1)+"</b>");
}
else
{
$("#nfoundon").html("<b>No Match Found</b>");
}
}
}
function MatchFoundOn(MatchFoundOn,Opr)
{
if(MatchFoundOn.search("MATCH WITH SAME RESIDENCE ADDRESS") > -1)
{
Opr=="ear" ? ctrlear=ctrlear+",resiaddress" : ctrlneg=ctrlneg+",resiaddress";
$("#resiaddress").addClass(Opr+"match");
}
if(MatchFoundOn.search("MATCH WITH SAME OFFICE ADDRESS") > -1)
{
Opr=="ear" ? ctrlear=ctrlear+",offaddress" : ctrlneg=ctrlneg+",offaddress";
$("#offaddress").addClass(Opr+"match");
}
if(MatchFoundOn.search("MATCH WITH SAME RESIDENCE PHONE") > -1)
{
Opr=="ear" ? ctrlear=ctrlear+",rphone" : ctrlneg=ctrlneg+",rphone";
$("#rphone").addClass(Opr+"match");
}
if(MatchFoundOn.search("MATCH WITH SAME OFFICE PHONE") > -1)
{
Opr=="ear" ? ctrlear=ctrlear+",ophone" : ctrlneg=ctrlneg+",ophone";
$("#ophone").addClass(Opr+"match");
}
if(MatchFoundOn.search("MATCH WITH SAME MOBILE PHONE NUMBER") > -1)
{
Opr=="ear" ? ctrlear=ctrlear+",mobile" : ctrlneg=ctrlneg+",mobile";
$("#mobile").addClass(Opr+"match");
}
}
function MatchWith(MatchWith,Opr)
{
resetMarking(Opr);
Opr=="ear" ? ctrlear="" : ctrlneg="";
if(MatchWith=="RESIDENCE ADDRESS")
{
temp=Opr+"address";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"address").addClass(Opr+"match");
return 1;
}
if(MatchWith=="OFFICE ADDRESS")
{
temp=Opr+"address";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"address").addClass(Opr+"match");
return 2;
}
if(MatchWith=="RESIDENCE PHONE")
{
temp=Opr+"rphone";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"rphone").addClass(Opr+"match");
return 1;
}
if(MatchWith=="OFFICE PHONE")
{
temp=Opr+"ophone";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"ophone").addClass(Opr+"match");
return 2;
}
if(MatchWith=="MOBILE NUMBER")
{
temp=Opr+"mobile";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"mobile").addClass(Opr+"match");
return 3;
}
if(MatchWith=="NAME AND DOB")
{
temp="name,"+Opr+"name,dob,"+Opr+"dob";
Opr=="ear" ? ctrlear=temp : ctrlneg=temp;
$("#"+Opr+"name").addClass(Opr+"match");
$("#name").addClass(Opr+"match");
$("#"+Opr+"dob").addClass(Opr+"match");
$("#dob").addClass(Opr+"match");
return 3;
}
}
function resetMarking(Opr)
{
var ctrls=null;
if(ctrlear.length!="" && Opr=="ear")
{
ctrls=ctrlear.split(",");
}
if(ctrlneg.length!="" && Opr=="neg")
{
ctrls=ctrlneg.split(",");
}
if(ctrls!=null)
{
for(i=0;i<ctrls.length;i++)
{
if(ctrls[i]!='')
{
$("#"+ctrls[i]).removeClass(Opr+"match");
}
}
}
}
function addRemarks(Opr,elemId)
{
var val=$("#"+elemId).val();
if(Opr==1 && earIndx > 0)
{
val= val.trim()=='' ? '':val+"\n\n";
$("#"+elemId).val(val+""+earlier[earpos][2]);
findRecord(3,Opr);
}
else if(Opr==2 && negIndx > 0)
{
val= val.trim()=='' ? '':val+"\n\n";
$("#"+elemId).val(val+""+negative[negpos][2]);
findRecord(3,Opr);
}
else
{
CallMessage('DEDDO:info:No match found.',3000,200,300);
}
}
function editRemarks(elmId,Opr)
{
if(confirm("Are you sure to remove current record remarks?"))
{
var rem=$("#"+elmId).val();
if(Opr==1 && rem.length > 0)
{
rem=rem.replace(earlier[earpos][2],"");
}
else if(Opr==2 && rem.length > 0)
{
rem=rem.replace(negative[negpos][2],"");
}
$("#"+elmId).val(rem);
}
}
function InitSendDedupe()
{
if($("#casetobesend >tbody >tr").length<1)
{
$("#btngenreport").hide();
}
$('form tbody.scrollContent tr').hover(function () {
$(this).addClass('rowhover');
}, function () {
$(this).removeClass('rowhover');
});
$('form tbody.scrollContent tr').click(function(event) {
if (event.target.type !== 'checkbox') {
$(':checkbox', this).trigger('click');
}
checkList('chkrow','selall');
});
}
function ValidateSendDedupe(formname)
{
setHFList("casetobesend");
var uuids=$("#hfdelstat").val();
if(uuids=='')
{
CallMessage('BKLIST:error:Please select atleast one case to start report generation process.',3000,200,300);
return false;
}
else
{
SubmitForm('senddedreports', '_parent', formname);
}
}

View File

@@ -1,142 +0,0 @@
var childCnt='';
var curProc='ear';
var curStatus='Waiting';
function ExpandList(elmId)
{
$("#"+elmId+"child").toggle();
}
function showDedupePanel(cutList)
{
var optDiv=document.createElement("div");
optDiv.setAttribute("id","FormPanel");
optDiv.setAttribute("class","FormPanel");
optDiv.setAttribute("style","font-family:Tahoma;overflow:visible;padding-right:3px;width:480px");
var ControlsPanel="<table border='0' cellspacing='0' width='100%' class='matrix-form-controls'>";
ControlsPanel=ControlsPanel+"<tr><td style='height:5px;width:210px'></td><td></td></tr>";
ControlsPanel=ControlsPanel+"<tr><td id='tdearlabel' style='height:35px;padding-left:15px;font-weight:normal;font-size:13px' valign='center'>Checking for Earlier</td><td id='tdearrun' height='30' valign='center' style='font-weight:normal;font-size:13px'><font color='#fe8900'>Waiting...</font></td></tr>";
ControlsPanel=ControlsPanel+"<tr><td id='tdneglabel' style='height:35px;font-weight:normal;padding-left:15px;font-size:13px' valign='center'>Checking for Negative</td><td id='tdnegrun' height='30' valign='center' style='font-weight:normal;font-size:13px'><font color='#fe8900'>Waiting...</font></td></tr>";
ControlsPanel=ControlsPanel+"<tr><td colspan='2'><input type='button' class='button' name='btncancel' style='margin-top:5px;float:right' value='Close' id='btncancel' accesskey='C' onclick=\"RemoveDialog(document.getElementById('ProcDialog'))\" /> <input type='button' class='button' name='btnstart' style='margin-top:5px;float:right' value='Start' id='btnstart' accesskey='S' onclick=\"StartDedupeRun('"+cutList+"',document.getElementById('ProcDialog'))\" /></td></tr>";
ControlsPanel=ControlsPanel+"</table>";
optDiv.innerHTML=ControlsPanel;
ShowInputDialog(optDiv,"Checking Earlier and Negative","dedupe","ProcDialog");
}
function StartDedupeRun(cutList,ProcDialog)
{
StartEarlierRun(cutList);
}
function StartEarlierRun(cutList)
{
curProc='ear';
curStatus='Checking for Earlier';
var label="<img src='/matrix/images/arrow_green_r.png' align='absmiddle'/>&nbsp;<font color='black'><b>"+curStatus+"</b></font>";
$("#tdearlabel").html(label);
ProgressBar("tdearrun","Record",cutList,12,"REGULAR");
StartDedupeProcess(cutList,'ear',1);
}
function StartNegativeRun(cutList)
{
curProc='neg';
curStatus='Checking for Negative';
var label="<img src='/matrix/images/arrow_green_r.png' align='absmiddle'/>&nbsp;<font color='black'><b>"+curStatus+"</b></font>";
$("#tdneglabel").html(label);
ProgressBar("tdnegrun","Record",cutList,12,"REGULAR");
StartDedupeProcess(cutList,'neg',2);
}
function updateLabels(Proc)
{
var label="<img src='/matrix/images/check.png' align='absmiddle'/>&nbsp;<font color='black'><b>"+curStatus+"</b></font>";
$("#td"+Proc+"label").html(label);
$("#td"+Proc+"run").html("<font size='1'>Processed : <b>"+nextPos+"</b> Success : <font color='green'><b>"+success+"</b></font> Failed : <font color='red'><b>"+failed+"</b></font> Skipped : <font color='blue'><b>"+skipped+"</b></font></font>");
}
function StartDedupeProcess(cutList,Childid,OprID)
{
success=0;
failed=0;
nextPos=1;
skipped=0;
progresswidth=0;
curPos=1;
SourceTable=cutList;
RowId='';
found=$("#"+SourceTable+" tr").length-1;
progbarwidth=$("#progressbar").width();
ProgPerRec=(progbarwidth/found).toFixed(2);
if(found>0)
{
ExtractSendRecord(Childid,OprID);
}
else
{
CallMessage('EMPTOBX:info:List is empty or already processed.',3000,200,300);
}
}
function ExtractSendRecord(Childid,oprId)
{
RowId=$("#"+SourceTable+" tr:eq("+curPos+")").attr("id").replace("row","");
var uuid=$("#uuid"+RowId).val();
var process=$("#row"+RowId+""+Childid);
var val3=$("#curu").val();
childCnt=Childid;
if($(process).val()=="Y")
{
QryStr="val="+uuid+"&val1="+oprId+"&val2=Y&val3="+val3;
RunAjax("GET","checkdedupe",QryStr,oprId);
}
else
{
AfterResponse('skipped:',oprId);
}
}
function AfterResponse(AjaxResponse,OprID)
{
if(OprID==1 || OprID==2)
{
if(AjaxResponse.search("success:")==0)
{
success=success+1;
$("#td"+RowId+""+childCnt).attr("bgcolor", '#a6fc8e');
$("#sp"+RowId+""+childCnt).html("D");
$("#row"+RowId+""+childCnt).val("D");
}
else if(AjaxResponse.search("skipped:")==0)
{
skipped=skipped+1;
/*if(OprID==1)
{
curPos=curPos+1;
}
else
{
$("#row"+RowId).remove();
}*/
}
else
{
failed=failed+1;
///$("#imgstatus"+RowId).attr("src", "/matrix/images/smsfailed.png");
$("#row"+RowId).attr("title", AjaxResponse);
$("#sp"+RowId+""+childCnt).html("F");
$("#td"+RowId+""+childCnt).attr("bgcolor", "#ffcabf");
}
if((nextPos==found))
{
if(OprID==1)
{
curStatus='Earlier Check Completed.';
updateLabels(curProc);
StartNegativeRun(SourceTable);
}
else
{
curStatus='Negative Check Completed.';
updateLabels(curProc);
}
return 0;
}
curPos=curPos+1;
UpdateProgress();
nextPos=nextPos+1;
ExtractSendRecord(childCnt,OprID);
}
}

View File

@@ -0,0 +1,61 @@
(() => {
"use strict";
const form = document.getElementById("cutoffpending");
if (!form) return;
const submit = (endpoint) => {
form.action = endpoint;
form.target = "_self";
form.submit();
};
const parentRow = (element) => element.closest("tr[data-parent-index]");
const children = (row) => form.querySelector(`tr[data-child-row="${row.dataset.parentIndex}"]`);
const childInputs = (row, field) => children(row)?.querySelectorAll(`[data-child-field="${field}"]`) || [];
const parentInput = (row, field) => row.querySelector(`[data-parent-field="${field}"]`);
const fields = ["allocation", "telesheet", "earlier", "negative", "cutoff"];
const syncParent = (row, field) => {
const inputs = [...childInputs(row, field)];
parentInput(row, field).checked = inputs.length > 0 && inputs.every((input) => input.checked);
};
form.addEventListener("click", (event) => {
const action = event.target.closest("[data-action]")?.dataset.action;
if (action === "refresh") return submit("cutoffpending");
if (action === "save") return submit("savecutoffpending");
if (action !== "toggle") return;
const button = event.target.closest("[data-action='toggle']");
const detail = children(parentRow(button));
detail.hidden = !detail.hidden;
button.setAttribute("aria-expanded", String(!detail.hidden));
button.querySelector(".matrix-row-toggle__chevron").textContent = detail.hidden ? "▶" : "▼";
});
form.addEventListener("change", (event) => {
const parentField = event.target.dataset.parentField;
if (parentField) {
const row = parentRow(event.target);
const affected = parentField === "cutoff" ? fields : [parentField];
affected.forEach((field) => {
parentInput(row, field).checked = event.target.checked;
childInputs(row, field).forEach((input) => { input.checked = event.target.checked; });
});
return;
}
const childField = event.target.dataset.childField;
if (!childField) return;
const detail = event.target.closest("tr[data-child-row]");
const row = form.querySelector(`tr[data-parent-index="${detail.dataset.childRow}"]`);
if (childField === "cutoff") {
fields.forEach((field) => {
const input = event.target.closest("tr[data-child-index]").querySelector(`[data-child-field="${field}"]`);
input.checked = event.target.checked;
syncParent(row, field);
});
} else {
syncParent(row, childField);
}
});
})();

View File

@@ -1,83 +1,73 @@
var curPos=0;
var maxRow=0;
function ValidateSubmitCutOff(FormName)
{
if(ValidateList('chkrow')>0)
{
validate(document.getElementById('batchlist'),'t','');
if (invalidFields>0)
{
CallMessage('VLFRM:error:There are one or more error(s) in form. Please correct them and try again.',3000,200,300);
}
else
{
SubmitForm('savecut','_parent',FormName);
}
}
else
{
CallMessage('VLFRM:error:Please select atleast one portfolio to start cut-off process.',3000,200,300);
}
"use strict";
var curPos = 0;
var maxRow = 0;
function cutoffMessage(message) {
if (window.CygnusNotifications) {
window.CygnusNotifications.showLegacy(message);
return;
}
CallMessage(message, 4000, 200, 300);
}
function ValidateSubmitSms(FormName)
{
SubmitForm('Sms','_parent',FormName);
function submitCutoffForm(formName, endpoint) {
var form = document.forms[formName] || document.getElementById(formName);
if (!form) return false;
form.action = endpoint;
form.target = "_self";
form.submit();
return false;
}
function ValidateSubmitAllocation(FormName)
{
if(ValidateList('chkchild')>0)
{
SubmitForm('savealloc','_parent',FormName);
}
else
{
CallMessage('VLFRM:error:Please select atleast one portfolio to start allocation process.',3000,200,300);
}
function withCsrf(parameters) {
var token = document.querySelector('input[name="_csrf"]');
if (!token) return parameters;
return parameters + "&" + encodeURIComponent(token.name) + "=" + encodeURIComponent(token.value);
}
function ValidateSubmitSopr(FormName)
{
if(ValidateList('chkchild')>0)
{
SubmitForm('sendcasestoopr','_parent',FormName);
}
else
{
CallMessage('VLFRM:error:Please select atleast one portfolio to start send to operation process.',3000,200,300);
}
function requireSelection(prefix, message, formName, endpoint) {
if (ValidateList(prefix) > 0) return submitCutoffForm(formName, endpoint);
cutoffMessage(message);
return false;
}
function ValidateSubmitTelesheet(FormName)
{
if(ValidateList('chkchild')>0)
{
SubmitForm('gentelesheet','_parent',FormName);
function ValidateSubmitCutOff(formName) {
if (ValidateList("chkrow") < 1) {
cutoffMessage("VLFRM:error:Please select at least one portfolio to start the cut-off process.");
return false;
}
else
{
CallMessage('VLFRM:error:Please select atleast one portfolio to start telesheet process.',3000,200,300);
validate(document.getElementById("batchlist"), "t", "");
if (invalidFields > 0) {
cutoffMessage("VLFRM:error:Correct the highlighted fields and try again.");
return false;
}
return submitCutoffForm(formName, "savecut");
}
function ValidateSubmitRefsheet(FormName)
{
if(ValidateList('chkchild')>0)
{
SubmitForm('genrefsheet','_parent',FormName);
}
else
{
CallMessage('VLFRM:error:Please select atleast one portfolio to start reference sheet process.',3000,200,300);
}
function ValidateSubmitSms(formName) { return submitCutoffForm(formName, "Sms"); }
function ValidateSubmitAllocation(formName) {
return requireSelection("chkchild", "VLFRM:error:Select at least one case to allocate.", formName, "savealloc");
}
function InitPage()
{
maxRow=$("#cutlist >tbody >tr").length;
if(maxRow<1)
{
document.getElementById("btnsave").style.display="none";
}
function ValidateSubmitSopr(formName) {
return requireSelection("chkchild", "VLFRM:error:Select at least one case to send to operations.", formName, "sendcasestoopr");
}
function ExpandList(elmId)
{
$("#"+elmId+"child").toggle();
function ValidateSubmitTelesheet(formName) {
return requireSelection("chkchild", "VLFRM:error:Select at least one case for the Tele-Sheet.", formName, "gentelesheet");
}
function ValidateSubmitRefsheet(formName) {
return requireSelection("chkchild", "VLFRM:error:Select at least one case for the Reference Sheet.", formName, "genrefsheet");
}
function InitPage() {
maxRow = document.querySelectorAll("#cutlist > tbody > tr").length;
var saveButton = document.getElementById("btnsave");
if (saveButton) saveButton.hidden = maxRow < 1;
}
function ExpandList(elementId) {
var child = document.getElementById(elementId + "child");
if (child) child.style.display = child.style.display === "none" ? "table-row" : "none";
}
function editMessage(elm,msgfieldId)
{
@@ -141,7 +131,7 @@ function sendSMS(tableId)
}
else
{
CallMessage('EMPTOBX:info:Outbox is empty.',3000,200,300);
cutoffMessage('EMPTOBX:info:Outbox is empty.');
}
}
function getExtractMessage(oprId)
@@ -181,7 +171,7 @@ function FinalizePhotoCase()
if(svstatus==0 && upstatus==1)
{
$("#vid-"+curPos).html("<img src='/matrix/images/loading_small.gif' width='16' height='7' title='please wait, it will take few minutes' />");
QryStr="val0="+uuid+"&val1="+mvcode+"&val2="+($("#usid").val());
QryStr=withCsrf("val0="+encodeURIComponent(uuid)+"&val1="+encodeURIComponent(mvcode)+"&val2="+encodeURIComponent($("#usid").val()));
RunAjax("POST","finalizepcases",QryStr,2);
}
else

View File

@@ -0,0 +1,34 @@
(() => {
"use strict";
const form = document.getElementById("dedupeWorkspace");
const portfolio = document.getElementById("portfolioId");
const table = document.getElementById("dedupeCaseTable");
if (!form || !portfolio || !table) return;
portfolio.addEventListener("change", () => form.requestSubmit());
const openCase = (row) => {
const caseId = row?.dataset.caseId;
if (!caseId) return;
const contextPath = document.body.dataset.contextPath || "";
const url = `${contextPath}/ver/dedupefound?uuid=${encodeURIComponent(caseId)}`;
const dialog = window.MatrixFrameDialog;
if (!dialog?.open) {
window.location.assign(url);
return;
}
dialog.open(url, "Dedupe Details").then((result) => {
if (Number(result) === 1) row.remove();
});
};
table.addEventListener("click", (event) =>
openCase(event.target.closest("tr[data-case-id]")));
table.addEventListener("keydown", (event) => {
if (event.key === "Enter" || event.key === " ") {
event.preventDefault();
openCase(event.target.closest("tr[data-case-id]"));
}
});
})();

View File

@@ -0,0 +1,101 @@
(() => {
"use strict";
const form = document.getElementById("dedupeDetails");
if (!form) return;
const state = { EAR: { rows: [], index: 0 }, NEG: { rows: [], index: 0 } };
const value = (id, next) => {
const element = document.getElementById(id);
if (element && next !== undefined) element.value = next || "";
return element?.value || "";
};
const notify = (type, message, code, referenceId) =>
window.CygnusNotifications?.show({ type, message, code, referenceId });
function address(record) {
return record?.residenceAddress || record?.officeAddress || "";
}
function render(type) {
const group = state[type];
const prefix = type === "EAR" ? "ear" : "neg";
const record = group.rows[group.index];
document.getElementById(type === "EAR" ? "efound" : "nfound").textContent =
group.rows.length ? `(${group.index + 1} / ${group.rows.length} Match Found)` : "(No Match Found)";
document.getElementById(type === "EAR" ? "efoundon" : "nfoundon").textContent =
record ? `Match Found On: ${record.foundOn || ""}` : "No Match Found";
value(`${prefix}name`, record?.customerName);
value(`${prefix}dob`, record?.dob);
value(`${prefix}address`, record ? address(record) : "");
value(`${prefix}rphone`, record?.residencePhone);
value(`${prefix}ophone`, record?.officePhone);
value(`${prefix}mobile`, record?.mobile);
}
async function load() {
const uuid = value("uuid");
try {
const response = await fetch(`${form.dataset.recordsUrl}?uuid=${encodeURIComponent(uuid)}`, {
credentials: "same-origin", headers: { Accept: "application/json" }
});
const payload = await response.json();
if (!response.ok || !payload.success) throw payload.message || {};
state.EAR.rows = payload.data.filter((row) => row.dedupeType === "EAR");
state.NEG.rows = payload.data.filter((row) => row.dedupeType === "NEG");
render("EAR");
render("NEG");
} catch (error) {
notify("danger", error.message || "Matching records could not be loaded.", error.code, error.referenceId);
}
}
window.findRecord = (operation, section) => {
const group = state[section === 1 ? "EAR" : "NEG"];
if (!group.rows.length) return;
if (operation === 1) group.index = 0;
if (operation === 2) group.index = Math.max(0, group.index - 1);
if (operation === 3) group.index = Math.min(group.rows.length - 1, group.index + 1);
if (operation === 4) group.index = group.rows.length - 1;
render(section === 1 ? "EAR" : "NEG");
};
window.addRemarks = (section, elementId) => {
const group = state[section === 1 ? "EAR" : "NEG"];
const record = group.rows[group.index];
if (!record) return notify("warning", "No match found.", "DDP-4001");
const current = value(elementId).trim();
value(elementId, `${current}${current ? "\n\n" : ""}${record.remarks || ""}`);
};
window.editRemarks = (elementId, section) => {
const group = state[section === 1 ? "EAR" : "NEG"];
const remarks = group.rows[group.index]?.remarks;
if (remarks && window.confirm("Remove the selected match remarks?")) {
value(elementId, value(elementId).replace(remarks, "").trim());
}
};
form.addEventListener("submit", async (event) => {
event.preventDefault();
const body = {
uuid: value("uuid"), sessuuid: value("sessuuid"),
earremarks: value("earremarks"), negremarks: value("negremarks")
};
try {
const response = await fetch(form.action, {
method: "POST", credentials: "same-origin",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(body)
});
const payload = await response.json();
if (!response.ok || !payload.success) throw payload.message || {};
notify("success", payload.message.message, payload.message.code);
window.setTimeout(() => window.MatrixDialog?.close(1), 300);
} catch (error) {
notify("danger", error.message || "Dedupe details could not be saved.", error.code, error.referenceId);
}
});
load();
})();

View File

@@ -0,0 +1,127 @@
(function (window, document) {
"use strict";
const endpoint = "/matrix/ver/checkdedupe";
const operations = [
{ id: 1, field: "earlier", label: "Earlier" },
{ id: 2, field: "negative", label: "Negative" }
];
function expandList(id) {
const child = document.getElementById(`${id}child`);
if (child) child.style.display = child.style.display === "none" ? "table-row" : "none";
}
function notify(type, code, message) {
window.CygnusNotifications?.show({ type, code, message, duration: 5000 });
}
function createProgress(label) {
const group = document.createElement("div");
group.className = "mb-3";
group.innerHTML = `<div class="d-flex justify-content-between mb-1"><strong>${label}</strong><span>Waiting</span></div>
<div class="progress" role="progressbar" aria-valuemin="0" aria-valuemax="100">
<div class="progress-bar" style="width:0%"></div>
</div>`;
return group;
}
function createDialog() {
document.getElementById("dedupe-run-modal")?.remove();
const root = document.createElement("div");
root.id = "dedupe-run-modal";
root.className = "modal fade";
root.tabIndex = -1;
root.innerHTML = `<div class="modal-dialog modal-dialog-centered"><div class="modal-content">
<div class="modal-header"><h5 class="modal-title">Checking Earlier and Negative</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div>
<div class="modal-body"></div><div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary js-start">Start</button></div></div></div>`;
const body = root.querySelector(".modal-body");
operations.forEach(operation => body.append(createProgress(operation.label)));
document.body.append(root);
return root;
}
function updateProgress(container, processed, total, counters) {
const percent = total === 0 ? 100 : Math.round((processed / total) * 100);
container.querySelector(".progress-bar").style.width = `${percent}%`;
container.querySelector("span").textContent =
`${processed}/${total} | Success ${counters.success} | Failed ${counters.failed} | Skipped ${counters.skipped}`;
}
async function check(row, operation) {
const response = await fetch(endpoint, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-CSRF-TOKEN": document.getElementById("dedupe-csrf-token")?.value || ""
},
body: JSON.stringify({
documentCaseId: row.dataset.documentCaseId,
operation: operation.id
})
});
const payload = await response.json().catch(() => null);
if (!response.ok || !payload?.success) {
throw new Error(payload?.message?.message || "Dedupe check failed");
}
}
async function runOperation(rows, operation, progress) {
const counters = { success: 0, failed: 0, skipped: 0 };
for (let index = 0; index < rows.length; index += 1) {
const row = rows[index];
const statusCell = row.querySelector(`td[id$="${operation.field === "earlier" ? "ear" : "neg"}"]`);
if (row.dataset[operation.field] !== "Y") {
counters.skipped += 1;
} else {
try {
await check(row, operation);
counters.success += 1;
row.dataset[operation.field] = "D";
if (statusCell) {
statusCell.textContent = "D";
statusCell.classList.add("table-success");
}
} catch (error) {
counters.failed += 1;
if (statusCell) {
statusCell.textContent = "F";
statusCell.title = error.message;
statusCell.classList.add("table-danger");
}
}
}
updateProgress(progress, index + 1, rows.length, counters);
}
return counters;
}
async function run(tableId, modalRoot) {
const rows = Array.from(document.querySelectorAll(`#${CSS.escape(tableId)} tbody tr[data-document-case-id]`));
if (rows.length === 0) {
notify("info", "DDP-2002", "The selected list has no records to process.");
return;
}
const start = modalRoot.querySelector(".js-start");
start.disabled = true;
const progress = modalRoot.querySelectorAll(".modal-body > div");
for (let index = 0; index < operations.length; index += 1) {
await runOperation(rows, operations[index], progress[index]);
}
start.disabled = false;
notify("success", "DDP-2001", "Earlier and negative dedupe checks completed.");
}
document.addEventListener("click", event => {
const runButton = event.target.closest(".js-run-dedupe");
if (!runButton) return;
const modalRoot = createDialog();
modalRoot.querySelector(".js-start").addEventListener("click", () => run(runButton.dataset.table, modalRoot));
window.bootstrap.Modal.getOrCreateInstance(modalRoot).show();
});
window.ExpandList = expandList;
}(window, document));

View File

@@ -0,0 +1,42 @@
(() => {
"use strict";
const form = document.getElementById("senddedupe");
const table = document.getElementById("casetobesend");
const portfolio = document.getElementById("portlist");
const generate = document.getElementById("btngenreport");
if (!form || !table || !portfolio) return;
const checks = () => [...table.querySelectorAll('tbody input[type="checkbox"]')];
const sync = () => {
const selected = checks().filter((item) => item.checked);
document.getElementById("hfdelstat").value = selected.map((item) => item.value).join(",");
document.getElementById("selall").checked = selected.length > 0 && selected.length === checks().length;
};
portfolio.addEventListener("change", () => {
form.action = form.dataset.listUrl;
form.requestSubmit();
});
document.getElementById("selall")?.addEventListener("change", (event) => {
checks().forEach((item) => { item.checked = event.target.checked; });
sync();
});
table.addEventListener("change", sync);
table.addEventListener("click", (event) => {
const row = event.target.closest("tr[data-case-id]");
if (row && event.target.type !== "checkbox") row.querySelector('input[type="checkbox"]')?.click();
});
generate?.addEventListener("click", () => {
sync();
if (!document.getElementById("hfdelstat").value) {
window.CygnusNotifications?.show({
type: "warning", code: "DDP-4002", message: "Select at least one application."
});
return;
}
form.action = form.dataset.generateUrl;
form.requestSubmit();
});
if (!checks().length) generate?.setAttribute("hidden", "hidden");
sync();
})();

View File

@@ -0,0 +1,81 @@
(() => {
"use strict";
const pad = (value) => String(value).padStart(2, "0");
const parseDisplayValue = (value, mode) => {
const pattern = mode === "datetime"
? /^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}):(\d{2})$/
: /^(\d{2})\/(\d{2})\/(\d{4})$/;
const match = value.trim().match(pattern);
if (!match) return "";
const [, day, month, year, hour = "00", minute = "00", second = "00"] = match;
const date = new Date(Number(year), Number(month) - 1, Number(day), Number(hour), Number(minute), Number(second));
if (date.getFullYear() !== Number(year) || date.getMonth() !== Number(month) - 1
|| date.getDate() !== Number(day) || date.getHours() !== Number(hour)
|| date.getMinutes() !== Number(minute) || date.getSeconds() !== Number(second)) return "";
const isoDate = `${year}-${month}-${day}`;
return mode === "datetime" ? `${isoDate}T${hour}:${minute}:${second}` : isoDate;
};
const formatPickerValue = (value, mode) => {
if (!value) return "";
const [datePart, timePart = "00:00:00"] = value.split("T");
const [year, month, day] = datePart.split("-");
if (!year || !month || !day) return "";
if (mode === "date") return `${day}/${month}/${year}`;
const [hour = "00", minute = "00", second = "00"] = timePart.split(":");
return `${day}/${month}/${year} ${pad(hour)}:${pad(minute)}:${pad(second)}`;
};
const initialise = (input) => {
if (input.dataset.datePickerReady === "true") return;
input.dataset.datePickerReady = "true";
const mode = input.dataset.dateMode === "date" ? "date" : "datetime";
const wrapper = document.createElement("span");
wrapper.className = "matrix-date-control";
input.parentNode.insertBefore(wrapper, input);
wrapper.appendChild(input);
const picker = document.createElement("input");
picker.type = mode === "datetime" ? "datetime-local" : "date";
picker.className = "matrix-date-control__picker";
picker.tabIndex = -1;
picker.setAttribute("aria-hidden", "true");
if (mode === "datetime") picker.step = "1";
const button = document.createElement("button");
button.type = "button";
button.className = "matrix-date-control__button";
button.setAttribute("aria-label", mode === "datetime" ? "Choose date and time" : "Choose date");
button.innerHTML = "&#128197;";
wrapper.append(picker, button);
input.closest(".widget")?.classList.add("matrix-date-field");
const syncPicker = () => {
const parsed = parseDisplayValue(input.value, mode);
if (parsed) picker.value = parsed;
};
syncPicker();
picker.addEventListener("change", () => {
input.value = formatPickerValue(picker.value, mode);
input.dispatchEvent(new Event("change", { bubbles: true }));
input.focus();
});
input.addEventListener("change", syncPicker);
button.addEventListener("click", () => {
syncPicker();
if (typeof picker.showPicker === "function") picker.showPicker();
else picker.click();
});
};
const initialiseAll = (root = document) => root.querySelectorAll(".matrix-date-input").forEach(initialise);
document.addEventListener("DOMContentLoaded", () => initialiseAll());
window.CygnusDateTimeInputs = { initialise: initialiseAll };
})();

View File

@@ -43,6 +43,17 @@
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>net.sf.jasperreports</groupId>
<artifactId>jasperreports</artifactId>
<version>${jasperreports.version}</version>
<exclusions>
<exclusion>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>

View File

@@ -218,30 +218,6 @@ public class Ajax {
}
return smsStatus;
}
//--> Running Earlier / Negative Dedupe
@RequestMapping(value="checkdedupe",method=RequestMethod.GET )
public @ResponseBody String checkDedupe(@RequestParam String val, @RequestParam String val1, @RequestParam String val2, @RequestParam String val3)
{
String DedCheckOn=GlobalClass.DateTime("yyyy/MM/dd HH:mm:ss", new java.util.Date());
DBFunctions DBF=new DBFunctions("1007");
DBF.setProcessFlag(true);
String response="failed:";
response=DBF.FetchRunQuery(43, (val+GlobalClass.ColDelim+val1+GlobalClass.ColDelim+val2+GlobalClass.ColDelim+DedCheckOn+GlobalClass.ColDelim+val3+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
response=response.replace(GlobalClass.ColDelim+GlobalClass.RowDelim, "");
return response;
}
//<-- Running Earlier / Negative Dedupe Ends
//--> Earlier / Negative Dedupe Do
@RequestMapping(value="deduperecords",method=RequestMethod.GET )
public @ResponseBody String DedupeRecords(@RequestParam String uuid)
{
DBFunctions DBF=new DBFunctions("1008");
DBF.setProcessFlag(true);
String response="failed:";
response=DBF.FetchRunQuery(56, (uuid+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
response=response.replace(GlobalClass.ColDelim+GlobalClass.RowDelim, GlobalClass.RowDelim);
return response;
}
////<--- OPERATOR ALLOCATION DE ALLOCATION -->
@RequestMapping(value="optralloc",method=RequestMethod.GET )
public @ResponseBody String OprAlloc(@RequestParam String val,@RequestParam String val1,@RequestParam String val2,@RequestParam String val3,@RequestParam String val4,@ModelAttribute(value="Sessvals") Session Sessvals)

View File

@@ -1,276 +0,0 @@
package matrix.nimble.edp.cutoff.controller;
//servlet libraries
import java.util.concurrent.TimeUnit;
import javax.naming.Reference;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
//spring libraries
import matrix.nimble.edp.cutoff.model.Allocation;
import matrix.nimble.edp.cutoff.model.PhotoCases;
import matrix.nimble.edp.cutoff.model.ReferenceSheet;
import matrix.nimble.edp.cutoff.model.SendToOperation;
import matrix.nimble.edp.cutoff.model.Telesheet;
import matrix.nimble.edp.cutoff.model.CutOffList;
import matrix.nimble.model.Session;
import matrix.nimble.utilities.GlobalClass;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
@Controller
@SessionAttributes({"Sessvals"})
public class CutOff {
//---> Start Cut
@RequestMapping(value="cutoff",method=RequestMethod.POST )
public String OpenCutOff(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
CutOffList CList=new CutOffList();
CList.setErrCode("1003");
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
CList.setSessUUID(UUID);
model.addAttribute("cutOff",CList.getCutOffList(Sessvals.getCompanyID(), Sessvals.getBranchID(),Sessvals.getUserID()));
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/cutoff";
}
@RequestMapping(value="savecut",method=RequestMethod.POST )
public String StartCut(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,@ModelAttribute(value="cutOff") CutOffList CList,HttpSession session)
{
CList.setErrCode("1003");
if(session.getAttribute("UUID").toString().equals(CList.getSessUUID()))
{
CList.FinalizeCutoffList(Sessvals.getUserID(),Sessvals.getCompanyID(), Sessvals.getBranchID());
}
else
{
CList.setProcessFlag(true);
CList.setErrMsg("");
}
if(CList.isProcessFlag())
{
CutOffList BlankClist=new CutOffList();
BlankClist.setErrMsg(CList.getErrMsg());
BlankClist.setProcessFlag(false);
model.addAttribute("cutOff",BlankClist);
}
else
{
model.addAttribute("cutOff",CList);
}
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/cutoff";
}
//<--- Start Cut Ends
//---> Allocation
@RequestMapping(value="allocation",method=RequestMethod.POST )
public String Allocation(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
Allocation AList=new Allocation();
AList.setErrCode("1004");
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
AList.setSessUUID(UUID);
model.addAttribute("allocation",AList.getAllocList(Sessvals.getCompanyID(), Sessvals.getBranchID(),Sessvals.getUserID()));
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/allocation";
}
@RequestMapping(value="savealloc",method=RequestMethod.POST )
public String SaveAlloc(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,@ModelAttribute(value="allocation") Allocation AList,HttpSession session)
{
AList.setErrCode("1004");
if(session.getAttribute("UUID").toString().equals(AList.getSessUUID()))
{
AList.FinalizeAllocation(Sessvals.getUserID(),Sessvals.getCompanyID(), Sessvals.getBranchID());
}
else
{
AList.setProcessFlag(true);
AList.setErrMsg("");
}
if(AList.isProcessFlag())
{
Allocation BlankAlloc=new Allocation();
BlankAlloc.setErrMsg(AList.getErrMsg());
BlankAlloc.setProcessFlag(false);
model.addAttribute("allocation",BlankAlloc);
}
else
{
model.addAttribute("allocation",AList);
}
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/allocation";
}
//<--- Allocation Ends
//---> Telesheet
@RequestMapping(value="telesheet",method=RequestMethod.POST )
public String Telesheet(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
Telesheet TList=new Telesheet();
TList.setErrCode("1006");
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
TList.setSessUUID(UUID);
model.addAttribute("telesheet",TList.getTeleList(Sessvals.getCompanyID(), Sessvals.getBranchID(),Sessvals.getUserID()));
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/telesheet";
}
@RequestMapping(value="gentelesheet",method=RequestMethod.POST )
public String GenTelesheet(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,@ModelAttribute(value="telesheet") Telesheet TList,HttpSession session)
{
String Rootdir= request.getServletContext().getRealPath("/");
TList.setErrCode("1006");
if(session.getAttribute("UUID").toString().equals(TList.getSessUUID()))
{
TList.FinalizeTeleSheet(Sessvals.getUserID(),Sessvals.getCompanyID(), Sessvals.getBranchID(),Rootdir);
}
else
{
TList.setProcessFlag(true);
TList.setErrMsg("");
}
if(TList.isProcessFlag())
{
Telesheet BlankTList=new Telesheet();
BlankTList.setTelePDFLink(TList.getTelePDFLink());
BlankTList.setErrMsg(TList.getErrMsg());
BlankTList.setProcessFlag(false);
model.addAttribute("telesheet",BlankTList);
}
else
{
model.addAttribute("telesheet",TList);
}
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/telesheet";
}
//<--- Telesheet Ends
//---> Referencesheet
@RequestMapping(value="refsheet",method=RequestMethod.POST )
public String Refsheet(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
ReferenceSheet RList=new ReferenceSheet();
RList.setErrCode("1006");
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
RList.setSessUUID(UUID);
model.addAttribute("refsheet",RList.getRefList(Sessvals.getCompanyID(), Sessvals.getBranchID(),Sessvals.getUserID()));
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/referencesheet";
}
@RequestMapping(value="genrefsheet",method=RequestMethod.POST )
public String GenRefsheet(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,@ModelAttribute(value="refsheet") ReferenceSheet RList,HttpSession session)
{
String Rootdir= request.getServletContext().getRealPath("/");
RList.setErrCode("1006");
if(session.getAttribute("UUID").toString().equals(RList.getSessUUID()))
{
RList.FinalizeRefList(Sessvals.getUserID(),Sessvals.getCompanyID(), Sessvals.getBranchID(),Rootdir);
}
else
{
RList.setProcessFlag(true);
RList.setErrMsg("");
}
if(RList.isProcessFlag())
{
ReferenceSheet BlankRList=new ReferenceSheet();
BlankRList.setTelePDFLink(RList.getTelePDFLink());
BlankRList.setErrMsg(RList.getErrMsg());
BlankRList.setProcessFlag(false);
model.addAttribute("refsheet",BlankRList);
}
else
{
model.addAttribute("telesheet",RList);
}
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/referencesheet";
}
//<--- Telesheet Ends
//---> Send To Operation
@RequestMapping(value="sendtoopr",method=RequestMethod.POST )
public String GatherCaseList(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
SendToOperation Sopr=new SendToOperation();
Sopr.setErrCode("1007");
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
Sopr.setSessUUID(UUID);
Sopr=Sopr.getRecordList(Sessvals.getCompanyID(), Sessvals.getBranchID(),Sessvals.getUserID());
model.addAttribute("sendtoopr",Sopr);
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/sendtoopr";
}
@RequestMapping(value="sendcasestoopr",method=RequestMethod.POST )
public String SendToOpr(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,@ModelAttribute(value="sendtoopr") SendToOperation Sopr,HttpSession session)
{
Sopr.setErrCode("1004");
if(session.getAttribute("UUID").toString().equals(Sopr.getSessUUID()))
{
Sopr.SendToOpr(Sessvals.getUserID(),Sessvals.getCompanyID(), Sessvals.getBranchID());
}
else
{
Sopr.setProcessFlag(true);
Sopr.setErrMsg("");
}
if(Sopr.isProcessFlag())
{
SendToOperation BSopr=new SendToOperation();
BSopr.setErrMsg(Sopr.getErrMsg());
BSopr.setProcessFlag(false);
model.addAttribute("sendtoopr",BSopr);
}
else
{
model.addAttribute("sendtoopr",Sopr);
}
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/sendtoopr";
}
//<--- Send To Operation Ends
//---> Generate F-SAM List Starts
@RequestMapping(value="photocases",method=RequestMethod.POST )
public String PhotoCaseList(ModelMap model,HttpServletRequest request,@ModelAttribute(value="Sessvals") Session Sessvals,HttpSession session)
{
String UUID=GlobalClass.GenerateUUID();
session.setAttribute("UUID", UUID);
PhotoCases pc=new PhotoCases();
pc.setProcessFlag(true);
pc.setErrCode("16001");
pc.setSessUUID(UUID);
model.addAttribute("caselist",pc.getPhotoCaseList(Sessvals.getBranchID()));
model.addAttribute("pcases",pc);
model.addAttribute("Sessvals",Sessvals);
return "edp/cutoff/mnimblepcases";
}
//<--- Generate F-SAM List Ends
//---> Finalize F-SAM List Starts
@RequestMapping(value="finalizepcases",method=RequestMethod.POST )
public @ResponseBody String PhotoCaseGenerated(@RequestParam String val0,@RequestParam String val1,@RequestParam String val2)
{
String OprTime=GlobalClass.DateTime("yyyy/MM/dd HH:mm:ss", new java.util.Date());
String [] Qvals=new String[4];
Qvals[0]=val0;
Qvals[1]=val1.trim().endsWith("R") ? "res":(val1.trim().endsWith("O") ? "off" : "pro");
Qvals[2]=val2;
Qvals[3]=OprTime;
PhotoCases pc=new PhotoCases();
pc.setProcessFlag(true);
pc.setErrCode("16001");
return pc.FinalizePhotoCaseList(Qvals);
}
//<--- Finalize F-SAM List Ends
}

View File

@@ -0,0 +1,157 @@
package matrix.nimble.edp.cutoff.controller;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import lib.models.Allocation;
import lib.models.CutOffList;
import lib.models.CutoffPending;
import lib.models.ReferenceSheet;
import lib.models.SendToOperation;
import lib.models.Telesheet;
import lib.models.UserSession;
import matrix.nimble.controller.AbstractAuthenticatedController;
import matrix.services.commons.CommonErrorService;
import matrix.services.commons.CommonService;
import matrix.services.edp.CutoffService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class CutOffController extends AbstractAuthenticatedController {
private final CutoffService cutoffService;
public CutOffController(CommonService commonService, CommonErrorService errorService,
CutoffService cutoffService) {
super(commonService, errorService);
this.cutoffService = cutoffService;
}
@RequestMapping(value = "cutoff", method = RequestMethod.POST)
public String cutoff(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("cutoff", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("cutOff", cutoffService.loadCutoff(auth.session()));
return "edp/cutoff/cutoff";
}
@RequestMapping(value = "savecut", method = RequestMethod.POST)
public String saveCut(@ModelAttribute("cutOff") CutOffList request, ModelMap model,
HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("cutoff", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("cutOff", cutoffService.saveCutoff(auth.session(), request));
return "edp/cutoff/cutoff";
}
@RequestMapping(value = "cutoffpending", method = RequestMethod.POST)
public String cutoffPending(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("cutoffpending", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("cutoffpending", cutoffService.loadCutoffPending(auth.session()));
return "edp/cutoff/cutoffpending";
}
@RequestMapping(value = "savecutoffpending", method = RequestMethod.POST)
public String saveCutoffPending(@ModelAttribute("cutoffpending") CutoffPending request,
ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("cutoffpending", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("cutoffpending", cutoffService.saveCutoffPending(auth.session(), request));
return "edp/cutoff/cutoffpending";
}
@RequestMapping(value = "allocation", method = RequestMethod.POST)
public String allocation(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("allocation", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("allocation", cutoffService.loadAllocation(auth.session()));
return "edp/cutoff/allocation";
}
@RequestMapping(value = "savealloc", method = RequestMethod.POST)
public String saveAllocation(@ModelAttribute("allocation") Allocation request, ModelMap model,
HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("allocation", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("allocation", cutoffService.saveAllocation(auth.session(), request));
return "edp/cutoff/allocation";
}
@RequestMapping(value = "telesheet", method = RequestMethod.POST)
public String telesheet(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("telesheet", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("telesheet", cutoffService.loadTelesheet(auth.session()));
return "edp/cutoff/telesheet";
}
@RequestMapping(value = "gentelesheet", method = RequestMethod.POST)
public String generateTelesheet(@ModelAttribute("telesheet") Telesheet request,
ModelMap model, HttpServletRequest servletRequest, HttpSession session,
HttpServletResponse response) {
PageAuthorization auth = authorizePage("telesheet", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("telesheet", cutoffService.generateTelesheet(auth.session(), request,
servletRequest.getServletContext().getRealPath("/")));
return "edp/cutoff/telesheet";
}
@RequestMapping(value = "refsheet", method = RequestMethod.POST)
public String referenceSheet(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("refsheet", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("refsheet", cutoffService.loadReferenceSheet(auth.session()));
return "edp/cutoff/referencesheet";
}
@RequestMapping(value = "genrefsheet", method = RequestMethod.POST)
public String generateReferenceSheet(@ModelAttribute("refsheet") ReferenceSheet request,
ModelMap model, HttpServletRequest servletRequest, HttpSession session,
HttpServletResponse response) {
PageAuthorization auth = authorizePage("refsheet", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("refsheet", cutoffService.generateReferenceSheet(auth.session(), request,
servletRequest.getServletContext().getRealPath("/")));
return "edp/cutoff/referencesheet";
}
@RequestMapping(value = "sendtoopr", method = RequestMethod.POST)
public String sendToOperation(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("sendtoopr", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("sendtoopr", cutoffService.loadSendToOperation(auth.session()));
return "edp/cutoff/sendtoopr";
}
@RequestMapping(value = "sendcasestoopr", method = RequestMethod.POST)
public String saveSendToOperation(@ModelAttribute("sendtoopr") SendToOperation request,
ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("sendtoopr", model, session, response);
if (!auth.isGranted()) return auth.viewName();
model.addAttribute("sendtoopr", cutoffService.sendToOperation(auth.session(), request));
return "edp/cutoff/sendtoopr";
}
@RequestMapping(value = "photocases", method = RequestMethod.POST)
public String photoCases(ModelMap model, HttpSession session, HttpServletResponse response) {
PageAuthorization auth = authorizePage("photocases", model, session, response);
if (!auth.isGranted()) return auth.viewName();
cutoffService.populatePhotoCases(model, auth.session());
return "edp/cutoff/mnimblepcases";
}
@RequestMapping(value = "finalizepcases", method = RequestMethod.POST)
@ResponseBody
public String finalizePhotoCase(@RequestParam String val0, @RequestParam String val1,
@RequestParam String val2, HttpSession session) {
ApiAuthorization auth = authorizeApiPage("photocases", session);
if (!auth.isGranted()) return "error:" + auth.error().getMessage();
return cutoffService.finalizePhotoCase(auth.session(), val0, val1, val2);
}
}

View File

@@ -1,238 +0,0 @@
package matrix.nimble.edp.cutoff.model;
import java.util.ArrayList;
import java.util.List;
import matrix.nimble.utilities.DBFunctions;
import matrix.nimble.utilities.GlobalClass;
import matrix.nimble.utilities.StringFunctions;
import org.apache.commons.collections.FactoryUtils;
import org.apache.commons.collections.list.LazyList;
public class Allocation {
private List<CutOffRecord> allocationlist = LazyList.decorate(new ArrayList(),FactoryUtils.instantiateFactory(CutOffRecord.class));
private String AllocTime;
private String ErrMsg;
private String ErrDesc;
private String ErrCode;
private String SessUUID;
private boolean ProcessFlag;
public List<CutOffRecord> getAllocationlist() {
return allocationlist;
}
public String getAllocTime() {
return AllocTime;
}
public void setAllocTime(String allocTime) {
AllocTime = allocTime;
}
public void setAllocationlist(List<CutOffRecord> allocationlist) {
this.allocationlist = allocationlist;
}
public String getSessUUID() {
return SessUUID;
}
public void setSessUUID(String sessUUID) {
SessUUID = sessUUID;
}
public String getErrMsg() {
return ErrMsg;
}
public void setErrMsg(String errMsg) {
ErrMsg = errMsg;
}
public String getErrDesc() {
return ErrDesc;
}
public void setErrDesc(String errDesc) {
ErrDesc = errDesc;
}
public String getErrCode() {
return ErrCode;
}
public void setErrCode(String errCode) {
ErrCode = errCode;
}
public boolean isProcessFlag() {
return ProcessFlag;
}
public void setProcessFlag(boolean processFlag) {
ProcessFlag = processFlag;
}
public Allocation getAllocList(String CompanyId,String BranchId,String UserId)
{
Allocation AList=new Allocation();
StringFunctions StrFunc=new StringFunctions(getErrCode());
setAllocTime(StrFunc.FormatDate("yyyy/MM/dd HH:mm:ss", new java.util.Date()));
DBFunctions DBF=new DBFunctions(getErrCode());
DBF.setProcessFlag(true);
String [] Vals=(CompanyId+GlobalClass.ColDelim+BranchId+GlobalClass.ColDelim+UserId+GlobalClass.ColDelim).split(GlobalClass.ColDelim);
DBF.FetchRunQuery(27, Vals);
if(DBF.isProcessFlag())
{
String ResultData=DBF.FetchRunQuery(28, Vals); //Generating list of portfolios to be allocated
if(DBF.isProcessFlag())
{
String [][] AllocListData=StrFunc.ConverTo2DArray(ResultData, GlobalClass.RowDelim, GlobalClass.ColDelim);
ArrayList<CutOffRecord> Record=new ArrayList<CutOffRecord>();
for(int RecCount=0;RecCount<AllocListData.length;RecCount++)
{
DBF.setProcessFlag(true);
CutOffRecord CORec=new CutOffRecord();
CORec.setPortfolioid(AllocListData[RecCount][0]);
CORec.setPortname(AllocListData[RecCount][1]);
CORec.setTotrv(Integer.parseInt(AllocListData[RecCount][2]));
CORec.setTotov(Integer.parseInt(AllocListData[RecCount][3]));
CORec.setTotpv(Integer.parseInt(AllocListData[RecCount][4]));
CORec.setIslocked(Integer.parseInt(AllocListData[RecCount][5]));
if(CORec.getIslocked()>0)
{
CORec.setAllocation(false);
}
else
{
CORec.setAllocation(Integer.parseInt(AllocListData[RecCount][6])<=0 ? false:true);
}
CORec.setLockedby(AllocListData[RecCount][7]);
//Collecting records for sublist
String [] Vals1=(CompanyId+GlobalClass.ColDelim+BranchId+GlobalClass.ColDelim+UserId+GlobalClass.ColDelim+CORec.getPortfolioid()+GlobalClass.ColDelim).split(GlobalClass.ColDelim);
String ResultData1=DBF.FetchRunQuery(29, Vals1); //Generating sublist records
if(DBF.isProcessFlag())
{
String [][] SubListData=StrFunc.ConverTo2DArray(ResultData1, GlobalClass.RowDelim, GlobalClass.ColDelim);
ArrayList<CutOffRecord> SubRecord=new ArrayList<CutOffRecord>();
for(int ListCount=0;ListCount<SubListData.length;ListCount++)
{
CutOffRecord SCORec=new CutOffRecord();
SCORec.setMvcode(SubListData[ListCount][0]);
SCORec.setApplno(SubListData[ListCount][1]);
SCORec.setCustomername(SubListData[ListCount][2]);
SCORec.setApptype(SubListData[ListCount][3]);
SCORec.setTotrv(Integer.parseInt(SubListData[ListCount][4]));
SCORec.setTotov(Integer.parseInt(SubListData[ListCount][5]));
SCORec.setTotpv(Integer.parseInt(SubListData[ListCount][6]));
SCORec.setIslocked(Integer.parseInt(SubListData[ListCount][7]));
SCORec.setLockedby(SubListData[ListCount][8]);
SCORec.setAllocation(Integer.parseInt(SubListData[ListCount][9])<=0 ? false:true);
SCORec.setResiloc(SubListData[ListCount][10]);
SCORec.setOffloc(SubListData[ListCount][11]);
SCORec.setProploc(SubListData[ListCount][12]);
SCORec.setUuid(SubListData[ListCount][13]);
SCORec.setPortgroup(SubListData[ListCount][14]);
SubRecord.add(SCORec);
}
CORec.setSublist(SubRecord);
}
Record.add(CORec);
}
AList.setAllocTime(getAllocTime());
AList.setAllocationlist(Record);
AList.setSessUUID(getSessUUID());
AList.setErrCode(getErrCode());
}
else
{
setProcessFlag(false);
setErrDesc(DBF.getErrDesc());
setErrMsg(DBF.getErrMsg());
AList.setErrDesc(DBF.getErrDesc());
AList.setErrMsg(DBF.getErrMsg());
AList.setErrCode(getErrCode());
}
}
else
{
setProcessFlag(false);
setErrDesc(DBF.getErrDesc());
setErrMsg(DBF.getErrMsg());
AList.setErrDesc(DBF.getErrDesc());
AList.setErrMsg(DBF.getErrMsg());
AList.setErrCode(getErrCode());
}
return AList;
}
public void FinalizeAllocation(String UserId,String CompanyId,String BranchId)
{
setProcessFlag(true);
//---> Allocation status
int TotRv=0;
int TotOv=0;
int TotPv=0;
int TotRvAlloc=0;
int TotOvAlloc=0;
int TotPvAlloc=0;
int TotRvFailed=0;
int TotOvFailed=0;
int TotPvFailed=0;
setAllocTime(new StringFunctions(getErrCode()).FormatDate("yyyy/MM/dd HH:mm:ss", new java.util.Date()));
//<--- Allocation status ends
DBFunctions DBF=new DBFunctions(getErrCode());
int PortList=getAllocationlist().size();
for(int LIndx=0;LIndx<PortList;LIndx++)
{
CutOffRecord AllocRec=(CutOffRecord)getAllocationlist().get(LIndx);
/*if (AllocRec.getIslocked()==0 && AllocRec.isAllocation())
{*/
String Portfolioid=AllocRec.getPortfolioid();
int SubList=AllocRec.getSublist().size();
for(int SIndx=0;SIndx<SubList;SIndx++)
{
CutOffRecord SubRec=(CutOffRecord)AllocRec.getSublist().get(SIndx);
if(SubRec.isAllocation())
{
TotRv=TotRv+SubRec.getTotrv();
TotOv=TotOv+SubRec.getTotov();
TotPv=TotPv+SubRec.getTotpv();
}
DBF.setProcessFlag(true);
String Query="";
Query=Query+""+SubRec.getUuid()+""+GlobalClass.ColDelim;
Query=Query+""+(SubRec.isAllocation() ? 1:0)+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getTotrv()+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getTotov()+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getTotpv()+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getResiloc()+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getOffloc()+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getProploc()+""+GlobalClass.ColDelim;
Query=Query+""+getAllocTime()+""+GlobalClass.ColDelim;
Query=Query+""+CompanyId+""+GlobalClass.ColDelim;
Query=Query+""+BranchId+""+GlobalClass.ColDelim;
Query=Query+""+Portfolioid+""+GlobalClass.ColDelim;
Query=Query+""+SubRec.getPortgroup()+""+GlobalClass.ColDelim;
String Temp=DBF.FetchRunQuery(30, Query.split(GlobalClass.ColDelim));
if(DBF.isProcessFlag())
{
if(SubRec.isAllocation())
{
TotRvAlloc=TotRvAlloc+SubRec.getTotrv();
TotOvAlloc=TotOvAlloc+SubRec.getTotov();
TotPvAlloc=TotPvAlloc+SubRec.getTotpv();
}
}
else
{
if(SubRec.isAllocation())
{
TotRvFailed=TotRvFailed+SubRec.getTotrv();;
TotOvFailed=TotOvFailed+SubRec.getTotov();;
TotPvFailed=TotPvFailed+SubRec.getTotpv();;
}
}
}
/*}*/
}
if(TotRvAlloc>0 || TotOvAlloc >0 || TotPvAlloc >0)
{
setErrMsg(getErrCode()+"ALFAIL:Info:Total ("+TotRvAlloc+" / "+TotRv+")-RV, ("+TotOvAlloc+" / "+TotOv+")-OV, ("+TotPvAlloc+" / "+TotPv+")-PV allocated successfully.");
}
else
{
setErrMsg(getErrCode()+"ALFAIL:Error:Allocation failed please try again.");
}
}
}

Some files were not shown because too many files have changed in this diff Show More