Migrated Query - 24 find punchedrecords

This commit is contained in:
2026-08-02 11:49:39 +05:30
parent 0a1b901b12
commit 5acaffc224
33 changed files with 214 additions and 1149 deletions

View File

@@ -40,6 +40,8 @@ public enum ApplicationMessage {
"Refresh the application before submitting it again."),
APPLICATION_SAVED(200, "APP-2001", "Application saved",
"The application details were saved successfully.", ""),
APPLICATIONS_LOADED(200, "APP-2002", "Applications loaded",
"The application records were loaded successfully.", ""),
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,15 @@
package lib.models;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Collections;
/** Form-shaped punched applications returned to the case-initiation workspace. */
public record PunchedRecordsData(List<Map<String, Object>> records) {
public PunchedRecordsData {
records = records == null ? List.of() : records.stream()
.map(record -> Collections.unmodifiableMap(new LinkedHashMap<>(record)))
.toList();
}
}

View File

@@ -1,12 +1,12 @@
lib/models/MessageDetails.class
lib/models/CasePunching.class
lib/exceptions/ApplicationException.class
lib/models/Option.class
lib/models/UserSession.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

@@ -8,4 +8,5 @@
/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/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,329 +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" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Cygnus 1.0 | Document Initiation </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/ui/select.js" 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" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/appjs/punchingdoc.js" type="text/javascript"></script>
<script language="javascript" src="/matrix/js/validator.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" />
<link href="/matrix/css/textbox.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" />
<link href="/matrix/css/autocomplete.css" rel="stylesheet" type="text/css" />
<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/punch-workspace-v3.css?v=1" rel="stylesheet" type="text/css" />
<link href="/matrix/css/add-cases-v4.css?v=5" 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-punch-workspace matrix-add-cases">
<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 method="post" name="docdetails" id="docdetails" >
<!-- Common Details (Section1) Visible for all portfolios-->
<div>
<!-- Title -->
<div class="title matrix-form-title">
<img class="matrix-title-icon" src="/matrix/images/commondet.png" align="absmiddle" />
<span class="matrix-title-text matrix-form-title__heading">Common Details <span id='recfound'></span></span>
<label class="matrix-form-title__field">Skip To <input type="text" class="textbox" style="width:30px" onkeypress="return NumberOnly(event)" onblur="GotoRecord(this)"></label>
<label class="matrix-form-title__field">Search by File No <input type="text" class="textbox" style="width:200px" onblur="SearchRecord(this)"></label>
<!-- Checkbox for AUTO CUT diabled for now -->
<!-- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="checkbox" name="autocut" id="autocut" />&nbsp;Automatic Cut-Off -->
<div class="divselect matrix-form-title__end" id="divportfolio" style="width:167px;">
<select id="portfolio_id" name="portfolio_id" style="width:185px" onchange="SubmitForm('docadd','_parent','docdetails')">
<option value="-1" selected >SELECT PORTFOLIO</option>
<c:forEach items="${portlist}" var="port">
<option value="${port[0]}">${port[1]}</option>
</c:forEach>
</select>
</div>
</div>
<!-- -->
<!-- Form (Section1) -->
<div id="FormPanel1" class="FormPanel">
<table align="center" class="matrix-form-controls" width="99%">
<tr>
<td>
<div style="height:auto;width:16px;float:right;margin-top:4px;">
<div id="btnbedit" onclick="EditBasicDetails()" title="edit basic details" style="background:url('/matrix/images/edit_form.png');height:auto;width:16px;cursor:pointer;margin-top:2px">&nbsp;</div>
<div id="btnbsave" onclick="SaveBasicDetails()" title="save details" style="background:url('/matrix/images/disk.png');height:auto;width:16px;cursor:pointer;margin-top:2px">&nbsp;</div>
<div id="btnbcancel" onclick="CancelEdit()" title="cancel" style="background:url('/matrix/images/msgerror.png');height:auto;width:16px;cursor:pointer;margin-top:6px">&nbsp;</div>
</div>
<div class="widget">
<div class="lblcontainer">
Appl No.
</div>
<div class="inputcontainer">
<input type="text" id="applno" name="applno" maxlength="25" style="width:150px;text-transform:uppercase" value="" disabled="disabled" onblur="if(validate(this,'t','AlphaNumeric')){FindSameDet(this,'A','customername');}" />
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Name
</div>
<div class="inputcontainer">
<input type="text" id="customername" name="customername" maxlength="100" style="width:275px" value="" onblur="validate(this,'t','AlphaSpace');" disabled="disabled" />
</div>
</div>
<div class="widget">
<div class="lblcontainer">
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')" disabled="disabled" />
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Loan Amt
</div>
<div class="inputcontainer">
<input type="text" id="loanamount" name="loanamount" maxlength="15" style="width:115px" value="" onblur="validate(this,'f','LoanAmount');" disabled="disabled" />
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Branch
</div>
<div class="inputcontainer">
<div class="divselect" id="divbranch" style="width:235px;">
<select id="bank_branch_id" name="bank_branch_id" style="width:253px" onblur="validate(this,'t','');" disabled="disabled">
<option value="-1" selected >SELECT</option>
<c:forEach items="${branchlist}" var="brnch">
<option value="${brnch[0]}">${brnch[1]}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Product
</div>
<div class="inputcontainer">
<div class="divselect" id="divproduct" style="width:132px;">
<select id="product" name="product" style="width:150px" onblur="validate(this,'t','');" disabled="disabled">
<option value="-1" selected >SELECT</option>
<c:forEach items="${prodlist}" var="prod">
<option value="${prod[0]}">${prod[1]}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="widget">
<div class="lblcontainer">
App Type
</div>
<div class="inputcontainer">
<div class="divselect" id="divapptype" style="width:135px;">
<select id="apptype" name="apptype" style="width:153px" onblur="validate(this,'t','');" disabled="disabled">
<option value="-1" selected>SELECT</option>
<c:forEach items="${typelist}" var="type">
<option value="${type[0]}">${type[1]}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Category
</div>
<div class="inputcontainer">
<div class="divselect" id="divcategory" style="width:115px;">
<select id="category" name="category" style="width:133px" disabled="disabled">
<option value="-1" selected>SELECT</option>
<c:forEach items="${catlist}" var="cat">
<option value="${cat[0]}">${cat[1]}</option>
</c:forEach>
</select>
</div>
</div>
</div>
${dynamichtml}
<input type="button" class="button" name="btnsave" style="float:right" value="Add Docs" id="btnsave" onclick="return AddDocs();" />
</td>
</tr>
</table>
</div>
<!-- -->
</div>
<!-- -->
<!-- Document Details Visible for portfolios in which document verification could be done-->
<div id="section7">
<!-- Title -->
<div class="title">
<img class="matrix-title-icon" src="/matrix/images/documents.png" />
<span class="matrix-title-text">Document Details</span>
</div>
<!-- -->
<!-- Form (Section1) -->
<div id="FormPanel1" class="FormPanel">
<table align="center" class="matrix-form-controls" width="99%">
<tr>
<td>
<div class="widget">
<div class="lblcontainer">
Document
</div>
<div class="inputcontainer">
<div class="divselect" id="divdoctype" style="width:170px;">
<select id="doctype" name="doctype" style="width:188px" onchange="changeLabel(this)" onblur="validate(this,'t','')">
<option value="-1" uniqueidentifier="Unique No." sprovider="Service Provider" validuno="xxx" ymon="A.Y/Month" validymon="" defsprovider="" genlist="0" selected>SELECT</option>
<c:forEach items="${doclist}" var="doc">
<option value="${doc[0]}" uniqueidentifier="${doc[2]}" sprovider="${doc[3]}" validuno="${doc[4]}" ymon="${doc[5]}" validymon="${doc[6]}" defsprovider="${doc[7]}" genlist="${doc[8]}">${doc[1]}</option>
</c:forEach>
</select>
</div>
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Name
</div>
<div class="inputcontainer">
<input type="text" id="docholdername" name="docholdername" maxlength="100" style="width:200px" value="" onblur="validate(this,'t','AlphaSpace');" />
</div>
</div>
<div class="widget">
<div class="lblcontainer" id="sprovider">
Serivce Provider
</div>
<div class="inputcontainer">
<input type="text" id="serviceprovider" name="serviceprovider" maxlength="100" style="width:200px" value="" onblur="validate(this,'t','SplInstruction');" />
<input type="hidden" id="bank_id" name="serviceprovider_hidden" value="0" />
<input type="hidden" id="serviceprovider_citylist" name="serviceprovider_citylist" value="0" />
</div>
</div>
<div class="widget">
<div class="lblcontainer" id="uniqueidentifier">
Unique No.
</div>
<div class="inputcontainer">
<input type="text" id="uniqueno" name="uniqueno" maxlength="50" style="width:140px" value="" />
</div>
</div>
<div class="widget">
<div class="lblcontainer" id="yearmon">
A.Y/Month
</div>
<div class="inputcontainer">
<input type="text" id="yearmonth" name="yearmonth" maxlength="100" style="width:180px" value="" />
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Location
</div>
<div class="inputcontainer">
<div class="divselect" id="divcity" style="width:120px;" >
<select id="city" name="city" style="width:138px" onblur="validate(this,'t','');">
<option value="-1" selected>SELECT</option>
<option value="CITY" selected>CITY</option>
<option value="SATELLITE CITY">SATELLITE CITY</option>
<option value="OUT STATION">OUT STATION</option>
</select>
</div>
</div>
</div>
<div class="widget">
<div class="lblcontainer">
Vendor
</div>
<div class="inputcontainer">
<div class="divselect" id="divvendor" style="width:120px;">
<select id="vendor_id" name="vendor_id" style="width:138px" onblur="validate(this,'f','');">
<option value="-1" selected>SELECT</option>
</select>
</div>
</div>
</div>
${docdynamichtml}
<input type="button" class="button" name="btnadd" style="float:right" value="Add" id="btnadd" onclick="return AddNewDoc();" />
</td>
</tr>
</table>
</div>
<div id="FormPanel2" class="FormPanel">
<table border="0" cellspacing="0" width="100%" id="casetable">
<thead class="thead">
<tr title="Row Title" id="rowtitle">
<td style="font-size:12px;width:20px">S.No</td>
<td style="font-size:12px;width:150px">Name</td>
<td style="font-size:12px;width:150px">Document</td>
<td style="font-size:12px;width:150px">Provider</td>
<td style="font-size:12px;width:150px">Unique No.</td>
<td style="font-size:12px;width:100px">Extra</td>
<td style="font-size:12px;width:50px">Location</td>
<td style="font-size:12px;width:50px">Vendor</td>
<td style="font-size:12px">Action</td>
</tr>
</thead>
</table>
</div>
<!-- -->
</div>
<input type="hidden" id="dynamicfields" name="dynamicfields" value="${dynamicfields}" />
<input type="hidden" id="docdynamicfields" name="dynamicfields" value="${docdynamicfields}" />
<input type="hidden" id="uuid" name="uuid" value="" />
<input type="hidden" id="case_id" name="case_id" value="" />
<input type="hidden" id="company_id" name="company_id" value="${Sessvals.getCompanyID()}" />
<input type="hidden" id="branch_id" name="branch_id" value="${Sessvals.getBranchID()}" />
<input type="hidden" id="status" name="status" value="" />
<input type="hidden" id="docv" name="docv" value="0" />
<!-- -->
<input type="hidden" id="invalidfields" value="0" />
<c:if test="${formmode gt 0}">
<div style="position:fixed;text-align:right;bottom:0px;width:980px;" class="buttonbar">
<input type="hidden" id="invalidfields" value="0" />
<input type="button" class="button" name="btnfirst" style="margin-left:5px;margin-top:-2px;float:left;width:80px" value="" id="btnfirst" accesskey="F" onclick="findRecord(1)" />
<input type="button" class="button" name="btnprev" style="margin-top:-2px;float:left;width:80px" value="" id="btnprev" accesskey="P" onclick="findRecord(2)" />
<input type="button" class="button" name="btnnext" style="margin-top:-2px;float:left;width:80px" value="" id="btnnext" accesskey="N" onclick="findRecord(3)" />
<input type="button" class="button" name="btnlast" style="margin-top:-2px;float:left;width:80px" value="" id="btnlast" accesskey="L" onclick="findRecord(4)" />
<input type="button" class="button" name="btnadd" style="float:right" value="Add New Record" id="btnadd" accesskey="A" onclick="return AddNewRecord();" />
</div>
</c:if>
</form>
<input type="hidden" id="formmode" name="formmode" value="${formmode}" />
<input type="hidden" id="usid" name="usid" value="${usid}" />
</div>
</div>
</body>
<!-- Page Load Javascript -->
<script language="javascript" type="text/javascript">
InitPage('${portfolio_id}');
</script>
<!-- -->
<!-- Process Message -->
<c:if test="${not empty msg}">
<script language="javascript" type="text/javascript"> CallMessage('${msg}',3000,200,300); </script>
</c:if>
<!-- -->
</html>

View File

@@ -1,403 +0,0 @@
var records=new Array(1);
var fields=new Array(1);
var recIndx = 0;
var recpos = 0;
var FocusAfter="customername";
ajax_list_externalFile = "listservprovider";
var validateHidden = false;
function InitPage(port)
{
centerDivBoth("formcontainer","H");
$("#portfolio_id").val(port);
ManageButtons(true);
$("#btnsave").hide();
if(port>0)
{
if(document.getElementById("ajaxmsg") !== null)
{
CallMessage('1001AJX:warning:Another operation is being processed, please wait..',3000,200,300);
return;
}
LoadingMsg("Fetching records, please wait...","ajaxmsg");
RunAjax("GET","puncheddocrecs","val0="+port+"&val1="+($("#dynamicfields").val()),1);
}
}
function PrepareQStr()
{
var val0='';
var val1='';
var indx=2;
autocut=0;
var lindx=fields[0].length-1;
var cid=$("#case_id").val();
var temp='';
for(indx;indx<lindx;indx++)
{
temp='';
if($("#"+fields[0][indx]).length > 0)
{
if(fields[0][indx]=='docv' || fields[0][indx]=='status')
{
continue;
}
else
{
temp="''"+$("#"+fields[0][indx]).val().replace(/,/g, ' ')+"''";
}
val0=val0+fields[0][indx]+',';
val1=val1+temp+",";
records[recpos][indx]=temp.replace(/\'/g,'');
}
else
{
val0=val0+fields[0][indx]+',';
val1=val1+"NULL,";
records[recpos][indx]=temp.replace(/\'/g,'');
}
}
val1=val1.replace(/&/g,'~AmP~');
return "val0="+val0+"&val1="+val1+"&val2="+cid+"&val3="+($("#uuid").val())+"&val4="+autocut+"&val5="+($("#usid").val())+"&val6="+($("#portfolio_id").val());
}
function GotoRecord(el)
{
recno=el.value;
if(recno!='')
{
if(recno > recIndx || recno <=0)
{
CallMessage('1001IRNG:error:Invalid input. Out of range',3000,200,300);
}
else
{
recpos=recno-1;
FillDetails(recpos);
}
}
}
function AddNewRecord()
{
if(recIndx== 0 || records[recIndx-1][0]!='0')
{
var cols=fields[0].length;
recIndx = recIndx+1;
recpos = recIndx-1;
records[recpos]=new Array(cols);
records[recpos][0]='0';
records[recpos][1]=$("#portfolio_id").val();
records[recpos][cols-4]='0';
records[recpos][cols-3]=$("#company_id").val();
records[recpos][cols-2]=$("#branch_id").val();
records[recpos][cols-1]='';
}
else
{
recpos=recIndx-1;
}
FillDetails(recpos);
}
function AfterResponse(response,oprID)
{
var rindx=0;
if(oprID==1)
{
$("#ajaxmsg").remove();
if(response.trim().search('Error')==-1)
{
var rows=response.split(RowDelim);
for(rindx=0;rindx<rows.length-1;rindx++)
{
var cindx=0;
var cols=rows[rindx].split(ColDelim);
if(rindx==0)
{
fields[rindx]=new Array(cols.length);
}
else
{
records[rindx-1]=new Array(cols.length);
}
for(cindx=0;cindx<cols.length;cindx++)
{
if(rindx==0)
{
fields[rindx][cindx]=cols[cindx];
}
else
{
records[rindx-1][cindx]=cols[cindx];
}
}
}
}
else
{
CallMessage(response,3000,200,300);
}
recIndx= rindx==0 ? rindx : rindx-1;
$("#recfound").html("<b>( 0 / "+(recIndx==0 ? "0" : recIndx)+" )</b>");
recpos=0;
FillDetails(recpos);
}
else if(oprID==2)
{
$("#ajaxmsg").remove();
collen=fields[0].length;
if(response.trim().search('Error')==-1)
{
if(autocut==1)
{
records[recpos][collen-4]='1';
}
if($("#case_id").val()!='0')
{
findRecord(3);
}
else
{
records[recpos][0]=response.split(ColDelim)[0];
records[recpos][collen-1]=response.split(ColDelim)[1];
AddNewRecord();
}
CallMessage('1001IRNG:info:Record updated successfully',3000,200,300);
}
else
{
records[recpos][collen-4]='-1';
CallMessage(response,3000,200,300);
}
}
else if(oprID==3)
{
$("#ajaxmsg").remove();
if(response.trim().search('Error')==-1)
{
CallMessage('1001IRNG:info:Record updated successfully',3000,200,300);
}
else
{
CallMessage(response,3000,200,300);
}
}
else if(oprID==4)
{
if(response.trim().search('Error')==-1)
{
FillDD("vendor_id",response,RowDelim,ColDelim);
if(currow != null)
{
$("#vendor_id").val($("#doclist tr:eq("+currow+")").find('td').eq(6).attr("id"));
}
}
else
{
CallMessage(response,3000,200,300);
}
}
else if(oprID==5)
{
if(response.trim().search('Error')==-1)
{
alert(response);
}
else
{
CallMessage(response,3000,200,300);
}
}
}
function findRecord(arrOpr)
{
tempPos= recpos;
maxLen= recIndx-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;
recpos= tempPos;
FillDetails(recpos);
}
function SearchRecord(elm)
{
var found=false;
var skey=elm.value.trim().toLowerCase();
for(rindx=0;rindx<records.length;rindx++)
{
if(records[rindx][3].trim().toLowerCase().search(skey)>-1)
{
recpos=rindx;
found=true;
FillDetails(recpos);
break;
}
}
if(!found)
{
CallMessage('NOREC1001:error:No record found.',3000,200,300);
}
}
function FillDetails(indx)
{
if(recIndx > 0)
{
CancelEdit();
document.forms['casedetails'].reset();
$("#doclist").html('');
resetDocForm();
$("#recfound").html("<b>( "+(indx+1)+" / "+(recIndx==0 ? "0" : recIndx)+" )</b>");
var cols = fields[0].length;
var findx=0;
for(findx=0;findx < cols;findx++)
{
if($("#"+fields[0][findx]).length > 0)
{
$("#"+fields[0][findx]).val(records[indx][findx]);
}
}
var data = jQuery.parseJSON(records[indx][cols-5].replace('},]}','}]}'));
var tdocs = data.docs.length;
for(indx = 0;indx < tdocs; indx++)
{
var did = data.docs[indx].doc_id;
data.docs[indx].doc_id="0";
AddDocRow(data.docs[indx],did,data.docs[indx].docvendor);
}
document.getElementById("applno").focus();
}
else
{
CallMessage('5005MQRY:error:No records found',3000,200,300);
AddNewRecord();
}
}
function EditBasicDetails()
{
EnableDisableFields(false);
ManageButtons(false);
}
function SaveBasicDetails()
{
if(confirm("Are you sure to update the details?"))
{
var QStr=PrepareQStr();
QStr=QStr+"&val7=2";
if(document.getElementById("ajaxmsg") !== null)
{
CallMessage('1001AJX:warning:Another operation is being processed, please wait..',3000,200,300);
return;
}
LoadingMsg("Updating details, please wait...","ajaxmsg");
RunAjax("POST","updatebdetails",QStr,3);
EnableDisableFields(true);
ManageButtons(true);
}
}
function CancelEdit()
{
SetPrevValues();
EnableDisableFields(true);
ManageButtons(true);
}
function EnableDisableFields(isEnabled)
{
var indx=2;
if(typeof fields[0]!=='undefined')
{
var lindx=fields[0].length-1;
for(indx;indx<lindx;indx++)
{
$("#"+fields[0][indx]).prop("disabled",isEnabled);
}
}
indx=0;
/*$("#applno").prop("disabled",isEnabled);
$("#customername").prop("disabled",isEnabled);
$("#dob").prop("disabled",isEnabled);
$("#loanamount").prop("disabled",isEnabled);
$("#bank_branch_id").prop("disabled",isEnabled);
$("#product").prop("disabled",isEnabled);
$("#apptype").prop("disabled",isEnabled);
$("#category").prop("disabled",isEnabled);*/
}
function SetPrevValues()
{
$("#applno").val(records[recpos][3]);
$("#customername").val(records[recpos][6]);
$("#dob").val(records[recpos][9]);
$("#loanamount").val(records[recpos][5]);
$("#bank_branch_id").val(records[recpos][2]);
$("#product").val(records[recpos][4]);
$("#apptype").val(records[recpos][7]);
$("#category").val(records[recpos][8]);
}
function ManageButtons(bmode)
{
if(bmode)
{
if($("#applno").val().length > 0)
{
$("#btnbedit").show();
$("#btnsave").hide();
$("#section7").show();
}
else
{
$("#btnbedit").hide();
$("#btnsave").show();
$("#section7").hide();
EnableDisableFields(false);
}
$("#btnbsave").hide();
$("#btnbcancel").hide();
}
else
{
$("#btnbedit").hide();
$("#btnbsave").show();
$("#btnbcancel").show();
}
}
function changeLabel(el)
{
$("#uniqueidentifier").html($('option:selected',el).attr("uniqueidentifier"));
$("#sprovider").html($('option:selected',el).attr("sprovider"));
$("#serviceprovider").val($('option:selected',el).attr("defsprovider"));
$("#serviceprovider_hidden").val("0");
if($('option:selected',el).attr("genlist")>0)
{
$("#serviceprovider_citylist").val($('option:selected',el).attr("genlist"));
$("#serviceprovider").attr('onkeyup',"ajax_showOptions(this,event)");
validateHidden = true;
}
else
{
$("#serviceprovider_citylist").val("0");
$("#serviceprovider").removeAttr('onkeyup');
validateHidden = false;
}
$("#uniqueno").attr("onblur","validate(this,'t','"+$('option:selected',el).attr("validuno")+"')");
$("#yearmon").html($('option:selected',el).attr("ymon"));
$("#yearmonth").attr("onblur","validate(this,'f','"+$('option:selected',el).attr("validymon")+"')");
ValidateEntry('f');
GetVerifierList(el);
}
function GetVerifierList(el)
{
$("#vendor_id").empty().append('<option value="-1" selected>SELECT</option>');
if(el.value != '-1')
{
RunAjax("POST","getdocverlist","val0="+el.value,4);
}
}

View File

@@ -56,7 +56,7 @@
function collectDynamicFields() {
const names = value("dynamicfields").split(window.ColDelim || "!C0L!").filter(Boolean);
return names.reduce((result, name) => {
if (/^(?:field(?:[1-9]|1[0-2])|dtfield1)$/.test(name) && element(name)) {
if (/^(?:field(?:[1-9]|1[0-2]|150(?:_2)?)|dtfield1)$/i.test(name) && element(name)) {
result[name] = value(name);
}
return result;
@@ -99,11 +99,10 @@
function applyResult(result, originalApplicationId) {
element("case_id").value = result.applicationId;
if (element("mvcode")) element("mvcode").value = result.mvCode || "";
if (Array.isArray(window.fields?.[0]) && Array.isArray(window.records?.[window.recpos])) {
[["case_id", result.applicationId], ["mvcode", result.mvCode]].forEach(([name, fieldValue]) => {
const index = window.fields[0].indexOf(name);
if (index >= 0) window.records[window.recpos][index] = fieldValue;
});
const currentRecord = window.records?.[window.recpos];
if (currentRecord && !Array.isArray(currentRecord)) {
currentRecord.case_id = result.applicationId;
currentRecord.mvcode = result.mvCode;
}
notify("success", "APP-2001", `Application ${result.mvCode || result.applicationId} saved successfully.`);
if (originalApplicationId === 0 && typeof window.AddNewRecord === "function") window.AddNewRecord();

View File

@@ -6,7 +6,6 @@
* workflow is intentionally isolated in application-save.js.
*/
var records=[];
var fields=[[]];
var recIndx = 0;
var recpos = 0;
var SameAddr=[];
@@ -20,6 +19,7 @@ var selectedAddr=-1;
var FocusAfter="customername";
var CHECKBOX_FIELDS=new Set(["rv","sradd","rtv","ov","soadd","otv","rco","pv","rcp","ocp","spadd","refv","docv"]);
var DUPLICATE_OPERATION={R:19,O:20,P:21,A:22};
var PUNCHED_RECORDS_URL="punchedrecs";
function InitPage()
{
@@ -48,7 +48,7 @@ function InitPage()
return;
}
LoadingMsg("Fetching records, please wait...","ajaxmsg");
RunAjax("GET","punchedrecs","val0="+encodeURIComponent(port)+"&val1="+encodeURIComponent($("#dynamicfields").val())+"&val2="+encodeURIComponent($("#uuid").val()),1);
loadPunchedRecords(port,$("#uuid").val());
}
}
@@ -74,7 +74,7 @@ if(recno!='')
{
for(var index = 0; index < records.length; index++ )
{
if( records[index][4] === recno ) {
if( records[index].applno === recno ) {
recpos = index;
FillDetails(recpos);
break;
@@ -85,19 +85,12 @@ if(recno!='')
}
function AddNewRecord()
{
if(recIndx== 0 || records[recIndx-1][0]!='0')
if(recIndx==0 || String(records[recIndx-1].case_id)!='0')
{
var cols=fields[0].length;
recIndx = recIndx+1;
recpos = recIndx-1;
records[recpos]=Array(cols);
records[recpos][0]='0';
records[recpos][1]=$("#portfolio_id").val();
records[recpos][cols-4]='0';
records[recpos][cols-3]=$("#company_id").val();
records[recpos][cols-2]=$("#branch_id").val();
records[recpos][cols-1]='';
records[recpos][2]='******';
records[recpos]={case_id:'0',portfolio_id:$("#portfolio_id").val(),status:'0',
company_id:$("#company_id").val(),branch_id:$("#branch_id").val(),uuid:'',mvcode:'******'};
}
else
{
@@ -107,27 +100,32 @@ function AddNewRecord()
}
function AfterResponse(response,oprID)
{
if(oprID==1) handleRecordsResponse(response);
else if(oprID>=19 && oprID<=22) handleDuplicateDetailsResponse(response,oprID);
if(oprID>=19 && oprID<=22) handleDuplicateDetailsResponse(response,oprID);
}
function handleRecordsResponse(response)
async function loadPunchedRecords(portfolioId,documentCaseId)
{
$("#ajaxmsg").remove();
var rowCount=0;
if(response.trim().search('Error')==-1)
try
{
var rows=response.split(RowDelim);
fields[0]=rows[0].split(ColDelim);
records=[];
for(var index=1;index<rows.length-1;index++) records.push(rows[index].split(ColDelim));
rowCount=rows.length-1;
}
else CygnusNotifications.showLegacy(response,{duration:3000});
recIndx=rowCount==0 ? 0 : rowCount-1;
var query=new URLSearchParams({portfolioId:portfolioId,documentCaseId:documentCaseId || ""});
var response=await fetch(PUNCHED_RECORDS_URL+"?"+query.toString(),{
method:"GET",credentials:"same-origin",headers:{Accept:"application/json"}
});
var body=await response.json().catch(function(){return null;});
if(!response.ok || !body || !body.success) throw body && body.message ? body.message : {};
records=Array.isArray(body.data && body.data.records) ? body.data.records : [];
recIndx=records.length;
updateRecordCounter(0,recIndx);
recpos=recIndx==0 ? 0 : recIndx-1;
FillDetails(recpos);
}
catch(error)
{
CygnusNotifications.show({type:"danger",code:error.code || "APP-5002",
message:error.message || "Cygnus could not load punched records.",referenceId:error.referenceId});
records=[];recIndx=0;recpos=0;FillDetails(0);
}
finally{$("#ajaxmsg").remove();}
}
function handleDuplicateDetailsResponse(response,oprID)
{
var rows=response.split(RowDelim).slice(0,-1);
@@ -172,8 +170,7 @@ function FillDetails(indx)
{
document.forms['casedetails'].reset();
updateRecordCounter(indx+1,recIndx);
for(var fieldIndex=0;fieldIndex<fields[0].length;fieldIndex++)
fillRecordField(fields[0][fieldIndex],records[indx][fieldIndex]);
Object.keys(records[indx]).forEach(function(fieldName){fillRecordField(fieldName,records[indx][fieldName]);});
$("#btnsave").toggle($("#status").val()!='1');
FireClickEvents();
document.getElementById("applno").focus();
@@ -186,7 +183,7 @@ function FillDetails(indx)
}
function fillRecordField(fieldName,fieldValue)
{
var field=document.getElementById(fieldName);
var field=document.getElementById(fieldName) || dynamicFieldElement(fieldName);
if(!field) return;
if(CHECKBOX_FIELDS.has(fieldName))
{
@@ -195,6 +192,13 @@ function fillRecordField(fieldName,fieldValue)
}
field.value=fieldValue;
}
function dynamicFieldElement(fieldName)
{
var dynamicFields=document.querySelectorAll("#FormPanel6 [id]");
for(var index=0;index<dynamicFields.length;index++)
if(dynamicFields[index].id.toLowerCase()==fieldName.toLowerCase()) return dynamicFields[index];
return null;
}
function updateRecordCounter(current,total)
{
$("#recfound").html("<b>( "+current+" / "+total+" )</b>");

View File

@@ -39,57 +39,6 @@ import org.springframework.web.multipart.MultipartHttpServletRequest;
@Controller
@SessionAttributes({"Sessvals"})
public class Ajax {
@RequestMapping(value="punchedrecs",method=RequestMethod.GET )
public @ResponseBody String PunchedRecords(@RequestParam String val0,@RequestParam String val1,@RequestParam String val2)
{
val1=(val1.replace(GlobalClass.ColDelim, ","));
String fields="case_id,portfolio_id,mvcode,bank_branch_id,applno,product,loanamount,customername,apptype,category,dob,contactperson,mobileno,raddr1,raddr2,raddr3,rlandmark,Rcolony,rcity,rpincode,rphone,companyname,oaddr1,oaddr2,oaddr3,olandmark,Ocolony,ocity,opincode,department,designation,ophone,extension,paddr1,paddr2,paddr3,plandmark,Pcolony,pcity,ppincode,refname1,refaddress1,refcontactno1,refname2,refaddress2,refcontactno2,rv,rtv,ov,otv,pv,refv,docv,rco,rcp,ocp,specialinst,sradd,soadd,spadd,"+val1+"colr,colo,colp,fathername,bankcode,status,company_id,branch_id,uuid";
DBFunctions DBF=new DBFunctions("1001");
DBF.setProcessFlag(true);
if(val2.trim().length() > 20)
{
val0="uuid='"+val2+"'";
}
else
{
val0="portfolio_id="+val0+" and (cutoffby is null or cutoffby=0)";
}
String response= DBF.FetchRunQuery(24, (val0+GlobalClass.ColDelim+val1+GlobalClass.ColDelim+val2+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
fields=fields.replace(",", GlobalClass.ColDelim);
fields=fields+GlobalClass.RowDelim;
if(DBF.isProcessFlag())
{
response=fields+response;
}
else
{
response=DBF.getErrMsg();
response=fields;
}
return response;
}
@RequestMapping(value="puncheddocrecs",method=RequestMethod.GET )
public @ResponseBody String PunchedDocRecords(@RequestParam String val0,@RequestParam String val1)
{
val1=(val1.replace(GlobalClass.ColDelim, ","));
String fields="case_id,portfolio_id,bank_branch_id,applno,product,loanamount,customername,apptype,category,dob,docv,"+val1+"docs,status,company_id,branch_id,uuid";
DBFunctions DBF=new DBFunctions("1001");
DBF.setProcessFlag(true);
String response= DBF.FetchRunQuery(242, (val0+GlobalClass.ColDelim+val1+GlobalClass.ColDelim+"0"+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
fields=fields.replace(",", GlobalClass.ColDelim);
fields=fields+GlobalClass.RowDelim;
if(DBF.isProcessFlag())
{
response=fields+response;
}
else
{
response=DBF.getErrMsg();
response=fields;
}
return response;
}
@RequestMapping(value="uploadservice",method=RequestMethod.POST )
public @ResponseBody String UploadMNimbleCases(@RequestParam String params)
{

View File

@@ -1,128 +0,0 @@
package matrix.nimble.edp.punching.controllers;
//servlet libraries
import java.net.URLDecoder;
import jakarta.servlet.http.HttpServletRequest;
//spring libraries
import matrix.nimble.edp.punching.model.PunchingHandler;
import matrix.nimble.model.Session;
import matrix.nimble.utilities.CommonFunctions;
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.SessionAttributes;
@Controller
@SessionAttributes({ "Sessvals" })
public class Punching {
@RequestMapping(value = "initdocview", method = RequestMethod.POST)
public String InitDocScreen(ModelMap model, HttpServletRequest request,
@ModelAttribute(value = "Sessvals") Session Sessvals) {
PunchingHandler PH = new PunchingHandler();
PH.setErrCode("1901");
model.addAttribute("branchlist", null);
model.addAttribute("prodlist", null);
model.addAttribute("typelist", null);
model.addAttribute("doclist", null);
model.addAttribute("catlist", null);
model.addAttribute("portfolio_id", "-1");
model.addAttribute("Sessvals", Sessvals);
PH.GetDDValues(240, Sessvals.getBranchID().split(GlobalClass.ColDelim));
model.addAttribute("portlist", PH.getOptionvals());
model.addAttribute("formmode", 0);
model.addAttribute("stat", true);
model.addAttribute("msg", "");
return "edp/punching/initdocs";
}
@RequestMapping(value = "docadd", method = RequestMethod.POST)
public String PunchDocs(ModelMap model, HttpServletRequest request,
@ModelAttribute(value = "Sessvals") Session Sessvals) {
String msg = "";
PunchingHandler PH = new PunchingHandler();
CommonFunctions comFunc = new CommonFunctions();
PH.setErrCode("1901");
PH.setPortfolioid(request.getParameter("portfolio_id"));
PH.setProcessFlag(true);
PH.DocDynamicHtml();
if (PH.isProcessFlag()) {
model.addAttribute("dynamichtml", PH.getDynamicpanel());
model.addAttribute("dynamicfields", PH.getDynamicfields());
model.addAttribute("docdynamichtml", PH.getDocdynamicpanel());
model.addAttribute("docdynamicfields", PH.getDocdynamicfields());
} else {
msg = PH.getErrMsg();
}
PH.GetDDValues(240, Sessvals.getBranchID().split(GlobalClass.ColDelim));
model.addAttribute("portlist", PH.getOptionvals());
PH.GetDDValues(4, PH.getPortfolioid().split(GlobalClass.ColDelim));
model.addAttribute("branchlist", PH.getOptionvals());
PH.GetDDValues(5,
(Sessvals.getBranchID() + GlobalClass.ColDelim + "op.description='DOCUMENT' or op.description='APPTYPE'"
+ GlobalClass.ColDelim).split(GlobalClass.ColDelim));
if (PH.getOptionvals() != null) {
model.addAttribute("typelist", comFunc.GetSubArray("APPTYPE", 2, PH.getOptionvals()));
} else {
model.addAttribute("typelist", null);
}
PH.GetDDValues(241, PH.getPortfolioid().split(GlobalClass.ColDelim));
model.addAttribute("doclist", PH.getOptionvals());
PH.GetDDValues(70,
(PH.getPortfolioid() + GlobalClass.ColDelim + "op.description='CATEGORY' or op.description='PRODUCT'"
+ GlobalClass.ColDelim).split(GlobalClass.ColDelim));
if (PH.getOptionvals() != null) {
model.addAttribute("prodlist", comFunc.GetSubArray("PRODUCT", 2, PH.getOptionvals()));
model.addAttribute("catlist", comFunc.GetSubArray("CATEGORY", 2, PH.getOptionvals()));
} else {
model.addAttribute("prodlist", null);
model.addAttribute("catlist", null);
}
model.addAttribute("portfolio_id", PH.getPortfolioid());
model.addAttribute("usid", Sessvals.getUserID());
model.addAttribute("Sessvals", Sessvals);
model.addAttribute("formmode", 1);
model.addAttribute("stat", PH.isProcessFlag());
model.addAttribute("msg", msg);
return "edp/punching/initdocs";
}
@RequestMapping(value = "addeditdoc", method = RequestMethod.POST)
public String AddEditDocs(@RequestParam String val0, @RequestParam String val1, @RequestParam String val2,
@RequestParam String val3, @RequestParam String val4, @RequestParam String val5, @RequestParam String val6,
@RequestParam String val7, @RequestParam String val8, @RequestParam String val9,
@RequestParam String val10) {
String retval = "success";
try {
// System.out.println(URLDecoder.decode(val0,"UTF-8"));
// System.out.println(URLDecoder.decode(val1,"UTF-8"));
// System.out.println(URLDecoder.decode(val2,"UTF-8"));
// System.out.println(URLDecoder.decode(val3,"UTF-8"));
// System.out.println(URLDecoder.decode(val4,"UTF-8"));
// System.out.println(URLDecoder.decode(val6,"UTF-8"));
// System.out.println(URLDecoder.decode(val7,"UTF-8"));
// System.out.println(URLDecoder.decode(val8,"UTF-8"));
// System.out.println(URLDecoder.decode(val9,"UTF-8"));
// System.out.println(URLDecoder.decode(val10,"UTF-8"));
PunchingHandler PH = new PunchingHandler();
PH.setErrCode("1902");
PH.setProcessFlag(true);
PH.AddEditDocs(val0, val1, val2, val3, val4, val6, val7, val8, val9, val10);
} catch (Exception exce) {
retval = exce.getMessage();
}
return retval;
}
}

View File

@@ -25,6 +25,7 @@ import lib.models.ApplicationSaveData;
import lib.models.ApplicationSaveResult;
import lib.models.CaseSaveRequest;
import lib.models.MessageDetails;
import lib.models.PunchedRecordsData;
import lib.constants.ApplicationMessage;
import matrix.nimble.security.PayloadCryptoService;
import lib.exceptions.ApplicationException;
@@ -61,6 +62,34 @@ public class PunchingController extends AbstractAuthenticatedController {
"publicKey", cryptoService.encodedPublicKey()));
}
@RequestMapping(value = "punchedrecs", method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<ApiResponse<PunchedRecordsData>> punchedRecords(
@RequestParam("portfolioId") Short portfolioId,
@RequestParam(value = "documentCaseId", required = false) String documentCaseId,
HttpSession httpSession) {
ApiAuthorization authorization = authorizeApiPage(INIT_VIEW_ROUTE, httpSession);
if (!authorization.isGranted()) {
return ResponseEntity.status(authorization.error().getHttpStatus())
.body(ApiResponse.failure(authorization.error()));
}
try {
PunchedRecordsData data = punchingService.loadPunchedRecords(
portfolioId, documentCaseId, authorization.session());
return ResponseEntity.ok(ApiResponse.success(
data, new MessageDetails(ApplicationMessage.APPLICATIONS_LOADED)));
} catch (ApplicationException exception) {
LOGGER.log(Level.WARNING, "Punched records were 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 load punched records", 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)

View File

@@ -1,88 +0,0 @@
package matrix.nimble.edp.punching.model;
public class DocDetails {
private String portfolioid;
private String bankbranchid;
private String applno;
private String customername;
private String product;
private String apptype;
private String category;
private String loanamount;
private String dob;
private String caseid;
private String uuid;
private int formmode;
public String getPortfolioid() {
return portfolioid;
}
public void setPortfolioid(String portfolioid) {
this.portfolioid = portfolioid;
}
public String getBankbranchid() {
return bankbranchid;
}
public void setBankbranchid(String bankbranchid) {
this.bankbranchid = bankbranchid;
}
public String getApplno() {
return applno;
}
public void setApplno(String applno) {
this.applno = applno;
}
public String getCustomername() {
return customername;
}
public void setCustomername(String customername) {
this.customername = customername;
}
public String getProduct() {
return product;
}
public void setProduct(String product) {
this.product = product;
}
public String getApptype() {
return apptype;
}
public void setApptype(String apptype) {
this.apptype = apptype;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getLoanamount() {
return loanamount;
}
public void setLoanamount(String loanamount) {
this.loanamount = loanamount;
}
public String getDob() {
return dob;
}
public void setDob(String dob) {
this.dob = dob;
}
public String getCaseid() {
return caseid;
}
public void setCaseid(String caseid) {
this.caseid = caseid;
}
public String getUuid() {
return uuid;
}
public void setUuid(String uuid) {
this.uuid = uuid;
}
public int getFormmode() {
return formmode;
}
public void setFormmode(int formmode) {
this.formmode = formmode;
}
}

View File

@@ -1,12 +1,5 @@
package matrix.nimble.edp.punching.model;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections.FactoryUtils;
import org.apache.commons.collections.list.LazyList;
import matrix.nimble.edp.cutoff.model.CutOffRecord;
import matrix.nimble.utilities.CommonFunctions;
import matrix.nimble.utilities.DBFunctions;
import matrix.nimble.utilities.GlobalClass;
@@ -21,8 +14,6 @@ public class PunchingHandler {
private String dynamicpanel;
private String dynamicsection;
private String dynamicfields;
private String docdynamicfields;
private String docdynamicpanel;
private String portfolioid;
private String [][] optionvals;
@@ -62,18 +53,6 @@ public class PunchingHandler {
public void setDynamicpanel(String dynamicpanel) {
this.dynamicpanel = dynamicpanel;
}
public String getDocdynamicfields() {
return docdynamicfields;
}
public void setDocdynamicfields(String docdynamicfields) {
this.docdynamicfields = docdynamicfields;
}
public String getDocdynamicpanel() {
return docdynamicpanel;
}
public void setDocdynamicpanel(String docdynamicpanel) {
this.docdynamicpanel = docdynamicpanel;
}
public String getDynamicsection() {
return dynamicsection;
}
@@ -119,70 +98,6 @@ public class PunchingHandler {
setOptionvals(null);
}
}
public void DocDynamicHtml()
{
DBFunctions dbf=new DBFunctions(getErrCode());
dbf.setProcessFlag(true);
setDynamicfields("");
setDynamicpanel("");
setDocdynamicfields("");
setDocdynamicpanel("");
dbf.FetchRunQuery(74, (getPortfolioid()+GlobalClass.ColDelim+"75"+GlobalClass.ColDelim+"ADDDOC"+GlobalClass.ColDelim).split(GlobalClass.ColDelim));
if(dbf.isProcessFlag())
{
CommonFunctions Cfunc=new CommonFunctions();
String [][] ResultSet=dbf.getResultArray();
if(ResultSet.length > 0)
{
Cfunc.setGeneratedHtml("");
Cfunc.setPrevControl("");
Cfunc.setDynamicCtrls("");
for(int indx=0;indx<ResultSet.length;indx++)
{
String ControlVal="";
String secContainer="";
String Temp="";
secContainer=Cfunc.DynamicControls(ResultSet[indx], ControlVal);
if(secContainer.equals("Generalsec"))
{
Temp=getDynamicpanel();
setDynamicfields(getDynamicfields()+ResultSet[indx][2]+GlobalClass.ColDelim);
if(Temp.endsWith("</select></div></div></div>") && Cfunc.getGeneratedHtml().endsWith("</select></div></div></div>"))
{
if(!Cfunc.getGeneratedHtml().startsWith("<div class='widget'>"))
{
Temp=Temp.substring(0,Temp.lastIndexOf("</select></div></div></div>"));
}
}
setDynamicpanel(Temp+""+Cfunc.getGeneratedHtml());
}
if(secContainer.equals("Docsec"))
{
Temp=getDocdynamicpanel();
setDocdynamicfields(getDocdynamicfields()+ResultSet[indx][2]+GlobalClass.ColDelim);
if(Temp.endsWith("</select></div></div></div>") && Cfunc.getGeneratedHtml().endsWith("</select></div></div></div>"))
{
if(!Cfunc.getGeneratedHtml().startsWith("<div class='widget'>"))
{
Temp=Temp.substring(0,Temp.lastIndexOf("</select></div></div></div>"));
}
}
setDocdynamicpanel(Temp+""+Cfunc.getGeneratedHtml());
}
}
}
else
{
setProcessFlag(false);
setErrMsg(dbf.getErrMsg());
setErrDesc(dbf.getErrDesc());
}
}
}
public void DynamicHtml(String pageId)
{
DBFunctions dbf=new DBFunctions(getErrCode());
@@ -242,11 +157,6 @@ public class PunchingHandler {
setErrDesc(dbf.getErrDesc());
}
}
public void AddEditDocs(String docType,String docHolder,String serviceProvider,String uniqueNo,String bankId,String yearMonth,String city,String vendorId,String uuId,String userId)
{
}
public String[][] loadCasesForAddrCorrection() {
String [][]resultArray = null;
DBFunctions dbf=new DBFunctions(getErrCode());

View File

@@ -1,8 +1,10 @@
package matrix.services.edp;
import com.cygnus.db.CygnusDbExecutor;
import com.cygnus.db.RowView;
import com.cygnus.db.SqlArrayParameter;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -19,6 +21,7 @@ import lib.models.CasePunching;
import lib.models.ApplicationSaveResult;
import lib.models.MessageDetails;
import lib.models.Option;
import lib.models.PunchedRecordsData;
import lib.models.UserSession;
import lib.constants.ApplicationMessage;
import lib.exceptions.ApplicationException;
@@ -38,6 +41,9 @@ public class PunchingService {
private static final String CATEGORY = "category.";
private static final Short ACTIVE = Short.valueOf((short) 1);
private static final int PUNCHED_RECORDS_QUERY = 24;
private static final Pattern DYNAMIC_FIELD = Pattern.compile(
"(?:field(?:[1-9]|1[0-2]|150(?:_2)?)|dtfield1)", Pattern.CASE_INSENSITIVE);
private static final SqlArrayParameter GENERAL_OPTION_TYPES =
SqlArrayParameter.text("CITY", "APPTYPE");
private static final SqlArrayParameter PORTFOLIO_OPTION_TYPES =
@@ -87,6 +93,53 @@ public class PunchingService {
}
}
public PunchedRecordsData loadPunchedRecords(
Short portfolioId, String documentCaseId, UserSession session) {
if (dbExecutor == null || objectMapper == null) {
throw new IllegalStateException("Punched-record dependencies are not configured");
}
if (portfolioId == null || portfolioId <= 0 || session == null) {
throw new ApplicationException(
ApplicationMessage.APPLICATION_VALIDATION_FAILED, "Portfolio is required");
}
String caseUuid = documentCaseId != null && documentCaseId.trim().length() > 20
? documentCaseId.trim() : "";
try {
List<RowView> rows = dbExecutor.query(PUNCHED_RECORDS_QUERY, new Object[] {
caseUuid, caseUuid, caseUuid, portfolioId,
session.getCompanyId(), session.getBranchId()
});
return new PunchedRecordsData(rows.stream().map(this::toPunchedRecord).toList());
} catch (ApplicationException exception) {
throw exception;
} catch (RuntimeException exception) {
throw databaseFailure(exception);
}
}
private Map<String, Object> toPunchedRecord(RowView row) {
Map<String, Object> record = new LinkedHashMap<>();
row.asMap().forEach((name, value) -> {
if (!"dynamic_fields".equalsIgnoreCase(name)) record.put(name, value == null ? "" : value);
});
Object dynamicValue = row.get("dynamic_fields");
if (dynamicValue == null || dynamicValue.toString().isBlank()) return record;
try {
Map<String, Object> dynamicFields = objectMapper.readValue(
dynamicValue.toString(), new TypeReference<Map<String, Object>>() {});
dynamicFields.forEach((name, value) -> {
if (name != null && DYNAMIC_FIELD.matcher(name).matches()) {
record.put(name, value == null ? "" : value);
}
});
return record;
} catch (JsonProcessingException exception) {
throw new ApplicationException(
ApplicationMessage.INTERNAL_SERVER_ERROR,
"Punched-record dynamic fields are invalid", exception);
}
}
private void validate(ApplicationDetails details, UserSession session) {
if (details == null || session == null || details.getPortfolioId() == null
|| details.getPortfolioId() <= 0) {
@@ -122,8 +175,7 @@ public class PunchingService {
}
Map<String, String> allowed = new LinkedHashMap<>();
details.getDynamicFields().forEach((name, value) -> {
if (name != null && (name.matches("field(?:[1-9]|1[0-2])")
|| "dtfield1".equals(name))) {
if (name != null && DYNAMIC_FIELD.matcher(name).matches()) {
allowed.put(name, value == null ? null : value.trim());
}
});

View File

@@ -502,7 +502,7 @@ class RoleVisibleBatchMigrationTest {
assertFalse(documents.contains("z-index:-1"));
Path punching = Path.of("build/WebContent/WEB-INF/app/edp/punching");
for (String page : List.of("initcase.jsp", "initdocs.jsp")) {
for (String page : List.of("initcase.jsp")) {
String content = Files.readString(punching.resolve(page));
assertTrue(content.contains("matrix-tool-workspace matrix-punch-workspace"), page);
assertTrue(content.contains("punch-workspace-v3.css"), page);
@@ -518,11 +518,6 @@ class RoleVisibleBatchMigrationTest {
assertTrue(initialCase.contains("/matrix/js/edp/punching/initiation.js"));
assertTrue(initialCase.contains("AddNewRecord()"));
String initialDocs = Files.readString(punching.resolve("initdocs.jsp"));
assertTrue(initialDocs.contains("EditBasicDetails()"));
assertTrue(initialDocs.contains("AddDocs()"));
assertTrue(initialDocs.contains("AddNewDoc()"));
String editCases = Files.readString(punching.resolve("editcases.jsp"));
assertTrue(editCases.contains("matrix-tool-workspace"));
assertTrue(editCases.contains("SubmitForm('caselist','_parent','caseGrid')"));
@@ -545,7 +540,7 @@ class RoleVisibleBatchMigrationTest {
assertTrue(workspace.contains("left: auto !important"));
Path punching = Path.of("build/WebContent/WEB-INF/app/edp/punching");
for (String page : List.of("initcase.jsp", "initdocs.jsp")) {
for (String page : List.of("initcase.jsp")) {
String content = Files.readString(punching.resolve(page));
assertTrue(content.contains("matrix-add-cases"), page);
assertTrue(content.contains("add-cases-v4.css"), page);

View File

@@ -5,11 +5,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Method;
import jakarta.servlet.http.HttpSession;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.stereotype.Controller;
import matrix.nimble.controller.Ajax;
import matrix.nimble.edp.punching.controllers.PunchingController;
class SpringWebContextTest {
@@ -33,8 +34,8 @@ class SpringWebContextTest {
@Test
void requestParameterNamesAreRetained() throws Exception {
Method method = Ajax.class.getMethod(
"PunchedRecords", String.class, String.class, String.class);
Method method = PunchingController.class.getMethod(
"punchedRecords", Short.class, String.class, HttpSession.class);
assertTrue(method.getParameters()[0].isNamePresent());
assertTrue(method.getParameters()[1].isNamePresent());

View File

@@ -4,16 +4,60 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import com.cygnus.db.CygnusDbExecutor;
import com.cygnus.db.RowView;
import com.cygnus.db.SqlArrayParameter;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import lib.models.PunchedRecordsData;
import lib.models.UserSession;
import lib.models.Option;
import matrix.services.commons.CommonService;
import org.junit.jupiter.api.Test;
class PunchingServiceTest {
@Test
void loadsPunchedRecordsAsFormShapedObjectsAndMergesDynamicFields() {
AtomicReference<Object[]> parameters = new AtomicReference<>();
Map<String, Object> columns = new LinkedHashMap<>();
columns.put("case_id", 101);
columns.put("applno", "APP-1");
columns.put("dynamic_fields", "{\"field1\":\"Dealer\",\"field150_2\":\"Note\"}");
RowView row = row(columns);
CygnusDbExecutor executor = (CygnusDbExecutor) Proxy.newProxyInstance(
getClass().getClassLoader(), new Class<?>[] {CygnusDbExecutor.class},
(proxy, method, args) -> {
if (method.getName().equals("query") && args.length == 2) {
assertEquals(24, args[0]);
parameters.set(((Object[]) args[1]).clone());
return List.of(row);
}
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();
PunchedRecordsData result = service.loadPunchedRecords(
(short) 38, "c4e2680c-fdb0-48cb-aa07-a563aa64cdb9", session);
assertArrayEquals(new Object[] {"c4e2680c-fdb0-48cb-aa07-a563aa64cdb9",
"c4e2680c-fdb0-48cb-aa07-a563aa64cdb9",
"c4e2680c-fdb0-48cb-aa07-a563aa64cdb9", (short) 38, (short) 3, (short) 7},
parameters.get());
assertEquals(101, result.records().getFirst().get("case_id"));
assertEquals("Dealer", result.records().getFirst().get("field1"));
assertEquals("Note", result.records().getFirst().get("field150_2"));
assertEquals(false, result.records().getFirst().containsKey("dynamic_fields"));
}
@Test
void loadsParameterizedOptionsAndNormalizesApplicationTypeGroup() {
RecordingCommonService commonService = new RecordingCommonService();
@@ -72,5 +116,15 @@ class PunchingServiceTest {
return option;
}
private static RowView row(Map<String, Object> columns) {
return new RowView() {
@Override public Object get(String column) { return columns.get(column); }
@Override public <T> T get(String column, Class<T> type) {
return type.cast(columns.get(column));
}
@Override public Map<String, Object> asMap() { return columns; }
};
}
private record Call(int queryId, Object[] parameters) {}
}

View File

@@ -104,7 +104,8 @@ BEGIN
department, designation, ophone, extension, paddr1, paddr2, paddr3, plandmark,
pcolony, pcity, ppincode, refname1, refaddress1, refcontactno1, refname2,
refaddress2, refcontactno2, field1, field2, field3, field4, field5, field6,
field7, field8, field9, field10, field11, field12, dtfield1, receivedate,
field7, field8, field9, field10, field11, field12, field150, field150_2,
dtfield1, receivedate,
addedby, addedon, company_id, branch_id, uuid)
VALUES (
d."portfolioId", coalesce(d."bankBranchId", 0), v_mvcode,
@@ -144,6 +145,8 @@ BEGIN
p_application->'dynamicFields'->>'field8', p_application->'dynamicFields'->>'field9',
p_application->'dynamicFields'->>'field10', p_application->'dynamicFields'->>'field11',
p_application->'dynamicFields'->>'field12',
p_application->'dynamicFields'->>'field150',
p_application->'dynamicFields'->>'field150_2',
nullif(p_application->'dynamicFields'->>'dtfield1', '')::date,
current_date, p_user_id, v_now, p_company_id, p_branch_id, v_uuid)
RETURNING main.case_id INTO v_case_id;
@@ -205,6 +208,8 @@ BEGIN
field8=p_application->'dynamicFields'->>'field8', field9=p_application->'dynamicFields'->>'field9',
field10=p_application->'dynamicFields'->>'field10', field11=p_application->'dynamicFields'->>'field11',
field12=p_application->'dynamicFields'->>'field12',
field150=p_application->'dynamicFields'->>'field150',
field150_2=p_application->'dynamicFields'->>'field150_2',
dtfield1=nullif(p_application->'dynamicFields'->>'dtfield1','')::date,
addedon=CASE WHEN addedby=0 THEN v_now ELSE addedon END,
addedby=CASE WHEN addedby=0 THEN p_user_id ELSE addedby END,

View File

@@ -21,7 +21,7 @@ Query20!C0L!select!C0L!select distinct companyname,oaddr1,oaddr2,oaddr3,olandmar
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 case_id,portfolio_id,mvcode,bank_branch_id,applno,product,loanamount,customername,apptype,category,dob,contactperson,mobileno,raddr1,raddr2,raddr3,rlandmark,Rcolony,rcity,rpincode,rphone,companyname,oaddr1,oaddr2,oaddr3,olandmark,Ocolony,ocity,opincode,department,designation,ophone,extension,paddr1,paddr2,paddr3,plandmark,Pcolony,pcity,ppincode,refname1,refaddress1,refcontactno1,refname2,refaddress2,refcontactno2,rv,rtv,ov,otv,pv,refv,docv,rco,rcp,ocp,specialinst,sradd,soadd,spadd, val1 (select location from colony where colony_id=rcolony) as colr,(select location from colony where colony_id=ocolony) as colo,(select location from colony where colony_id=pcolony) as colp,fathername,bankcode,0 as status,company_id,branch_id,uuid from main_mainopr where (val0) order by case_id
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
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
@@ -262,9 +262,6 @@ Query236!C0L!procedure!C0L!select vervisitdetmis('val0', 'val1',val2,val3, val4,
Query237!C0L!procedure!C0L!select conveyencemis('val0','val1',val2,'val3','val4','val5','val6')
Query238!C0L!insert!C0L!insert into negative (cardno,refno,applno,customername,raddr1,raddr2,raddr3,Rcolony,rcity,rpincode,rphone,companyname,oaddr1,oaddr2,oaddr3,Ocolony,ocity,opincode,ophone,fathername,contactperson,mobileno,amount,source,product,remarks,actualsource,portname,dob,updatedon,bucket,addedon,addedby) values (''val0'',''val1'',''val1'',''val2'',''RadDrXS-val14-ERadDrX'',''RadDrX1'',''RadDrX2'',0,''-1'','''',''val8'',''val16'',''OadDrXS-val15-EOadDrX'',''OadDrX1'',''OadDrX2'',0,''-1'','''','''',''val18'','''',''val7'',val11,''FULLERTON'',''val3'',''val19'',''FULLERTON'',''FULLERTON'',''val13'',''2013-08-01'',val6,''2014-05-07 00:00:00'',1)
Query239!C0L!procedure!C0L!select negupdate('val0')
Query240!C0L!select!C0L!select portfolio_id,portname from portfolio where branch_id=val0 and isactive=1 and portfolio_id not in (select portfolio_id from denied_process where process_id=6 and isdenied=1) order by portname
Query241!C0L!select!C0L!select dt.doctype_id,dt.doctype,dt.uniqueidentifier,dt.serviceprovider,dt.uniquenoregex,dt.yearmonth,dt.yearmonthregex,dt.defaultsprovider,dt.dblist from document_type dt,portfolio_doc pd where pd.doctype_id=dt.doctype_id and pd.isactive=1 and portfolio_id=val0 order by doctype
Query242!C0L!select!C0L!select case_id,portfolio_id,bank_branch_id,applno,product,loanamount,customername,apptype,category,dob,docv, val1 0 as status,company_id,branch_id,uuid from main_mainopr where portfolio_id=val0 and docv=1 order by case_id
Query243!C0L!select!C0L!select bank_id,name from bank where upper(name) like upper('val0%');
Query244!C0L!select!C0L!select v.verifier_id,(v.verifiercode||' | '||v.hdfccode) as verifier from verifier v,verifier_doc vd where vd.verifier_id=v.verifier_id and vd.doctype_id=val0 order by verifier
Query245!C0L!select!C0L!select ba.uid,ba.belt_id,b.beltname,ba.verifier_id,v.verifiercode as verifiername,ba.belt_group as group,ba.verifier_id as pverifier from belt b,verifier v,belt_allocation ba where ba.belt_id=b.belt_id and ba.verifier_id=v.verifier_id val0 order by beltname