Edit case issues fixed - Now add case and edit case are working fine

This commit is contained in:
2026-08-02 22:32:54 +05:30
parent 60f9aa05a0
commit bc00515c1b
42 changed files with 623 additions and 374 deletions

1
.vscode/launch.json vendored
View File

@@ -61,6 +61,7 @@
"REDIS_PASSWORD": "M@triXR3d1s@6202",
"REDIS_DATABASE": "1",
"REDIS_SSL": "false",
"CYGNUS_QUERY_CACHE_ENABLED": "false",
"CYGNUS_CLOUD_BASE_URL": "http://localhost:8090",
"CYGNUS_TOKEN_URL": "http://localhost:8090/oauth2/token",
"CYGNUS_CLIENT_ID": "matrix",

View File

@@ -42,6 +42,9 @@ public enum ApplicationMessage {
"The application details were saved successfully.", ""),
APPLICATIONS_LOADED(200, "APP-2002", "Applications loaded",
"The application records were loaded 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."),
APPLICATION_SAVE_FAILED(500, "APP-5001", "Application could not be saved",
"Cygnus could not save the application details.",
"Try again. If the issue continues, share the reference ID with support."),

View File

@@ -0,0 +1,19 @@
package lib.models;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@NoArgsConstructor
public class EditCaseSummary {
private String documentCaseId;
private String mvCode;
private String fileNumber;
private String customerName;
private String applicationType;
private String product;
private String receivedOn;
private String punchedBy;
private String branchCode;
private Short portfolioId;
}

View File

@@ -0,0 +1,10 @@
package lib.models;
import java.util.List;
/** Localities returned to the case-initiation autocomplete. */
public record LocalityData(List<LocalityOption> localities) {
public LocalityData {
localities = localities == null ? List.of() : List.copyOf(localities);
}
}

View File

@@ -0,0 +1,4 @@
package lib.models;
/** One company-authorized locality autocomplete result. */
public record LocalityOption(Integer id, String location, String pincode, String city) {}

View File

@@ -1,3 +0,0 @@
artifactId=cygnus-lib
groupId=com.cygnus
version=1.0.0-SNAPSHOT

View File

@@ -1,12 +0,0 @@
lib/models/CasePunching.class
lib/models/ApiResponse.class
lib/models/ApplicationSaveResult.class
lib/constants/ApplicationMessage.class
lib/models/ApplicationSaveData.class
lib/models/UserSession$UserSessionBuilder.class
lib/models/MessageDetails.class
lib/exceptions/ApplicationException.class
lib/models/Option.class
lib/models/UserSession.class
lib/models/CaseSaveRequest.class
lib/models/ApplicationDetails.class

View File

@@ -1,13 +0,0 @@
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/constants/ApplicationMessage.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/exceptions/ApplicationException.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/ApiResponse.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/ApplicationDetails.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/ApplicationSaveData.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/ApplicationSaveResult.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/CasePunching.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/CaseSaveRequest.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/DuplicateDetailsData.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/MessageDetails.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/Option.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/PunchedRecordsData.java
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/main/java/lib/models/UserSession.java

View File

@@ -1 +0,0 @@
/Users/maddy/Projects/cygnus/matrix/cygnus-lib/src/test/java/lib/models/MessageDetailsTest.java

View File

@@ -13,7 +13,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/editcases.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/punching/edit-cases.js?ver=1" 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" />
@@ -21,11 +21,10 @@
<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/edit-cases-v1.css?v=1" rel="stylesheet" type="text/css" />
<title>Cygnus 1.0 | Edit Cases</title>
<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" />
<link href="/matrix/css/edit-cases-v1.css?v=8" rel="stylesheet" type="text/css" />
</head>
<body class="matrix-shell matrix-v2 matrix-tool-workspace matrix-edit-cases">
<div id='PageFrame'>
@@ -33,22 +32,22 @@
<%@ include file="/WEB-INF/app/fragments/app-title.jspf" %>
<!-- -->
<div id="formcontainer" class="matrix-tool-workspace__content">
<form:form method="post" name="caseGrid" id="caseGrid" modelAttribute="caseGrid" target="_blank">
<form:form method="post" name="caseGrid" id="caseGrid" modelAttribute="caseGrid" target="_parent">
<!-- 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('caselist','_parent','caseGrid')">
<form:select path="PortfolioId" multiple="false" id="portlist" cssClass="matrix-edit-cases__portfolio-select" onchange="SubmitForm('caselist','_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]}" />
<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('caselist','_parent','caseGrid')"/>
<button class="matrix-edit-cases__refresh" type="button" title="Refresh Grid" onclick="SubmitForm('caselist','_parent','caseGrid')">
<img src="/matrix/images/reload.png" alt="" />
</button>
</div>
<!-- -->
<div id="TablePanel" class="tableContainer">
@@ -71,17 +70,17 @@
<c:forEach items="${caseList}" var="casedet" varStatus="status">
<tr id="row${status.count}" tabindex="0" title="Open this case for editing">
<td>
<input type="hidden" name="row${status.count}uuid" id="row${status.count}uuid" value="${casedet[0]}" />
<input type="hidden" name="row${status.count}portid" id="row${status.count}portid" value="${casedet[9]}" />
<input type="hidden" name="row${status.count}uuid" id="row${status.count}uuid" value="${casedet.documentCaseId}" />
<input type="hidden" name="row${status.count}portid" id="row${status.count}portid" value="${casedet.portfolioId}" />
${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.mvCode}</td>
<td>${casedet.fileNumber}</td>
<td>${casedet.customerName}</td>
<td>${casedet.applicationType}</td>
<td>${casedet.product}</td>
<td>${casedet.receivedOn}</td>
<td>${casedet.punchedBy}</td>
<td>${casedet.branchCode}</td>
</tr>
</c:forEach>
</tbody>

View File

@@ -27,8 +27,7 @@
<script language="javascript" src="/matrix/js/edp/punching/initiation-validation.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/edp/punching/application-save.js?ver=2" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.js?ver=2" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ajax.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ajax-dynamic-list.js?ver=1" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/ajax-dynamic-list.js?ver=2" 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" />
@@ -41,7 +40,7 @@
<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/punch-workspace-v3.css?v=2" rel="stylesheet" type="text/css" />
<link href="/matrix/css/add-cases-v4.css?v=5" rel="stylesheet" type="text/css" />
<link href="/matrix/css/add-cases-v4.css?v=6" 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" />
@@ -77,6 +76,9 @@
<label class="matrix-form-title__check"><input type="checkbox" name="autocut" checked id="autocut" /> Auto Cut-Off</label>
<c:if test="${pageFormMode==2}">
<input type="hidden" id="portfolio_id" name="portfolioId" value="${pagePortfolioId}" />
<button type="button" class="matrix-edit-back" onclick="history.back()" title="Back to case list">
<span aria-hidden="true">&#8592;</span> Back
</button>
</c:if>
<c:if test="${pageFormMode!=2}">
<div class="divselect matrix-form-title__end" id="divportfolio" style="width:297px;">
@@ -492,8 +494,10 @@
Office Phone-Extn
</div>
<br >
<div class="inputcontainer" style="padding:1px">
<input type="text" id="ophone" name="ophone" maxlength="25" style="width:100px" value="" onblur="validate(this,document.getElementById('otv').checked ? 't':'f','Phone')" />-<input type="text" id="extension" name="extension" style="width:23px" maxlength="10" value="" onblur="validate(this,'f','Extension')" />
<div class="inputcontainer matrix-phone-extension" style="padding:1px">
<input type="text" id="ophone" name="ophone" maxlength="25" value="" onblur="validate(this,document.getElementById('otv').checked ? 't':'f','Phone')" />
<span aria-hidden="true">-</span>
<input type="text" id="extension" name="extension" maxlength="10" value="" aria-label="Office phone extension" onblur="validate(this,'f','Extension')" />
</div>
</div>
</td>

View File

@@ -66,6 +66,40 @@
font-weight: 400;
}
.matrix-add-cases .matrix-phone-extension {
display: grid;
grid-template-columns: minmax(0, 1fr) auto 48px;
align-items: center;
gap: 4px;
}
.matrix-add-cases .matrix-phone-extension > input {
width: 100% !important;
min-width: 0;
}
.matrix-add-cases .matrix-edit-back {
display: inline-flex;
align-items: center;
gap: 5px;
min-height: 28px;
margin-left: auto;
padding: 3px 10px;
color: #245f91;
font-size: 12px;
font-weight: 600;
border: 1px solid #9eb5c8;
border-radius: 4px;
background: #f6f9fb;
}
.matrix-add-cases .matrix-edit-back:hover,
.matrix-add-cases .matrix-edit-back:focus-visible {
color: #fff;
border-color: #28699d;
background: #28699d;
}
.matrix-add-cases .matrix-form-controls .widget:has(#splist),
.matrix-add-cases .matrix-form-controls .widget:has(textarea),
.matrix-add-cases .matrix-form-controls .widget:has(input[id*="Address"]),

View File

@@ -4,19 +4,66 @@
background: #f4f8fb;
}
.matrix-edit-cases .matrix-tool-workspace__content > .title .divselect {
width: min(330px, 38vw) !important;
margin-left: auto;
position: static !important;
.matrix-edit-cases #caseGrid > div > .title {
display: flex !important;
align-items: center;
flex-wrap: nowrap !important;
gap: 7px;
}
.matrix-edit-cases .matrix-tool-workspace__content > .title select {
width: 100% !important;
min-height: 28px;
padding: 3px 28px 3px 7px;
border: 1px solid #9fb1c1;
border-radius: 3px;
background-color: #fff;
.matrix-edit-cases #caseGrid > div > .title > .matrix-title-text {
flex: 0 0 auto;
white-space: nowrap;
}
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__portfolio-select {
width: 0 !important;
min-width: 0;
flex: 1 1 auto;
margin: 0 !important;
font-family: Tahoma, Arial, sans-serif;
font-size: 10pt;
font-weight: 400;
padding: 2px 30px 2px 7px !important;
}
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__refresh {
box-sizing: border-box !important;
width: 27px !important;
height: 27px !important;
min-width: 27px !important;
min-height: 27px !important;
margin: 0 !important;
flex: 0 0 27px;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 0 !important;
border: 0 !important;
border-radius: 0 !important;
outline: 0 !important;
appearance: none;
background: transparent !important;
box-shadow: none !important;
}
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__refresh:hover,
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__refresh:focus,
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__refresh:focus-visible,
.matrix-edit-cases #caseGrid > div > .title > .matrix-edit-cases__refresh:active {
width: 27px !important;
height: 27px !important;
margin: 0 !important;
padding: 0 !important;
border: 0 !important;
outline: 0 !important;
background: transparent !important;
box-shadow: none !important;
}
.matrix-edit-cases .matrix-edit-cases__refresh img {
width: 16px;
height: 16px;
}
.matrix-edit-cases .tableContainer {
@@ -55,12 +102,4 @@
width: 100% !important;
}
.matrix-edit-cases .matrix-tool-workspace__content > .title {
flex-wrap: wrap;
}
.matrix-edit-cases .matrix-tool-workspace__content > .title .divselect {
width: 100% !important;
order: 3;
}
}

View File

@@ -31,7 +31,6 @@ Owner of DHTMLgoodies.com
var ajax_list_externalFile = 'getlocality'; // Path to external file
var minimumLettersBeforeLookup = 1; // Number of letters entered before a lookup is performed.
var ajax_list_objects = new Array();
var ajax_list_cachedLists = new Array();
var ajax_list_activeInput = false;
var ajax_list_activeItem;
@@ -75,11 +74,11 @@ Owner of DHTMLgoodies.com
ajax_list_activeInput.value = tmpValue;
if(document.getElementsByName(ajax_list_activeInput.name + '_hidden')[0])
{
document.getElementsByName(ajax_list_activeInput.name + '_hidden')[0].value = inputObj.id.split("#-#")[0];
document.getElementsByName(ajax_list_activeInput.name + '_hidden')[0].value = inputObj.dataset.localityId;
if(ajax_list_externalFile == 'getlocality')
{
document.getElementsByName(ajax_list_activeInput.name + '_pincode')[0].value = inputObj.id.split("#-#")[1];
document.getElementsByName(ajax_list_activeInput.name + '_citylist')[0].value = inputObj.id.split("#-#")[2];
document.getElementsByName(ajax_list_activeInput.name + '_pincode')[0].value = inputObj.dataset.pincode;
document.getElementsByName(ajax_list_activeInput.name + '_citylist')[0].value = inputObj.dataset.city;
}
}
ajax_options_hide();
@@ -113,7 +112,7 @@ Owner of DHTMLgoodies.com
ajax_optionDiv.innerHTML = '';
ajax_list_activeItem = false;
if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length<=1){
if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length===0){
ajax_options_hide();
return;
}
@@ -123,19 +122,20 @@ Owner of DHTMLgoodies.com
ajax_list_optionDivFirstItem = false;
var optionsAdded = false;
for(var no=0;no<ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length;no++){
if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()][no].length==0)continue;
var locality = ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()][no];
if(!locality || !locality.location)continue;
optionsAdded = true;
var div = document.createElement('DIV');
var items = ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()][no].split(/!C0L!/gi);
if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length==1 && ajax_list_activeInput.value == items[0]){
if(ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()].length==1 && ajax_list_activeInput.value == locality.location){
ajax_options_hide();
return;
}
div.innerHTML = items[items.length-1];
div.id = items[0];
div.textContent = locality.location;
div.dataset.localityId = locality.id;
div.dataset.pincode = locality.pincode || '';
div.dataset.city = locality.city || '';
div.className='optionDiv';
div.onmouseover = function(){ ajax_options_rollOverActiveItem(this,false); };
div.onclick = ajax_option_setValue;
@@ -150,17 +150,6 @@ Owner of DHTMLgoodies.com
}
function ajax_option_list_showContent(ajaxIndex,inputObj,paramToExternalFile,whichIndex)
{
if(whichIndex!=currentListIndex)return;
var letters = inputObj.value;
var content = ajax_list_objects[ajaxIndex].response;
var elements = content.split('!R0W!');
ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()] = elements;
ajax_option_list_buildList(letters,paramToExternalFile);
}
function ajax_option_resize(inputObj)
{
ajax_optionDiv.style.top = (ajax_getTopPos(inputObj) + inputObj.offsetHeight + ajaxBox_offsetY) + 'px';
@@ -246,16 +235,25 @@ Owner of DHTMLgoodies.com
}else{
var tmpIndex=currentListIndex/1;
ajax_optionDiv.innerHTML = '';
var ajaxIndex = ajax_list_objects.length;
ajax_list_objects[ajaxIndex] = new sack();
if(cityval.toUpperCase() == "GURGAON") {
cityval = "Gurugram";
}
//var url = ajax_list_externalFile + '?' + paramToExternalFile + '='+cityval+'&letters=' + inputObj.value.replace(" ","+");
var url = ajax_list_externalFile + '?city='+cityval+'&letters=' + inputObj.value.replace(" ","+");
ajax_list_objects[ajaxIndex].requestFile = url; // Specifying which file to get
ajax_list_objects[ajaxIndex].onCompletion = function(){ ajax_option_list_showContent(ajaxIndex,inputObj,paramToExternalFile,tmpIndex); }; // Specify function that will be executed after file has been found
ajax_list_objects[ajaxIndex].runAJAX(); // Execute AJAX function
var letters=inputObj.value;
var url=ajax_list_externalFile+'?'+new URLSearchParams({city:cityval,letters:letters}).toString();
fetch(url,{method:'GET',credentials:'same-origin',headers:{Accept:'application/json'}})
.then(function(response){return response.json().then(function(body){return {response:response,body:body};});})
.then(function(result){
if(!result.response.ok || !result.body || !result.body.success) throw result.body && result.body.message ? result.body.message : {};
var localities=Array.isArray(result.body.data && result.body.data.localities) ? result.body.data.localities : [];
ajax_list_cachedLists[paramToExternalFile][letters.toLowerCase()]=localities;
if(tmpIndex==currentListIndex) ajax_option_list_buildList(letters,paramToExternalFile);
})
.catch(function(error){
if(tmpIndex!=currentListIndex)return;
ajax_options_hide();
CygnusNotifications.show({type:'danger',code:error.code || 'APP-5002',
message:error.message || 'Cygnus could not load localities.',referenceId:error.referenceId});
});
}

View File

@@ -1,68 +0,0 @@
var currow=0;
var lastrow=0;
function InitPage()
{
$('form tbody.scrollContent tr').hover(function () {
$('#row'+lastrow).removeClass('rowhover');
ResetRow();
$(this).addClass('rowhover');
}, function () {
$(this).removeClass('rowhover');
});
$('form tbody.scrollContent tr').click(function () {
GetRowData(this);
});
}
function ResetRow()
{
currow=0;
lastrow=$('#casetable tr').length-1;
}
function GetRowData(SelectedRow)
{
/*QueryStr="rand="+Math.round(Math.random()*4+1)+"&uuid="+$("#"+SelectedRow.id+"uuid").val()+"&pid="+$("#"+SelectedRow.id+"portid").val();
var retVal=0; // Legacy commented example retained without removed browser API.
if(retVal==1)
{
$("#"+SelectedRow.id+"col").html("<img src='/matrix/images/edited.png' title='Details has been edited successfully. Please click refresh button to see the changes' />");
}*/
$("#uuid").val($("#"+SelectedRow.id+"uuid").val());
SubmitForm("caseedit", "_blank", "caseGrid");
}
function keyListen(param1,param2,e) {
var keycode = e.keyCode;
if(keycode==13)
{
GetRowData(document.getElementById("row"+currow));
}
else
{
if(keycode==40)
{
currow=currow+1;
if(currow>=$('#casetable tr').length){currow=1;lastrow=$('#casetable tr').length-1;}
}
if(keycode==38)
{
currow=currow-1;
if(currow<=0){currow=$('#casetable tr').length-1;lastrow=1;}
}
$('#row'+currow).addClass('rowhover');
$('#row'+lastrow).removeClass('rowhover');
document.getElementById('row'+currow).focus();
lastrow=currow;
}
}
function callkeydownhandler(evnt) {
var ev = evnt;
var focusedRow = ev.target && ev.target.tagName === "TR" ? ev.target : null;
if ((ev.key === "Enter" || ev.keyCode === 13) && focusedRow) {
ev.preventDefault();
GetRowData(focusedRow);
return;
}
keyListen('','',ev);
}
window.document.addEventListener("keydown", callkeydownhandler, false);

View File

@@ -0,0 +1,112 @@
(function () {
"use strict";
var currentRow = 0;
var lastRow = 0;
function rows() {
return Array.prototype.slice.call(document.querySelectorAll("#casetable tbody tr"));
}
function rowNumber(row) {
return Number((row.id || "").replace("row", "")) || 0;
}
function setActiveRow(row) {
if (!row) {
return;
}
rows().forEach(function (item) {
item.classList.remove("rowhover");
});
row.classList.add("rowhover");
currentRow = rowNumber(row);
lastRow = currentRow;
row.focus();
}
function hiddenValue(row, suffix) {
var input = document.getElementById(row.id + suffix);
return input ? input.value : "";
}
function submitForm(action, target, formId) {
if (typeof SubmitForm === "function") {
SubmitForm(action, target, formId);
return;
}
var form = document.getElementById(formId);
if (!form) {
return;
}
form.action = action;
form.target = target;
form.submit();
}
function openRow(row) {
if (!row) {
return;
}
var uuid = hiddenValue(row, "uuid");
var portfolioId = hiddenValue(row, "portid");
if (!uuid || !portfolioId) {
return;
}
document.getElementById("uuid").value = uuid;
document.getElementById("portlist").value = portfolioId;
submitForm("caseedit", "_parent", "caseGrid");
}
function moveSelection(direction) {
var allRows = rows();
if (allRows.length === 0) {
return;
}
var nextIndex = currentRow > 0 ? currentRow - 1 + direction : 0;
if (nextIndex < 0) {
nextIndex = allRows.length - 1;
}
if (nextIndex >= allRows.length) {
nextIndex = 0;
}
setActiveRow(allRows[nextIndex]);
}
function handleKeydown(event) {
var row = event.target && event.target.closest ? event.target.closest("#casetable tbody tr") : null;
if (event.key === "Enter" && row) {
event.preventDefault();
openRow(row);
return;
}
if (event.key === "ArrowDown") {
event.preventDefault();
moveSelection(1);
return;
}
if (event.key === "ArrowUp") {
event.preventDefault();
moveSelection(-1);
}
}
function init() {
rows().forEach(function (row) {
row.addEventListener("mouseenter", function () {
setActiveRow(row);
});
row.addEventListener("click", function () {
openRow(row);
});
});
document.addEventListener("keydown", handleKeydown, false);
}
window.CygnusEditCases = {
init: init,
openRow: openRow
};
window.InitPage = init;
}());

View File

@@ -95,21 +95,6 @@ public class Ajax {
}
return response;
}
@RequestMapping(value="getlocality",method=RequestMethod.POST )
public @ResponseBody String GetLocality(@RequestParam String city, @RequestParam String letters)
{
DBFunctions DBF=new DBFunctions("1001");
DBF.setProcessFlag(true);
String val1="and 1=1";
if(!(city.toUpperCase().equals("-1") || city.toUpperCase().equals("UNKNOWN")))
{
val1="and upper(city)=upper('"+city+"')";
}
String response= DBF.FetchRunQuery(13, (letters.toUpperCase()+GlobalClass.ColDelim+val1+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
response=response.replace(GlobalClass.ColDelim+GlobalClass.RowDelim, GlobalClass.RowDelim);
return response;
}
@RequestMapping(value="listservprovider",method=RequestMethod.POST )
public @ResponseBody String ListServProvider(@RequestParam String city, @RequestParam String letters)
{

View File

@@ -1,60 +0,0 @@
package matrix.nimble.edp.punching.controllers;
import java.util.HashMap;
import jakarta.servlet.http.HttpServletRequest;
import matrix.nimble.edp.punching.model.CaseGrid;
import matrix.nimble.model.Session;
import matrix.nimble.utilities.GlobalClass;
import matrix.nimble.utilities.ModuleFunctions;
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.SessionAttributes;
@Controller
@SessionAttributes({ "Sessvals" })
public class EditCasesGrid {
@RequestMapping(value = "editgrid", method = RequestMethod.POST)
public String OpenEditGrid(ModelMap model, HttpServletRequest request,
@ModelAttribute(value = "Sessvals") Session Sessvals) {
String[][] CaseList = null;
CaseGrid CG = new CaseGrid();
model.addAttribute("Sessvals", Sessvals);
model.addAttribute("caseList", CaseList);
model.addAttribute("caseGrid", CG);
model.addAttribute("portlist", FillPortList(Sessvals.getBranchID(), Sessvals.getUserID()));
return "edp/punching/editcases";
}
@RequestMapping(value = "caselist", method = RequestMethod.POST)
public String ListCases(ModelMap model, HttpServletRequest request,
@ModelAttribute(value = "Sessvals") Session Sessvals,
@ModelAttribute(value = "caseGrid") CaseGrid caseGrid) {
CaseGrid CG = new CaseGrid();
CG.setErrCode("1002");
CG.setPortfolioId(caseGrid.getPortfolioId());
String[][] CaseList = CG.FillCaseList(caseGrid.getPortfolioId(), Sessvals.getBranchID());
if (CG.isProcessFlag()) {
model.addAttribute("caseList", CaseList);
model.addAttribute("caseGrid", CG);
} else {
caseGrid.setErrMsg(CG.getErrMsg());
model.addAttribute("caseList", CaseList);
model.addAttribute("caseGrid", caseGrid);
}
model.addAttribute("Sessvals", Sessvals);
model.addAttribute("portlist", FillPortList(Sessvals.getBranchID(), Sessvals.getUserID()));
return "edp/punching/editcases";
}
public String[][] FillPortList(String BranchId, String userId) {
return new ModuleFunctions("1002").GetResultArray(249,
(BranchId + GlobalClass.ColDelim + userId + GlobalClass.ColDelim).split(GlobalClass.ColDelim));
}
}

View File

@@ -27,6 +27,8 @@ import lib.models.CaseSaveRequest;
import lib.models.MessageDetails;
import lib.models.PunchedRecordsData;
import lib.models.DuplicateDetailsData;
import lib.models.LocalityData;
import matrix.nimble.edp.punching.model.CaseGrid;
import lib.constants.ApplicationMessage;
import matrix.nimble.security.PayloadCryptoService;
import lib.exceptions.ApplicationException;
@@ -42,6 +44,8 @@ public class PunchingController extends AbstractAuthenticatedController {
private static final String CASE_ADD_ROUTE = "caseadd";
private static final String CASE_EDIT_ROUTE = "caseedit";
private static final String DUPLICATE_DETAILS_ROUTE = "findsdet";
private static final String LOCALITY_ROUTE = "getlocality";
private static final String EDIT_GRID_ROUTE = "editgrid";
private final PunchingService punchingService;
private final PayloadCryptoService cryptoService;
@@ -121,6 +125,33 @@ public class PunchingController extends AbstractAuthenticatedController {
}
}
@RequestMapping(value = LOCALITY_ROUTE, method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<ApiResponse<LocalityData>> findLocalities(
@RequestParam("city") String city,
@RequestParam("letters") String letters,
HttpSession httpSession) {
ApiAuthorization authorization = authorizeApiPage(INIT_VIEW_ROUTE, httpSession);
if (!authorization.isGranted()) {
return ResponseEntity.status(authorization.error().getHttpStatus())
.body(ApiResponse.failure(authorization.error()));
}
try {
LocalityData data = punchingService.findLocalities(city, letters, authorization.session());
return ResponseEntity.ok(ApiResponse.success(
data, new MessageDetails(ApplicationMessage.APPLICATIONS_LOADED)));
} catch (ApplicationException exception) {
LOGGER.log(Level.WARNING, "Locality search was rejected", exception);
MessageDetails details = new MessageDetails(exception.getApplicationMessage());
return ResponseEntity.status(details.getHttpStatus()).body(ApiResponse.failure(details));
} catch (RuntimeException exception) {
LOGGER.log(Level.SEVERE, "Unable to search localities", exception);
MessageDetails details = new MessageDetails(ApplicationMessage.INTERNAL_SERVER_ERROR);
return ResponseEntity.status(details.getHttpStatus()).body(ApiResponse.failure(details));
}
}
@RequestMapping(value = "application-save", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
@@ -207,4 +238,52 @@ public class PunchingController extends AbstractAuthenticatedController {
session.getCompanyId(), session.getUserId()));
return "edp/punching/initcase";
}
@RequestMapping(value = EDIT_GRID_ROUTE, method = RequestMethod.POST)
public String openEditGrid(
ModelMap model,
HttpSession httpSession,
HttpServletResponse response) {
PageAuthorization authorization = authorizePage(
EDIT_GRID_ROUTE, model, httpSession, response);
if (!authorization.isGranted()) {
return authorization.viewName();
}
populateEditGrid(model, new CaseGrid(), authorization.session(), false);
return "edp/punching/editcases";
}
@RequestMapping(value = "caselist", method = RequestMethod.POST)
public String listEditableCases(
@ModelAttribute("caseGrid") CaseGrid caseGrid,
ModelMap model,
HttpSession httpSession,
HttpServletResponse response) {
PageAuthorization authorization = authorizePage(
EDIT_GRID_ROUTE, model, httpSession, response);
if (!authorization.isGranted()) {
return authorization.viewName();
}
populateEditGrid(model, caseGrid, authorization.session(), true);
return "edp/punching/editcases";
}
private void populateEditGrid(
ModelMap model, CaseGrid caseGrid, UserSession session, boolean loadCases) {
Short portfolioId = selectedPortfolio(caseGrid);
model.addAttribute("caseGrid", caseGrid);
model.addAttribute("portlist", punchingService.loadEditCasePortfolios(session));
model.addAttribute("caseList", loadCases && portfolioId != null
? punchingService.loadEditableCases(portfolioId, session)
: java.util.List.of());
}
private Short selectedPortfolio(CaseGrid caseGrid) {
try {
short portfolioId = Short.parseShort(caseGrid.getPortfolioId());
return portfolioId > 0 ? portfolioId : null;
} catch (NumberFormatException | NullPointerException ignored) {
return null;
}
}
}

View File

@@ -1,9 +1,5 @@
package matrix.nimble.edp.punching.model;
import matrix.nimble.utilities.DBFunctions;
import matrix.nimble.utilities.GlobalClass;
import matrix.nimble.utilities.StringFunctions;
public class CaseGrid {
private String ErrMsg;
private String ErrDesc;
@@ -48,23 +44,4 @@ public class CaseGrid {
public void setCaseID(String caseID) {
CaseID = caseID;
}
public String[][] FillCaseList(String PortfolioID,String CompBranchId)
{
String [][]CaseList=null;
DBFunctions DBF=new DBFunctions(getErrCode());
DBF.setProcessFlag(true);
String ResultData=DBF.FetchRunQuery(23, (PortfolioID+GlobalClass.ColDelim+CompBranchId+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
if(DBF.isProcessFlag())
{
setProcessFlag(DBF.isProcessFlag());
CaseList=new StringFunctions(getErrCode()).ConverTo2DArray(ResultData, GlobalClass.RowDelim, GlobalClass.ColDelim);
}
else
{
setProcessFlag(false);
setErrMsg(DBF.getErrMsg());
setErrDesc(DBF.getErrDesc());
}
return CaseList;
}
}

View File

@@ -0,0 +1,21 @@
package matrix.nimble.query;
import java.util.Objects;
public final class DirectQueryProvider implements QueryProvider {
private final QuerySource source;
public DirectQueryProvider(QuerySource source) {
this.source = Objects.requireNonNull(source, "source");
}
@Override
public String getQuery(int queryId) {
return source.fetch(queryId);
}
@Override
public String getQuery(String queryKey) {
return source.fetch(queryKey);
}
}

View File

@@ -23,12 +23,14 @@ public class QueryProviderConfiguration implements DisposableBean {
OnPremRedisCacheService cache,
CloudIdentityClient cloudClient,
CloudClientProperties cloudProperties,
@Value("${CYGNUS_QUERY_CACHE_ENABLED:true}") boolean cacheEnabled,
@Value("${CYGNUS_QUERY_CACHE_AES_KEY:}") String configuredKey) {
byte[] key = queryCacheKey(configuredKey, cloudProperties.clientAssertion());
installed = new RedisCachingQueryProvider(
cache,
new CloudQuerySource(cloudClient),
new AesGcmQueryCipher(key));
QuerySource cloudSource = new CloudQuerySource(cloudClient);
installed = cacheEnabled
? new RedisCachingQueryProvider(
cache, cloudSource, new AesGcmQueryCipher(
queryCacheKey(configuredKey, cloudProperties.clientAssertion())))
: new DirectQueryProvider(cloudSource);
QueryProviders.install(installed);
return installed;
}

View File

@@ -25,6 +25,9 @@ import lib.models.MessageDetails;
import lib.models.Option;
import lib.models.PunchedRecordsData;
import lib.models.DuplicateDetailsData;
import lib.models.EditCaseSummary;
import lib.models.LocalityData;
import lib.models.LocalityOption;
import lib.models.UserSession;
import lib.constants.ApplicationMessage;
import lib.exceptions.ApplicationException;
@@ -45,6 +48,9 @@ public class PunchingService {
private static final Short ACTIVE = Short.valueOf((short) 1);
private static final int PUNCHED_RECORDS_QUERY = 24;
private static final int EDIT_CASES_QUERY = 23;
private static final int EDIT_CASE_PORTFOLIOS_QUERY = 249;
private static final int LOCALITY_QUERY = 13;
private static final int RESIDENCE_DETAILS_QUERY = 19;
private static final int OFFICE_DETAILS_QUERY = 20;
private static final int PROPERTY_DETAILS_QUERY = 21;
@@ -100,6 +106,40 @@ public class PunchingService {
}
}
public List<Option> loadEditCasePortfolios(UserSession session) {
requireSessionScope(session);
return commonService.getOptions(EDIT_CASE_PORTFOLIOS_QUERY, new Object[] {
session.getCompanyId(), session.getBranchId(), session.getUserId(),
session.getUserId(), ACTIVE
});
}
public List<EditCaseSummary> loadEditableCases(Short portfolioId, UserSession session) {
requireSessionScope(session);
if (portfolioId == null || portfolioId <= 0) {
throw new ApplicationException(
ApplicationMessage.APPLICATION_VALIDATION_FAILED, "Portfolio is required");
}
try {
return dbExecutor.query(EDIT_CASES_QUERY, new Object[] {
portfolioId, session.getCompanyId(), session.getBranchId()
}, EditCaseSummary.class);
} catch (RuntimeException exception) {
throw databaseFailure(exception);
}
}
private void requireSessionScope(UserSession session) {
if (session == null || session.getCompanyId() == null || session.getBranchId() == null
|| session.getUserId() == null) {
throw new ApplicationException(
ApplicationMessage.SESSION_REQUIRED, "Authenticated session scope is required");
}
if (dbExecutor == null) {
throw new IllegalStateException("Database dependencies are not configured");
}
}
public PunchedRecordsData loadPunchedRecords(
Short portfolioId, String documentCaseId, UserSession session) {
if (dbExecutor == null || objectMapper == null) {
@@ -120,7 +160,7 @@ public class PunchingService {
} catch (ApplicationException exception) {
throw exception;
} catch (RuntimeException exception) {
throw databaseFailure(exception);
throw databaseReadFailure(exception);
}
}
@@ -163,6 +203,37 @@ public class PunchingService {
}
}
public LocalityData findLocalities(String city, String letters, UserSession session) {
if (dbExecutor == null) {
throw new IllegalStateException("Locality dependencies are not configured");
}
String normalizedCity = city == null ? "-1" : city.trim();
String prefix = letters == null ? "" : letters.trim();
if (session == null || session.getBranchId() == null || prefix.isEmpty()
|| prefix.length() > 50 || normalizedCity.length() > 100) {
throw new ApplicationException(
ApplicationMessage.APPLICATION_VALIDATION_FAILED, "Locality search details are invalid");
}
try {
List<LocalityOption> localities = dbExecutor.query(LOCALITY_QUERY, new Object[] {
session.getBranchId(), prefix, normalizedCity, normalizedCity
}).stream().map(row -> new LocalityOption(
row.get("id", Integer.class), rowText(row, "location"),
rowText(row, "pincode").trim(), rowText(row, "city"))).toList();
return new LocalityData(localities);
} catch (ApplicationException exception) {
throw exception;
} catch (RuntimeException exception) {
throw new ApplicationException(
ApplicationMessage.INTERNAL_SERVER_ERROR, "Locality lookup failed", exception);
}
}
private String rowText(RowView row, String column) {
Object value = row.get(column);
return value == null ? "" : value.toString();
}
private Map<String, Object> toPunchedRecord(RowView row) {
Map<String, Object> record = new LinkedHashMap<>();
row.asMap().forEach((name, value) -> {
@@ -249,6 +320,12 @@ public class PunchingService {
ApplicationMessage.APPLICATION_SAVE_FAILED, "Database save failed", exception);
}
private ApplicationException databaseReadFailure(RuntimeException exception) {
return new ApplicationException(
ApplicationMessage.APPLICATION_LOAD_FAILED,
"Database read failed", exception);
}
private boolean blank(String value) { return value == null || value.isBlank(); }
public CasePunching init(

View File

@@ -55,6 +55,37 @@ class PunchingServiceTest {
() -> service.findDuplicateDetails("APP-1", (short) 38, 23, session));
}
@Test
void derivesLocalityCompanyScopeFromSessionBranch() {
AtomicReference<Object[]> parameters = new AtomicReference<>();
Map<String, Object> columns = new LinkedHashMap<>();
columns.put("id", 42);
columns.put("location", "Sector 14");
columns.put("pincode", "122001 ");
columns.put("city", "Gurugram");
CygnusDbExecutor executor = (CygnusDbExecutor) Proxy.newProxyInstance(
getClass().getClassLoader(), new Class<?>[] {CygnusDbExecutor.class},
(proxy, method, args) -> {
if (method.getName().equals("query") && args.length == 2) {
assertEquals(13, args[0]);
parameters.set(((Object[]) args[1]).clone());
return List.of(row(columns));
}
throw new UnsupportedOperationException(method.toString());
});
PunchingService service = new PunchingService(
new CommonService(), executor, new ObjectMapper());
UserSession session = UserSession.builder()
.companyId((short) 3).branchId((short) 7).build();
var result = service.findLocalities(" Gurugram ", " Sec ", session);
assertArrayEquals(new Object[] {(short) 7, "Sec", "Gurugram", "Gurugram"},
parameters.get());
assertEquals(42, result.localities().getFirst().id());
assertEquals("122001", result.localities().getFirst().pincode());
}
@Test
void loadsPunchedRecordsAsFormShapedObjectsAndMergesDynamicFields() {
AtomicReference<Object[]> parameters = new AtomicReference<>();

View File

@@ -13,7 +13,7 @@ final class ImmutableRowView implements RowView {
this.values = Collections.unmodifiableMap(new LinkedHashMap<>(values));
Map<String, Object> index = new LinkedHashMap<>();
values.forEach((name, value) -> index.put(name.toLowerCase(Locale.ROOT), value));
this.normalized = Map.copyOf(index);
this.normalized = Collections.unmodifiableMap(index);
}
@Override

View File

@@ -2,6 +2,7 @@ package com.cygnus.db;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -48,6 +49,17 @@ class JdbcCygnusDbExecutorTest {
assertEquals(1L, row.get("id", Long.class));
}
@Test
void dynamicRowsPreserveNullableDatabaseColumns() {
Map<String, Object> values = new java.util.LinkedHashMap<>();
values.put("NullableColumn", null);
RowView row = new ImmutableRowView(values);
assertNull(row.get("nullablecolumn"));
assertTrue(row.asMap().containsKey("NullableColumn"));
}
@Test
void executesInsertUpdateDeleteAndGeneratedKeys() {
Long id = executor.insert(2, new Object[]{"Mira", true}, Long.class);

View File

@@ -10,7 +10,7 @@ Query9!C0L!select!C0L!select op.opt_value as category,op.val_description from po
Query10!C0L!select!C0L!select control from app_process where page_id=val0 and val1>0 and process_id not in (select process_id from denied_process where portfolio_id=val1 and isdenied=1)
Query11!C0L!select!C0L!select label,control,controlid,valuetypescript,validationscript,style,cssclass,field_id from dynamic_controls where page_id=val0 and portfolio_id=val1
Query12!C0L!select!C0L!select field_id,fieldvalue as valuepart, fieldvalue as textpart from field_value where field_id=val0 order by valorder
Query13!C0L!select!C0L!select colony_id||'#-#'||pincode||'#-#'||city as id,location as location from colony where upper(location) like 'val0%' val1 order by location
Query13!C0L!select!C0L!SELECT c.colony_id AS id, c.location, c.pincode, c.city FROM colony c JOIN company_branch colony_branch ON colony_branch.branch_id = c.branch_id JOIN company_branch requested_branch ON requested_branch.company_id = colony_branch.company_id AND requested_branch.branch_id = ? AND requested_branch.isactive = 1 WHERE upper(c.location) LIKE upper(?) || '%' AND (upper(?) IN ('-1', 'UNKNOWN') OR upper(c.city) = upper(?)) ORDER BY c.location
Query14!C0L!insert!C0L!insert into user_loginhistory (loginid,logintime) values ('val0','val1')
Query15!C0L!update!C0L!update user_loginhistory set logouttime='val0',ipaddr='val1' where logintime='val2' and upper(loginid)=upper('val3')
Query16!C0L!procedure!C0L!select casepunching ('val0','val1',val2,'val3',val4,val5)
@@ -20,8 +20,8 @@ Query19!C0L!select!C0L!select distinct raddr1,raddr2,raddr3,rlandmark,rcolony,(s
Query20!C0L!select!C0L!select distinct companyname,oaddr1,oaddr2,oaddr3,olandmark,ocolony,(select location from colony where colony_id=ocolony) as colo,ocity,opincode,ophone,extension from main where upper(applno)=upper('val0') and portfolio_id=val1 and receivedate='val2' and isdeleted=0 and ocolony>0
Query21!C0L!select!C0L!select distinct paddr1,paddr2,paddr3,plandmark,pcolony,(select location from colony where colony_id=pcolony) as colp,pcity,ppincode from main where upper(applno)=upper('val0') and portfolio_id=val1 and receivedate='val2' and isdeleted=0 and pcolony>0
Query22!C0L!select!C0L!select distinct bankcode,bank_branch_id,product,loanamount,'Co-Applicant' as apptype,contactperson,specialinst from main where upper(applno)=upper('val0') and portfolio_id=val1 and receivedate='val2' and isdeleted=0
Query23!C0L!select!C0L!select uuid, mvcode, upper(applno), upper(customername), upper(apptype),upper(product),to_char(receivedate,'DD-MON-YYYY HH24:MI:SS'),(select displayname from app_user u where u.user_id=addedby),bkbranchcode,portfolio_id from editcasesgrid where portfolio_id=val0 and branch_id=val1 order by receivedate,applno,apptype
Query24!C0L!select!C0L!SELECT mm.case_id,mm.portfolio_id,mm.mvcode,mm.bank_branch_id,mm.applno,mm.product,mm.loanamount,mm.customername,mm.apptype,mm.category,mm.dob,mm.contactperson,mm.mobileno,mm.raddr1,mm.raddr2,mm.raddr3,mm.rlandmark,mm.rcolony AS "Rcolony",mm.rcity,mm.rpincode,mm.rphone,mm.companyname,mm.oaddr1,mm.oaddr2,mm.oaddr3,mm.olandmark,mm.ocolony AS "Ocolony",mm.ocity,mm.opincode,mm.department,mm.designation,mm.ophone,mm.extension,mm.paddr1,mm.paddr2,mm.paddr3,mm.plandmark,mm.pcolony AS "Pcolony",mm.pcity,mm.ppincode,mm.refname1,mm.refaddress1,mm.refcontactno1,mm.refname2,mm.refaddress2,mm.refcontactno2,mm.rv,mm.rtv,mm.ov,mm.otv,mm.pv,mm.refv,mm.docv,mm.rco,mm.rcp,mm.ocp,mm.specialinst,mm.sradd,mm.soadd,mm.spadd,rc.location AS colr,oc.location AS colo,pc.location AS colp,mm.fathername,mm.bankcode,0 AS status,mm.company_id,mm.branch_id,mm.uuid,jsonb_strip_nulls(jsonb_build_object('field1',mm.field1,'field2',mm.field2,'field3',mm.field3,'field4',mm.field4,'field5',mm.field5,'field6',mm.field6,'field7',mm.field7,'field8',mm.field8,'field9',mm.field9,'field10',mm.field10,'field11',mm.field11,'field12',mm.field12,'dtfield1',to_char(mm.dtfield1,'DD/MM/YYYY'),'field150',mm.field150,'field150_2',mm.field150_2))::text AS dynamic_fields FROM main_mainopr mm LEFT JOIN colony rc ON rc.colony_id=mm.rcolony LEFT JOIN colony oc ON oc.colony_id=mm.ocolony LEFT JOIN colony pc ON pc.colony_id=mm.pcolony WHERE (((?<>'' AND mm.uuid=?) OR (?='' AND mm.portfolio_id=? AND COALESCE(mm.cutoffby,0)=0)) AND mm.company_id=? AND mm.branch_id=?) ORDER BY mm.case_id
Query23!C0L!select!C0L!select uuid as document_case_id, mvcode as mv_code, upper(applno) as file_number, upper(customername) as customer_name, upper(apptype) as application_type, upper(product) as product, to_char(receivedate,'DD-MON-YYYY HH24:MI:SS') as received_on, (select displayname from app_user u where u.user_id=addedby) as punched_by, bkbranchcode as branch_code, portfolio_id from editcasesgrid where portfolio_id=? and company_id=? and branch_id=? order by receivedate,applno,apptype
Query24!C0L!select!C0L!SELECT mm.case_id,mm.portfolio_id,mm.mvcode,mm.bank_branch_id,mm.applno,mm.product,mm.loanamount,mm.customername,mm.apptype,mm.category,mm.dob,mm.contactperson,mm.mobileno,mm.raddr1,mm.raddr2,mm.raddr3,mm.rlandmark,mm.rcolony AS "Rcolony",mm.rcity,mm.rpincode,mm.rphone,mm.companyname,mm.oaddr1,mm.oaddr2,mm.oaddr3,mm.olandmark,mm.ocolony AS "Ocolony",mm.ocity,mm.opincode,mm.department,mm.designation,mm.ophone,mm.extension,mm.paddr1,mm.paddr2,mm.paddr3,mm.plandmark,mm.pcolony AS "Pcolony",mm.pcity,mm.ppincode,mm.refname1,mm.refaddress1,mm.refcontactno1,mm.refname2,mm.refaddress2,mm.refcontactno2,mm.rv,mm.rtv,mm.ov,mm.otv,mm.pv,mm.refv,mm.docv,mm.rco,mm.rcp,mm.ocp,mm.specialinst,mm.sradd,mm.soadd,mm.spadd,rc.location AS colr,oc.location AS colo,pc.location AS colp,mm.fathername,mm.bankcode,0 AS status,mm.company_id,mm.branch_id,mm.uuid,jsonb_strip_nulls(jsonb_build_object('field1',mm.field1,'field2',mm.field2,'field3',mm.field3,'field4',mm.field4,'field5',mm.field5,'field6',mm.field6,'field7',mm.field7,'field8',mm.field8,'field9',mm.field9,'field10',mm.field10,'field11',mm.field11,'field12',mm.field12,'dtfield1',to_char(mm.dtfield1,'DD/MM/YYYY'),'field150',mm.field150,'field150_2',mm.field150_2))::text AS dynamic_fields FROM main_mainopr mm LEFT JOIN colony rc ON rc.colony_id=mm.rcolony LEFT JOIN colony oc ON oc.colony_id=mm.ocolony LEFT JOIN colony pc ON pc.colony_id=mm.pcolony WHERE (((?<>'' AND mm.uuid::text=?) OR (?='' AND mm.portfolio_id=? AND COALESCE(mm.cutoffby,0)=0)) AND mm.company_id=? AND mm.branch_id=?) ORDER BY mm.case_id
Query25!C0L!procedure!C0L!select caseediting('update main set val0','val1','val2',val3,val4,val5,val6)
Query26!C0L!procedure!C0L!select createcutofflist('val0')
Query27!C0L!update!C0L!update main_operations set islocked=val2 where cutoffby > 0 and (islocked=0 or islocked=val2) and (allocatedby is null or allocatedby=0) and company_id=val0 and branch_id=val1 and allocation=1
@@ -268,7 +268,7 @@ Query245!C0L!select!C0L!select ba.uid,ba.belt_id,b.beltname,ba.verifier_id,v.ver
Query246!C0L!procedure!C0L!select belttransfer(val0,val1,val2,val3,val4,val5,'val6')
Query247!C0L!select!C0L!select mvcode,applno,customername,(case when rlock=1 then '/matrix/images/locked.png' else '/matrix/images/untick.jpg' end) as rlock,to_char(rlockon,'DD-MON HH24:MM') as rlockon,(case when olock=1 then '/matrix/images/locked.png' else '/matrix/images/untick.jpg' end) as olock,to_char(olockon,'DD-MON HH24:MM') as olockon,(case when plock=1 then '/matrix/images/locked.png' else '/matrix/images/untick.jpg' end) as plock,to_char(plockon,'DD-MON HH24:MM') as plockon,(case when tlock=1 then '/matrix/images/locked.png' else '/matrix/images/untick.jpg' end) as tlock,to_char(tlockon,'DD-MON HH24:MM') as tlockon,(case when fdlock=1 then '/matrix/images/locked.png' else '/matrix/images/untick.jpg' end) as fdlock,to_char(fdlockon,'DD-MON HH24:MM') as fdlockon,rlock as rislock,olock as oislock,plock as pislock,tlock as tislock,fdlock as fdislock,uuid from temp_reporting where branch_id=val0 and (rlock=1 or olock=1 or plock=1 or tlock=1 or fdlock=1) and (sdone=0 or (sdone=1 and uuid in (select uuid from reporting_bksoftupd)))
Query248!C0L!procedure!C0L!select unlockcase('val0','val1',val2,'val3');
Query249!C0L!select!C0L!select portfolio_id,portname from portfolio where branch_id=val0 and (supervisor=val1 or val1=83 or val1=187 or val1=171) and isactive=1 order by portname
Query249!C0L!select!C0L!select portfolio_id as value, portname as label from portfolio where company_id=? and branch_id=? and (supervisor=? or ? in (83,187,171)) and isactive=? order by portname
Query250!C0L!select!C0L!select 0 as verifier_id,'NI' as verifiercode union all select verifier_id,verifiercode from verifier where isactive=1 and branch_id=val0 and verifiertype='VER'
Query252!C0L!procedure!C0L!select updatepov('val0','val1','val2','val3',val4,'val5')
Query253!C0L!select!C0L!select to_char(povdate,'DD/MM/YYYY') as pdate,povtype,remarks from pov where uuid='val0'