From 6aa0454e3a1a7d1d72fd2db738ae39f2d28cff6f Mon Sep 17 00:00:00 2001 From: Wasiullah Khan Jadoon Date: Thu, 22 Jan 2026 15:00:52 +0500 Subject: [PATCH] Fetch pending CRM applications Fetch Single CRM Application By WorkFlowRefNum --- .../InProcessApplicationsController.java | 32 ++++ .../dto/InProcessApplicationsRequestDTO.java | 23 +++ .../client/dto/LazyListRequestDTO.java | 15 ++ .../service/InProcessApplicationsService.java | 160 ++++++++++++++++++ .../configuration/constant/AconnectURI.java | 2 + .../constant/TokenBypassURI.java | 2 + 6 files changed, 234 insertions(+) create mode 100644 aconnect/src/main/java/com/mfsys/aconnect/client/controller/InProcessApplicationsController.java create mode 100644 aconnect/src/main/java/com/mfsys/aconnect/client/dto/InProcessApplicationsRequestDTO.java create mode 100644 aconnect/src/main/java/com/mfsys/aconnect/client/dto/LazyListRequestDTO.java create mode 100644 aconnect/src/main/java/com/mfsys/aconnect/client/service/InProcessApplicationsService.java diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/controller/InProcessApplicationsController.java b/aconnect/src/main/java/com/mfsys/aconnect/client/controller/InProcessApplicationsController.java new file mode 100644 index 0000000..e3c3b6d --- /dev/null +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/controller/InProcessApplicationsController.java @@ -0,0 +1,32 @@ +package com.mfsys.aconnect.client.controller; + +import com.mfsys.aconnect.client.dto.InProcessApplicationsRequestDTO; +import com.mfsys.aconnect.client.service.InProcessApplicationsService; +import com.mfsys.common.configuration.constant.AconnectURI; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +public class InProcessApplicationsController { + + private final InProcessApplicationsService service; + + public InProcessApplicationsController( + InProcessApplicationsService service) { + this.service = service; + } + + @PostMapping(AconnectURI.CHECK_PENDING_APPLICATIONS_URI) + public ResponseEntity getInProcessApplications(@RequestBody InProcessApplicationsRequestDTO request, + @RequestHeader("Authorization") String token, @RequestHeader("SUS_USERCODE") String susUserCode) { + return service.getInProcessApplications(request, token, susUserCode); + } + + @GetMapping(AconnectURI.CHECK_INDIVIDUAL_APPLICATIONS_URI) + public ResponseEntitygetIndividualApplication( + @RequestParam("POR_ORGACODE") String porOrgacode,@RequestParam("formId") String formId, + @RequestParam(value = "includeFields", required = false) String includeFields, + @RequestHeader("Authorization") String token, @RequestHeader("SUS_USERCODE") String susUserCode){ + return service.getPendingIndividualApplication(porOrgacode, formId, includeFields, token, susUserCode); + } +} diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/dto/InProcessApplicationsRequestDTO.java b/aconnect/src/main/java/com/mfsys/aconnect/client/dto/InProcessApplicationsRequestDTO.java new file mode 100644 index 0000000..020e32f --- /dev/null +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/dto/InProcessApplicationsRequestDTO.java @@ -0,0 +1,23 @@ +package com.mfsys.aconnect.client.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InProcessApplicationsRequestDTO { + + private String porOrgacode; + private String plclocacode; + private Integer limit; + + @Builder.Default + private boolean includeRegistrationPending = true; + + @Builder.Default + private boolean includeAuthorizationApproved = true; +} \ No newline at end of file diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/dto/LazyListRequestDTO.java b/aconnect/src/main/java/com/mfsys/aconnect/client/dto/LazyListRequestDTO.java new file mode 100644 index 0000000..782feee --- /dev/null +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/dto/LazyListRequestDTO.java @@ -0,0 +1,15 @@ +package com.mfsys.aconnect.client.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class LazyListRequestDTO { + + private String collection; + private Object filter; + private String sortBy; + private Integer limit; + private List includeFields; +} \ No newline at end of file diff --git a/aconnect/src/main/java/com/mfsys/aconnect/client/service/InProcessApplicationsService.java b/aconnect/src/main/java/com/mfsys/aconnect/client/service/InProcessApplicationsService.java new file mode 100644 index 0000000..e51c148 --- /dev/null +++ b/aconnect/src/main/java/com/mfsys/aconnect/client/service/InProcessApplicationsService.java @@ -0,0 +1,160 @@ +package com.mfsys.aconnect.client.service; + +import com.mfsys.aconnect.client.dto.*; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Service +public class InProcessApplicationsService { + + @Value("${app.crm.uri}") + private String crmURI; + + private final RestTemplate restTemplate; + + public InProcessApplicationsService(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + private Map param(String columnName, Object columnValue, String columnType, String conditionType) { + return Map.of("columnName", columnName, "columnValue", columnValue, + "columnType", columnType, "conditionType", conditionType + ); + } + + private Map buildWorkflowFilter(InProcessApplicationsRequestDTO req) { + List workflowQueries = new ArrayList<>(); + + if (req.isIncludeRegistrationPending()) { + workflowQueries.add(Map.of( + "params", List.of( + param("workFlowStage", "BN_WF_CP_REGISTRATION", "text", "="), + param("applicationStatus", "Pending", "text", "=") + ), + "operator", "$and" + )); + } + if (req.isIncludeAuthorizationApproved()) { + workflowQueries.add(Map.of( + "params", List.of( + param("workFlowStage", "BN_WF_CP_AUTHORIZATION", "text", "="), + param("applicationStatus", "Approved", "text", "="), + param("postProcessCompleted", true, "boolean", "!=") + ), + "operator", "$and" + )); + } + workflowQueries.add(Map.of( + "params", List.of( + param("workFlowStage", "BN_WF_CP_REGISTRATION", "text", "="), + param("applicationStatus", "[\"Rejected\",\"Hold\"]", "text", "in") + ), + "operator", "$and" + )); + return Map.of( + "nestedQuery", workflowQueries, + "operator", "$or" + ); + } + + private LazyListRequestDTO buildLazyListPayload(InProcessApplicationsRequestDTO req) { + + List rootQueries = new ArrayList<>(); + + rootQueries.add(Map.of( + "params", List.of( + param("POR_ORGACODE", req.getPorOrgacode(), "text", "="), + param("POR_ORGACODE_ENTRY", req.getPorOrgacode(), "text", "=") + ), + "operator", "$or" + )); + + rootQueries.add(Map.of( + "params", List.of( + param("PLC_LOCACODE", "[\"" + req.getPlclocacode() + "\"]", "text", "in"), + param("PLC_LOCACODE_ENTRY", "[\"" + req.getPlclocacode() + "\"]", "text", "in") + ), + "operator", "$or" + )); + + rootQueries.add(buildWorkflowFilter(req)); + + LazyListRequestDTO dto = new LazyListRequestDTO(); + dto.setCollection("BN_WF_CP_CUSTOMERPROFILE"); + dto.setFilter(Map.of( + "nestedQuery", rootQueries, + "operator", "$and" + )); + if (req.getLimit() != null) { + dto.setLimit(req.getLimit()); + } + dto.setSortBy("{\"workFlowRefNum\":-1}"); + dto.setIncludeFields(List.of( + "CMP_CUSTCODE", "CMP_FIRSTNAME", "CMP_LASTNAME", "PLC_LOCACODE", "workFlowRefNum", + "applicationStatus", "workFlowStage", "workFlowLog", "postProcessCompleted", "failureCause", + "postProcessInProgress" + )); + + return dto; + } + + public ResponseEntity getInProcessApplications( + InProcessApplicationsRequestDTO request, String token, String susUserCode) { + + String url = crmURI + "/crm" + "/mongodb/lazylist"; + + LazyListRequestDTO payload = buildLazyListPayload(request); + + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", token); + headers.set("POR_ORGACODE", request.getPorOrgacode()); + headers.set("SUS_USERCODE", susUserCode); + headers.setContentType(MediaType.APPLICATION_JSON); + + HttpEntity entity = new HttpEntity<>(payload, headers); + + return restTemplate.exchange( + url, + HttpMethod.POST, + entity, + String.class + ); + } + + public ResponseEntity getPendingIndividualApplication( + String porOrgacode, String formId, String includeFields, String token, String susUserCode) { + + String url = crmURI + "/crm" + "/mongodb/metadata"; + + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url) + .queryParam("POR_ORGACODE", porOrgacode).queryParam("formId", formId); + + if (includeFields != null && !includeFields.isBlank()) { + builder.queryParam("includeFields", includeFields); + } + + HttpHeaders headers = new HttpHeaders(); + headers.set("Authorization", token); + headers.set("POR_ORGACODE", porOrgacode); + headers.set("SUS_USERCODE", susUserCode); + headers.setContentType(MediaType.APPLICATION_JSON); + + + HttpEntity entity = new HttpEntity<>(headers); + + return restTemplate.exchange( + builder.toUriString(), + HttpMethod.GET, + entity, + String.class + ); + } + +} diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java b/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java index 239ed6d..be744dc 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java +++ b/common/src/main/java/com/mfsys/common/configuration/constant/AconnectURI.java @@ -30,6 +30,8 @@ public interface AconnectURI { String GL_TO_ACCOUNT_TRANSACTION_URI = TRANSACTION_URI + "/gl-account"; String INDIVIDUAL_CRM_CREATION_URI = CRM + INDIVIDUAL + "/create"; String APPROVE_INDIVIDUAL_CRM_URI = CRM + INDIVIDUAL + "/approve"; + String CHECK_PENDING_APPLICATIONS_URI = CRM + "/inprocess"; + String CHECK_INDIVIDUAL_APPLICATIONS_URI = CRM + INDIVIDUAL + "/inprocess"; String BUSINESS_CRM_CREATION_URI = CRM + BUSINESS + "/create"; String INDIVIDUAL_DEPOSIT_CREATION_URI = DEPOSIT + INDIVIDUAL + "/create"; String UPDATE_DEPOSIT_CREATION_URI = DEPOSIT + INDIVIDUAL + "/approval"; diff --git a/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java b/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java index 2b5a4ce..2dc4017 100644 --- a/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java +++ b/common/src/main/java/com/mfsys/common/configuration/constant/TokenBypassURI.java @@ -12,6 +12,8 @@ public interface TokenBypassURI { "/aconnect/transactions/accounttogl", "/aconnect/crm/individual/approve", + "/aconnect/crm/inprocess", + "/aconnect/crm/individual/inprocess", "/aconnect/account/miscDetails", "/deposit/account/miscDetails", "/aconnect/account/getAccountDetails",