(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])|dtfield1)$/.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 || ""; 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; }); } 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));