138 lines
6.6 KiB
JavaScript
138 lines
6.6 KiB
JavaScript
(function (window, document) {
|
|
"use strict";
|
|
|
|
const API = Object.freeze({ key: "payload-key", save: "application-save" });
|
|
const BOOLEAN_FIELDS = Object.freeze({
|
|
residenceVerification: "rv",
|
|
residenceTelephoneVerification: "rtv",
|
|
officeVerification: "ov",
|
|
officeTelephoneVerification: "otv",
|
|
propertyVerification: "pv",
|
|
referenceVerification: "refv",
|
|
documentVerification: "docv",
|
|
residenceCoApplicant: "rco",
|
|
residenceCoProprietor: "rcp",
|
|
officeCoProprietor: "ocp",
|
|
sameResidenceAddress: "sradd",
|
|
sameOfficeAddress: "soadd",
|
|
samePropertyAddress: "spadd",
|
|
autoCutOff: "autocut"
|
|
});
|
|
const VALUE_FIELDS = Object.freeze({
|
|
applicationId: "case_id", portfolioId: "portfolio_id", bankBranchId: "bank_branch_id",
|
|
applicationNumber: "applno", bankCode: "bankcode", product: "product",
|
|
loanAmount: "loanamount", customerName: "customername", fatherName: "fathername",
|
|
applicationType: "apptype", category: "category", dateOfBirth: "dob",
|
|
contactPerson: "contactperson", mobileNumber: "mobileno", specialInstruction: "specialinst",
|
|
residenceAddress1: "raddr1", residenceAddress2: "raddr2", residenceAddress3: "raddr3",
|
|
residenceLandmark: "rlandmark", residenceColonyId: "Rcolony", residenceCity: "rcity",
|
|
residencePincode: "rpincode", residencePhone: "rphone", companyName: "companyname",
|
|
officeAddress1: "oaddr1", officeAddress2: "oaddr2", officeAddress3: "oaddr3",
|
|
officeLandmark: "olandmark", officeColonyId: "Ocolony", officeCity: "ocity",
|
|
officePincode: "opincode", department: "department", designation: "designation",
|
|
officePhone: "ophone", extension: "extension", propertyAddress1: "paddr1",
|
|
propertyAddress2: "paddr2", propertyAddress3: "paddr3", propertyLandmark: "plandmark",
|
|
propertyColonyId: "Pcolony", propertyCity: "pcity", propertyPincode: "ppincode",
|
|
referenceName1: "refname1", referenceAddress1: "refaddress1",
|
|
referenceContactNumber1: "refcontactno1", referenceName2: "refname2",
|
|
referenceAddress2: "refaddress2", referenceContactNumber2: "refcontactno2",
|
|
formMode: "formmode"
|
|
});
|
|
const INTEGER_FIELDS = new Set(["applicationId", "portfolioId", "bankBranchId", "residenceColonyId",
|
|
"officeColonyId", "propertyColonyId", "formMode"]);
|
|
const element = (id) => document.getElementById(id);
|
|
const value = (id) => {
|
|
const field = element(id);
|
|
if (!field) return "";
|
|
window.CygnusFormValidation.sanitizeElement(field);
|
|
return field.value?.trim() ?? "";
|
|
};
|
|
const integer = (id) => {
|
|
const parsed = Number.parseInt(value(id), 10);
|
|
return Number.isFinite(parsed) ? parsed : 0;
|
|
};
|
|
const checked = (id) => Boolean(element(id)?.checked);
|
|
|
|
function collectDynamicFields() {
|
|
const names = value("dynamicfields").split(window.ColDelim || "!C0L!").filter(Boolean);
|
|
return names.reduce((result, name) => {
|
|
if (/^(?:field(?:[1-9]|1[0-2]|150(?:_2)?)|dtfield1)$/i.test(name) && element(name)) {
|
|
result[name] = value(name);
|
|
}
|
|
return result;
|
|
}, {});
|
|
}
|
|
|
|
function collectCase() {
|
|
const details = {};
|
|
Object.entries(VALUE_FIELDS).forEach(([property, id]) => {
|
|
details[property] = INTEGER_FIELDS.has(property) ? integer(id) : value(id);
|
|
});
|
|
Object.entries(BOOLEAN_FIELDS).forEach(([property, id]) => { details[property] = checked(id); });
|
|
details.dynamicFields = collectDynamicFields();
|
|
return details;
|
|
}
|
|
|
|
function validateForm() {
|
|
const verificationIds = ["rv", "rtv", "ov", "otv", "pv", "refv", "docv"];
|
|
if (!verificationIds.some(checked)) {
|
|
notify("danger", "APP-4221", "At least one verification type is required.");
|
|
return false;
|
|
}
|
|
const validation = window.CygnusInitiationValidation.validateForm();
|
|
[["rv", "Rcolony", "colr"], ["ov", "Ocolony", "colo"], ["pv", "Pcolony", "colp"]]
|
|
.forEach(([flag, hidden, visible]) => {
|
|
if (checked(flag) && integer(hidden) === 0) window.highlightField(element(visible));
|
|
});
|
|
if (!validation.valid || document.querySelector(".matrix-validation-error-icon")) {
|
|
notify("danger", "APP-4221", "Correct the highlighted fields and submit the application again.");
|
|
validation.invalid[0]?.focus();
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
function notify(type, code, message, referenceId) {
|
|
window.CygnusNotifications.show({ type, code, message, referenceId });
|
|
}
|
|
|
|
function applyResult(result, originalApplicationId) {
|
|
element("case_id").value = result.applicationId;
|
|
if (element("mvcode")) element("mvcode").value = result.mvCode || "";
|
|
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();
|
|
else if (originalApplicationId > 0 && typeof window.findRecord === "function") window.findRecord(3);
|
|
}
|
|
|
|
async function save(event) {
|
|
event?.preventDefault();
|
|
if (!validateForm()) return false;
|
|
const button = element("btnsave");
|
|
if (button?.disabled) return false;
|
|
const details = collectCase();
|
|
if (button) button.disabled = true;
|
|
try {
|
|
const envelope = await window.CygnusPayloadCrypto.encrypt(details, { keyUrl: API.key });
|
|
const response = await fetch(API.save, { method: "POST", credentials: "same-origin",
|
|
headers: { "Content-Type": "application/json", Accept: "application/json" },
|
|
body: JSON.stringify(envelope) });
|
|
const body = await response.json().catch(() => null);
|
|
if (!response.ok || !body?.success) throw body?.message || body || {};
|
|
applyResult(body.data, details.applicationId);
|
|
} catch (error) {
|
|
notify("danger", error.code || "APP-5001",
|
|
error.message || "Cygnus could not save the application details.", error.referenceId);
|
|
} finally {
|
|
if (button) button.disabled = false;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
window.CygnusInitiation = Object.freeze({ save });
|
|
}(window, document));
|