@if (loadingApplication) {

Loading application…

} @if (application; as a) {
CREDIT · LOAN ORIGINATION · {{ a.branchName | uppercase }}

{{ a.applicationNo }} — {{ a.applicantName }} {{ statusLabels[a.overallStatus] }}

{{ a.productName }} · ₹{{ a.requestedAmount | number: '1.0-0' }} · Applied {{ a.applicationDate }} · {{ progress(a) }}% through the sanctioning workflow.

@if (uploadingDocs > 0) { Uploading {{ uploadingDocs }} file{{ uploadingDocs > 1 ? 's' : '' }}… } @else if (docUploadFailed) { File upload failed } @if (saving) { Saving… } @else if (saveFailed) { Not saved — check connection }
Branch
{{ a.branchName }}
Channel
{{ a.channel === 'BC' ? a.bcAgentName : a.channel === 'SELF_APPLY' ? 'Self-Apply (Digital)' : 'Branch' }}
Customer Type
{{ a.customerType === 'EXISTING' ? 'Existing Customer' : 'New Customer' }}
Tenure / Rate
{{ a.tenureMonths }} months @ {{ a.interestRate }}%
Monthly Income / Eligible Amount
₹{{ a.monthlyIncome | number: '1.0-0' }} / ₹{{ a.eligibleLoanAmount | number: '1.0-0' }}
Sanctioning Authority
{{ sanctioningAuthorityOf(a) }}
Share Member
@if (a.clientId) { @if (loadingShareAccounts) { Checking membership… } @else if (realShareAccounts.length > 0) { } @else { Not a Member } } @else if (a.isShareMember) { Yes — {{ a.shareCertNo }} (since {{ a.shareMemberSince }}) } @else { Not a Member }
@if (a.coBorrowerRequired) {
Co-Borrower
{{ a.coBorrowerName }} @if (a.coBorrowerWanted && a.coBorrowerRelationship) { ({{ a.coBorrowerRelationship }}) }
} @if (a.guarantorRequired) {
Guarantor
{{ a.guarantorName }}
}
Guarantors — {{ guarantorsNeeded(app) }} required{{ app.guarantorMustBeMember === false ? '' : ', each must be an existing share member' }}
@for (i of guarantorSlots(app); track i) {
@if (guarantorAt(app, i); as g) { @if (g.hasShareAccount) { Share Member — Verified @if (g.shareAccountNos?.length) { {{ g.shareAccountNos!.join(', ') }} } } @else if (loadingGuarantorShareCheck) {

Checking share membership…

} @else if (app.guarantorMustBeMember === false) { Named } @else { No Share Account Found

This client has no active share account — a guarantor must already be a bank member. Change the guarantor.

} } @else { @if (guarantorSlotSearching === i) { @if (searchingGuarantor) {

Searching…

} @else if (guarantorSearchText.length >= 2 && guarantorSearchResults.length === 0) {

No clients found.

} @if (guarantorSearchResults.length > 0) {
@for (client of guarantorSearchResults; track client.id) { }
} }

Guarantor {{ i + 1 }} is not named yet. Search and select an existing bank client — a name alone isn't enough.

}
}
@if (grantedApprovals(app).length) {
Approved by
@for (ap of grantedApprovals(app); track ap.label) {
✓ {{ ap.label }} — {{ ap.approverName }} ({{ ap.role }}) · {{ ap.date }} @if (ap.exception) { On exception } @if (ap.remarks) { “{{ ap.remarks }}” }
}
}
@if (isStageApproved(a, field); as ap) {
Approved by {{ ap.approverName }} {{ ap.decision === 'EXCEPTION_APPROVED' ? 'Approved on Exception' : 'Approved' }}
Role: {{ ap.approverRole || role }} · Approved on {{ ap.date }}
@if (ap.remarks) {
Approver Remarks: “{{ ap.remarks }}”
} @if (nextStageOf(a); as nxt) {
}
} @else if (approvalRequest(a, field); as req) { @if (isMyRequest(req)) {
Sent for approval · awaiting {{ role }} @if (req.requestedDecision === 'EXCEPTION_APPROVED') { On exception }
Submitted by {{ req.submittedBy }} on {{ req.submittedOn }}
@if (req.previousRevokeRemarks) {
Re-submitted after correction (Previous note: “{{ req.previousRevokeRemarks }}”)
}
@if (req.remarks) {
“{{ req.remarks }}”
}
@if (req.checklist?.length && !(field === 'creditCommitteeApproval' && isDepositLoan(a))) {
What you verified before sending
Completed on {{ req.submittedOn }}
@for (check of req.checklist; track check.label) {
{{ check.ok ? '✓' : '✕' }} {{ check.label }}
}
}
You sent this request, so you cannot approve it. A different user has to approve, reject or revoke it.
} @else { @if (req.previousRevokeRemarks) {
Re-submitted after correction
Previous reason for return: “{{ req.previousRevokeRemarks }}”
} @if (req.checklist?.length && !(field === 'creditCommitteeApproval' && isDepositLoan(a))) {
What {{ req.submittedBy }} verified before sending
Completed on {{ req.submittedOn }}
@for (check of req.checklist; track check.label) {
{{ check.ok ? '✓' : '✕' }} {{ check.label }}
}
@if (req.remarks) {
Sender's Remarks: “{{ req.remarks }}”
}
} @if (autoChecked(a, field)) { @for (item of checkerItems(a, field, req); track item.label) { @if (!item.ok) {
✕ {{ item.label }} — this check has not passed, so it cannot be approved.
} } } @else {
Your verification — tick each row you have checked {{ checkerCount(a, field, req) }}
Review checkpoints and documents below to approve, or return with remarks for rectification
@for (item of checkerItems(a, field, req); track item.label) { @if (item.ok) { } @else {
✕ {{ item.label }} — the sender did not verify this, so it cannot be approved.
} }
}
@if (!checkerReady(a, field, req) && !autoChecked(a, field)) {
Approve opens after you tick every row above. Revoke / Return is always available with remarks.
}
} } @else { @if (latestRevokedRequest(a, field); as revReq) {
Returned for Correction by {{ revReq.decidedBy || 'Approver' }} Needs Correction
Returned on {{ revReq.decidedOn }} · Stage unlocked for document/data updates
@if (revReq.revokeRemarks || revReq.remarks) {
Approver's Revoke Remarks / Error Noted:
“{{ revReq.revokeRemarks || revReq.remarks }}”
}
Please review the error note above, correct or re-upload the documents/data, and click Re-submit for Approval below.
}
@if (exception) { }
}
Current Stage: {{ stageLabel(a, a.currentStage) }} {{ progress(a) }}% Completed
@for (s of visibleStages(a); track s) { @if (canJumpToStage(a, s)) { } @else {
{{ stepMarker(a, s) }} {{ stageLabel(a, s) }}
} }
@if (a.overallStatus === 'REJECTED') {

See the approval summary below for the recorded reason.

} @else if (a.overallStatus === 'ON_HOLD') {

{{ a.personalDiscussionNotes }}

} @else if (a.overallStatus === 'DISBURSED') {
Disbursement Date
{{ a.disbursementDate }}
Mode
{{ a.disbursementMode }}
@if (!isDepositLoan(a)) {
ACH Confirmation
{{ a.achConfirmationRef }}
} @if (!isDepositLoan(a)) {
EMI Activation Confirmation
{{ a.emiActivationConfirmed ? 'Confirmed on ' + a.emiActivationDate : 'Pending' }}
}
Core Banking Loan Account
@if (a.fineractLoanAccountNo) { A/C {{ a.fineractLoanAccountNo }} @if (loanAccount) { } } @else if (loanAccount) { A/C {{ loanAccount.accountNo }} · {{ loanAccount.status }} } @else { Mock disbursement only — no core banking account }
@if (isRevolving(a)) {

{{ a.productName }} is a revolving/renewable limit — repaid on demand and renewed annually, not on a fixed EMI schedule.

} @else {
Loan Amount ₹{{ a.requestedAmount | number: '1.0-0' }} {{ a.tenureMonths }} months @ {{ a.interestRate }}%
Monthly EMI ₹{{ emiAmountFor(a) | number: '1.0-0' }} Reducing balance
Total Interest Payable ₹{{ totalInterestFor(a) | number: '1.0-0' }} over the full tenure
Total Amount Payable ₹{{ totalPayableFor(a) | number: '1.0-0' }} principal + interest
@for (row of emiScheduleFor(a); track row.installmentNo) { }
Inst. No Due Date Opening Balance EMI Principal Interest Closing Balance
{{ row.installmentNo }} {{ row.dueDate }} ₹{{ row.openingBalance | number: '1.0-0' }} ₹{{ row.emiAmount | number: '1.0-0' }} ₹{{ row.principalComponent | number: '1.0-0' }} ₹{{ row.interestComponent | number: '1.0-0' }} ₹{{ row.closingBalance | number: '1.0-0' }}
}
} @else { @if (loanAccount && a.currentStage !== 'CUSTOMER_SIGNING' && !showAccountCard(a)) {
{{ loanAccount.status }}
} @if (showAccountCard(a) && accountOverview; as ov) {
Loan account {{ loanAccount?.accountNo }} {{ loanAccount?.status }}

Account Details

@for (row of ov.account; track row.label) {
{{ row.label }}
{{ row.value }}
}

Approved By

Account approved by
{{ ov.approval.by }}
Approved on
{{ ov.approval.on }}
Approved amount
{{ ov.approval.amount }}

Approved Items

@for (row of approvedItems(a); track row.label) {
{{ row.label }}
{{ row.value }}
}

Added Items (charges)

@for (c of ov.charges; track c.name) {
{{ c.name }}
{{ c.amount }} · {{ c.when }} {{ c.added ? 'Added' : 'Product' }}
} @empty {
Charges
None
}

GL Accounts (from the product)

@for (row of ov.glAccounts; track row.label) {
{{ row.label }}
{{ row.value }}
}
@if (ov.posting) {

{{ ov.posting }}

}
@if (loanAccount?.active) { ✓ Disbursed. Completing the application… } @else if (!loanAccountReady) { The loan account has to be approved before it can be disbursed. } @else if (a.currentStage !== 'DISBURSED') { Disbursement can be sent for approval once the post-disbursement check is done. } @else { @switch (disbursementState(a)) { @case ('NONE') { } @case ('MINE_PENDING') { ⏳ Sent for disbursement approval by you. Another user has to approve it; the loan is disbursed as soon as they do. } @case ('OTHER_PENDING') { Disbursement approval requested by {{ disbursementRequestedBy(a) }}. Debit {{ accountOverview?.glAccounts?.[1]?.value }}, credit {{ accountOverview?.glAccounts?.[0]?.value }}. } @case ('APPROVED') { ✓ Disbursement approved{{ a.disbursementApproval?.approverName ? ' by ' + a.disbursementApproval?.approverName : '' }}. {{ executingDisbursement ? 'Disbursing…' : 'Disbursing the loan…' }} } } }
}

The purpose decides whether the loan counts as priority sector lending (RBI Master Directions, 2025) and whether the borrower is a weaker section. It is needed before the sanction is approved.

Priority sector

Product setting: {{ a.productName }} is {{ isPrioritySectorProduct(a) ? 'a priority sector product' : 'not a priority sector product' }}.

@if (pslOverridden(a)) { } @if (pslChoice(a) === 'yes') { @if (a.prioritySectorCategory) { @if (pslDocType && !pslLocked(a)) { } @for (stored of pslDocs('PSL'); track stored.id) {
✓ {{ stored.description || stored.name }} — {{ stored.fileName }} @if (!pslLocked(a)) { }
} } }
Weaker section (overlapping tag, RBI para 17)
@if (a.weakerSection === 'yes') { @if (weakerDocType && !pslLocked(a)) { } @for (stored of pslDocs('WEAKER'); track stored.id) {
✓ {{ stored.description || stored.name }} — {{ stored.fileName }} @if (!pslLocked(a)) { }
} }
@if (pslHint(a)) {

{{ pslHint(a) }}

} @else { Purpose and priority sector classification complete }
@if (showPslCard(a)) {
} @if (a.currentStage === 'APPLICATION') {

Received via {{ a.channel === 'BC' ? a.bcAgentName : a.channel === 'SELF_APPLY' ? 'Self-Apply (Digital)' : 'Branch' }} on {{ a.applicationDate }}.

} @if (a.currentStage === 'KYC_DOCUMENTS') {
@if (isDepositLoan(a)) {
Loan against a deposit — the deposit is the security. Income proof, bank statement, address proof and a co-borrower are optional, and no credit bureau (CIBIL) check is done. Only Aadhaar and PAN verification are required.
} @if (a.clientId) { @if (loadingKyc) {

Loading KYC record…

} @else {
Aadhaar {{ a.aadhaarVerified ? 'Verified' : 'Not Verified' }}
@if (realKyc?.aadhaarNumberMasked) { {{ realKyc.aadhaarNumberMasked }} } @if (hasAadhaarPhotos()) {
@if (hasAadhaarFront()) { } @else { } @if (hasAadhaarBack()) { } @else { }
} @else { }
PAN {{ a.panVerified ? 'Verified' : 'Not Verified' }}
@if (realKyc?.panNumber) { {{ maskPan(realKyc.panNumber) }} } @if (hasPanPhotos()) { @if (hasPanFront() && hasPanBack()) {
} @else {
} } @else { }
Income Proof @if (isDepositLoan(a)) { optional } @if (a.incomeProofSubmitted || findDocument('income')) { Submitted } @else { Missing }
@if (findDocument('income'); as incomeDoc) { {{ incomeDoc.name || incomeDoc.fileName }} } @else { @if (newKycCapture.incomeProof.employmentType === 'SALARIED') {
@for (doc of newKycCapture.incomeProof.salaried; track $index) { } @for (stored of storedDocsFor('KYC:incomeProof:salaried'); track stored.id) { }

{{ salariedFileCount }} file{{ salariedFileCount === 1 ? '' : 's' }} · Form 16 / Salary slips

} @else {

Last 3 years' Income Tax Returns:

@for (doc of newKycCapture.incomeProof.itr; track $index) {
@if (!doc.exception) { @if (doc.file || hasStoredDoc('KYC:incomeProof:itr:' + $index)) { } } @if (!doc.file) { }
@if (doc.exception) { } } } }
Bank Statement @if (isDepositLoan(a)) { optional } @if (a.bankStatementSubmitted || findDocument('bank statement')) { Submitted } @else { Missing }
@if (findDocument('bank statement'); as bankDoc) { {{ bankDoc.name || bankDoc.fileName }} } @else {
@if (newKycCapture.bankStatement.file || hasStoredDoc('KYC:bankStatement')) { @if (canReopenBankStatementAnalysis()) { } }
}
Electricity Bill @if (isDepositLoan(a)) { optional } @if (a.electricityBillSubmitted || findDocument('electricity') || findDocument('address proof')) { Submitted } @else { Missing }
@if (findDocument('electricity') || findDocument('address proof'); as billDoc) { {{ billDoc.name || billDoc.fileName }} } @else { @if (electricityBillTooOld) {

Must not be older than 3 months.

}
@if (newKycCapture.electricityBill.file || hasStoredDoc('KYC:electricityBill')) { }
}
} } @else {

Captured for this application — final Aadhaar/PAN verification happens when the customer's CBS client profile is created.

Aadhaar
@if (newKycCapture.aadhaar.front || newKycCapture.aadhaar.back) {
@if (newKycCapture.aadhaar.front) { } @if (newKycCapture.aadhaar.back) { }
} @if (newKycCapture.aadhaar.verified) { Aadhaar Verified } @else {
@if (newKycCapture.aadhaar.otpSent) {
@for (d of newKycCapture.aadhaar.otpDigits; track $index) { }
}
}
PAN
@if (newKycCapture.pan.front || newKycCapture.pan.back) {
@if (newKycCapture.pan.front) { } @if (newKycCapture.pan.back) { }
} @if (newKycCapture.pan.verified) { PAN Verified } @else {
}
Income Proof @if (isDepositLoan(a)) { · optional } @if (newKycCapture.incomeProof.employmentType === 'SALARIED') {
@for (doc of newKycCapture.incomeProof.salaried; track $index) { } @for (stored of storedDocsFor('KYC:incomeProof:salaried'); track stored.id) { }

{{ salariedFileCount }} file{{ salariedFileCount === 1 ? '' : 's' }} · Form 16 and last 3 months' salary slips — select several files at once.

} @else {

Last 3 years' Income Tax Returns:

@for (doc of newKycCapture.incomeProof.itr; track $index) {
@if (!doc.exception) { @if (doc.file) { } } @if (!doc.file) { }
@if (doc.exception) { } } } @if (a.incomeProofSubmitted) { @if (itrHasException) { Submitted — with exception(s) } @else { Submitted } } @else { Missing }
Bank Statement @if (isDepositLoan(a)) { · optional }
@if (newKycCapture.bankStatement.file) { @if (isCsvFile(newKycCapture.bankStatement.file)) { } }
@if (a.bankStatementSubmitted) { Submitted } @else { Missing }
Electricity Bill (Address Proof) @if (isDepositLoan(a)) { · optional } @if (electricityBillTooOld) {

Must not be older than 3 months.

}
@if (newKycCapture.electricityBill.file) { }
@if (a.electricityBillSubmitted) { Submitted } @else { Missing }
} @if (!!a.productDocuments) {
Loan-Specific Documents — {{ a.productName }}
@if (a.productDocuments.length === 0) {

{{ a.productName }} lists no required documents. Add any document the officer needs from the customer.

}
@for (doc of a.productDocuments; track doc.key) { @if (doc.key === 'coOwnerKyc') {
{{ doc.label }} @if (doc.submitted) { {{ coOwnerCapture.hasCoOwner ? 'Verified' : 'Not Applicable' }} } @else { Missing }
@if (doc.hint) { {{ doc.hint }} } @if (coOwnerCapture.hasCoOwner) {
}
} @else {
{{ doc.label }} @if (doc.custom) { } @if (doc.submitted) { Submitted } @else { Missing }
@if (doc.hint) { {{ doc.hint }} }
@if (productDocCapture[doc.key]; as capture) { @if (capture.file || hasStoredDoc('PRODUCT_DOC:' + doc.key)) { } }
} }
} @if (!isDepositLoan(a)) { @if (!isRevolving(a)) { @if (amountOutOfRange(a)) {

{{ a.productName }} allows ₹{{ productLimitsFor(a)?.minAmt | number: '1.0-0' }} – ₹{{ productLimitsFor(a)?.maxAmt | number: '1.0-0' }} — this amount won't be saved until it's in range.

} @if (tenureOutOfRange(a)) {

{{ a.productName }} allows {{ productLimitsFor(a)?.minTenure }}–{{ productLimitsFor(a)?.maxTenure }} months — this tenure won't be saved until it's in range.

} }

Eligible Loan Amount preview: ₹{{ eligiblePreview(a) | number: '1.0-0' }}

@if (isRevolving(a)) {

{{ a.productName }} is a revolving/renewable limit — repaid on demand, no fixed EMI.

} @else {

Estimated EMI: ₹{{ emiPreview(a) | number: '1.0-0' }} / month ({{ emiToIncomePctPreview(a) | number: '1.0-1' }}% of monthly income)

@if (emiToIncomePctPreview(a) > 40) { @if (a.coBorrowerRequired && coBorrowerDetailsComplete(a) && combinedEligibilityOk(a)) {

EMI exceeds 40% of the applicant's own income, but the Co-Borrower added below already covers it — see the Co-Borrower section.

} @else {

EMI exceeds 40% of monthly income — add a Co-Borrower, reduce the loan amount, or increase the tenure before proceeding.

} } }
@if (a.monthlyIncome > 0) {
Monthly Income (Last Assessed)
₹{{ a.monthlyIncome | number: '1.0-0' }}
Eligible Loan Amount
₹{{ a.eligibleLoanAmount | number: '1.0-0' }}
Estimated EMI
@if (isRevolving(a)) { No fixed EMI (revolving limit) } @else { ₹{{ emiAmountFor(a) | number: '1.0-0' }} / month }
} @if (!isRevolving(a)) {
EMI Calculation Basis
Principal (Loan Amount)
₹{{ a.requestedAmount | number: '1.0-0' }}
Interest Rate
{{ a.interestRate }}% p.a. ({{ a.interestRate / 12 | number: '1.2-2' }}% / month)
Tenure
{{ a.tenureMonths }} months
Total Interest Payable
₹{{ totalInterestFor(a) | number: '1.0-0' }}
Total Amount Payable
₹{{ totalPayableFor(a) | number: '1.0-0' }}

Reducing-balance EMI formula: EMI = [P × r × (1+r)n] / [(1+r)n − 1] — where P = Principal, r = Monthly Interest Rate, n = Tenure in months. On P = ₹{{ a.requestedAmount | number: '1.0-0' }}, r = {{ a.interestRate / 12 / 100 | number: '1.4-4' }}, n = {{ a.tenureMonths }} → EMI = ₹{{ emiAmountFor(a) | number: '1.0-0' }} / month.

} @if (a.coBorrowerRequired || isDepositLoan(a)) {
Co-Borrower @if (isDepositLoan(a)) { (optional) } @else { (raises household eligibility) }
@if (a.coBorrowerWanted) {

Upload the co-borrower's last 3 months' salary slips:

@for (doc of coBorrowerCapture.salarySlips; track $index) { @if (doc.file || hasStoredDoc('COBORROWER:salarySlip:' + $index)) { } }
@if (coBorrowerDetailsComplete(a)) {
Combined Household Eligibility Calculation
Applicant's Monthly Income
₹{{ a.monthlyIncome | number: '1.0-0' }}
Applicant's EMI Capacity (40%)
₹{{ applicantEmiCapacity(a) | number: '1.0-0' }}
Co-Borrower's Monthly Income
₹{{ a.coBorrowerMonthlyIncome | number: '1.0-0' }}
Co-Borrower's EMI Capacity (40%)
₹{{ coBorrowerEmiCapacity(a) | number: '1.0-0' }}
Combined Household EMI Capacity
₹{{ combinedEmiCapacity(a) | number: '1.0-0' }}
Estimated EMI (this loan)
₹{{ emiAmountFor(a) | number: '1.0-0' }}

Combined Capacity = (40% × ₹{{ a.monthlyIncome | number: '1.0-0' }} applicant) + (40% × ₹{{ a.coBorrowerMonthlyIncome | number: '1.0-0' }} co-borrower) = ₹{{ applicantEmiCapacity(a) | number: '1.0-0' }} + ₹{{ coBorrowerEmiCapacity(a) | number: '1.0-0' }} = ₹{{ combinedEmiCapacity(a) | number: '1.0-0' }}. Estimated EMI ₹{{ emiAmountFor(a) | number: '1.0-0' }} is {{ combinedEligibilityOk(a) ? 'within' : 'above' }} this combined capacity.

@if (combinedEligibilityOk(a)) { Eligible with Co-Borrower } @else { Still not eligible — increase co-borrower income, reduce the amount, or extend tenure }
} } @if (!affordabilityOk(a)) {

@if (!coBorrowerDetailsComplete(a)) { @if (!a.coBorrowerWanted) { Check "Add a Co-Borrower" and complete their details to proceed. } @else { Add the co-borrower's name, relationship, monthly income and all 3 salary slips to proceed. } } @else { Combined household income still doesn't cover the EMI at 40% — adjust the amount, tenure, or co-borrower before proceeding. }

}
} } @if (a.guarantorsRequiredCount !== undefined && guarantorsNeeded(a) > 0) { }
Purpose & Priority Sector
} @if (a.currentStage === 'CIC_CHECK') {
Customer Consent — Credit Bureau Check

RBI's Fair Practices Code requires the customer's signed consent before a credit bureau pull. Generate the declaration letter below, get it signed by the customer, then upload the signed copy.

@if (a.channel === 'BRANCH') { } @else { }
@if (cicConsentCapture.file || hasStoredDoc('CIC:consent')) {
} @if (a.cicConsentSigned) { Signed Declaration Uploaded } @else { Awaiting Signed Declaration }
CIC Check Charge — ₹{{ cicCheckCharge }}
@if (a.clientId && realDebitableAccounts.length > 0) {

Select which account to debit the ₹{{ cicCheckCharge }} charge from:

@for (acc of realDebitableAccounts; track acc.id) { }
} @else { @if (a.clientId && loadingShareAccounts) {

Loading accounts…

} @else { @if (a.clientId) {

No open savings/current account on file for this customer — collect the charge via payment link instead.

} @if (!a.cicPaymentLinkUrl || a.cicPaymentLinkUrl === '—') {
} @else {

{{ a.cicPaymentLinkUrl }}

@if (!a.cicChargeCollected) {
} } } } @if (a.cicChargeCollected) { Charge Collected — {{ a.cicChargeMode === 'ACCOUNT_DEBIT' ? a.cicChargeAccountLabel : 'Ref ' + a.cicPaymentReference }} } @else { Charge Not Collected }
@if (a.cibilScore === 0) {
@if (!a.cicConsentSigned || !a.cicChargeCollected) {

Print/share the declaration and get it signed, and collect the ₹{{ cicCheckCharge }} check charge, before checking the credit score.

} } @else {
{{ a.cibilScore }} {{ cibilBandOf(a.cibilScore) }}
Credit Bureau {{ a.cicBureau }}
Uploaded Report File {{ a.cicReportUploaded ? a.cicReportFileName : 'Not uploaded yet' }}
Field Inquiry Status {{ a.fiRequestPushed ? 'Pushed to ' + a.fiAgencyAssigned + ' (' + a.fiRequestDate + ')' : 'Not pushed yet' }}
@if (a.cicReportUploaded) {
@if (hasStoredDoc('CIC:report')) { }
}
} @if (a.cibilScore > 0) {
@if (a.cicReportUploaded && !a.fiRequestPushed) { } @else if (a.cicReportUploaded && a.fiRequestPushed) { }
}
} @if (a.currentStage === 'FIELD_INVESTIGATION') {
@if (a.clientId) {
Registered Addresses on File (Fineract)
@if (loadingAddresses) {

Loading addresses…

} @else if (realAddresses.length === 0) {

No addresses on file for this client.

} @else {
@for (addr of realAddresses; track $index) {
{{ addr.addressType || 'Address' }}

{{ formatRealAddress(addr) }}

}
}
}
@for (key of fiRows(a); track key) {
{{ fiCheckLabels[key] }}
@if (a[key].officerAssigned === '—') {
} @else {

Assigned to {{ a[key].officerAssigned }} on {{ a[key].assignedDate }}

@if (a[key].status === 'PENDING') { @if (fiIsOverdue(a, key)) {

⚠ {{ fiSlaLabel(a, key) }} — this visit is overdue.

} @else {

{{ fiSlaLabel(a, key) }}

}

Site Photos ({{ fiPhotoCapture[key].length }}):

@for (photo of fiPhotoCapture[key]; track $index) { }
@if (!fiCanVerify(a, key)) {

Capture latitude, longitude and at least one site photo before marking Verified.

}
} @else if (a[key].status === 'VERIFIED') { Verified } @else { Failed
} }
}
@if (a.secured) {
Property Valuation
Market Value (Area × Market Rate)
₹{{ a.propertyValuation | number: '1.0-0' }}
Guideline Value (Area × Circle Rate)
₹{{ guidelineValue(a) | number: '1.0-0' }}
Realizable Value (90% of Market)
₹{{ realizableValue(a) | number: '1.0-0' }}
Distress Sale Value (75% of Market)
₹{{ distressValue(a) | number: '1.0-0' }}
Loan-to-Value (vs Realizable)
{{ ltvPercent(a) | number: '1.0-1' }}%
@if (ltvHigh(a)) {

LTV exceeds 80% of the realizable value — this loan amount is aggressive against the property's worth; consider a lower amount or additional security.

}
}
Agent Report
{{ a.agentReportUploaded ? a.agentReportFileName : 'Not uploaded yet' }}
@if (a.agentReportUploaded) {
Report Remark
{{ a.agentReportRemark }}
}
@if (a.agentReportUploaded && hasStoredDoc('FI:agentReport')) {
} @if (!a.agentReportUploaded) {
}
} @if (a.currentStage === 'PERSONAL_DISCUSSION' && isDepositLoan(a)) {
@if (loanPlan(a); as plan) {

The plan below is what the customer is offered. Download or print it, share it with the customer, then proceed.

Applicant{{ a.applicantName }}
Loan amount₹{{ plan.amount | number: '1.0-0' }}
Tenure{{ plan.tenure }} months
Interest rate{{ plan.rate | number: '1.2-2' }}% p.a. @if (plan.rateFromDeposit) { (deposit {{ plan.depositRate }}% + {{ plan.spread }}%) }
Interest per month (estimate)₹{{ plan.monthlyInterest | number: '1.0-0' }}
Total interest over the tenure₹{{ plan.totalInterest | number: '1.0-0' }}
Total payable at the end₹{{ plan.totalPayable | number: '1.0-0' }}
Repayment{{ plan.repayment }}
Deposit pledged{{ plan.accounts }}
Security value · limit₹{{ plan.securityValue | number: '1.0-0' }} · {{ plan.limitPct }}% = ₹{{ plan.eligible | number: '1.0-0' }}
Lien{{ plan.lienRequired ? 'Marked ' + plan.lienStage : 'Not required' }}
Penal interest{{ plan.penal }}
Pre-closure · Renewal{{ plan.preclosure }} · {{ plan.renewal }}
What has been collected
@for (row of planCollectedRows(a); track row.label) {
{{ row.label }}{{ row.value }}
}
Product terms — {{ a.productName }}
@for (row of planProductRows(a); track row.label) {
{{ row.label }}{{ row.value }}
}
}
} @if (a.currentStage === 'PERSONAL_DISCUSSION' && !isDepositLoan(a)) {
Briefing Report — For the Meeting

Everything captured so far — KYC, CIC score, Field Investigation, property valuation, agent report and the full stage history — as one PDF for whoever takes this meeting.

Meeting Scheduler
@if (a.meetingScheduled) {

Scheduled with {{ a.meetingWith }} on {{ a.meetingDate }} at {{ a.meetingTime }} ({{ a.meetingMode === 'ONLINE' ? 'Online' : a.meetingMode === 'CALL' ? 'Phone Call' : 'Offline' }})

}
@if (a.meetingScheduled) {
@if (discrepancySelection === 'NONE') { } @else { }
} @else {

Schedule the meeting above before recording the discussion report.

}
} @if (a.currentStage === 'CREDIT_COMMITTEE') {
@if (isDepositLoan(a)) {
Loan Application

The bank's loan application form, filled from this application: applicant particulars, occupation and income, accounts and existing loans, the deposit offered as security and the declaration. After it come the sanction checks and every document on file: the eKYC documents (Aadhaar, PAN), the lien documents, the deposit documents and the legal documents.

} @else {
Full Application Report — For the Committee

Everything captured on this application — KYC, CIC score, Field Investigation, property valuation, agent report, meeting and stage history — as one PDF for every committee member to review before deciding.

} @if (!isDepositLoan(a)) {

Reports Required — present below reports, then complete.

@if (!isDepositLoan(a)) { } @if (a.secured) { } @if (!isDepositLoan(a)) { } @if (!isDepositLoan(a)) { } @if (!isDepositLoan(a)) { } @if (a.secured) { }
} @if (isDepositLoan(a)) { @for (check of depositRiskChecks(a); track check.label) { @if (!check.ok) {

{{ check.label }}

} } @if (guarantorsNeeded(a) > 0) { } }
Purpose & priority sector
Purpose of the loan
{{ a.loanPurpose || '—' }}
Priority sector
{{ pslChoice(a) === 'yes' ? 'Yes — ' + (a.prioritySectorCategory || 'category not chosen') : 'No' }}
Weaker section
{{ a.weakerSection === 'yes' ? 'Yes — ' + (a.weakerSectionType || 'type not chosen') : a.weakerSection === 'no' ? 'No' : '—' }}
@if (pslHint(a)) {

{{ pslHint(a) }} Complete the "Purpose & Priority Sector" card at the top of this page.

}
@if (!approvalRequest(a, 'creditCommitteeApproval') && !isStageApproved(a, 'creditCommitteeApproval')) { } @if (!isDepositLoan(a)) {
@if (committeeReportsReady(a) && !committeeCanApprove(a)) {

Enter the Resolution No. and Resolution Date the committee passed this decision under before approving.

} } @if (isDepositLoan(a)) {
Sanction letter
@if (isStageApproved(a, 'creditCommitteeApproval')) {

✓ Sanction approved — the sanction letter is released.

} @else {

Prepare the loan application above and send it to the manager for sanction approval. The sanction letter is released as soon as the manager approves.

}
}
} @if (a.currentStage === 'RISK_APPROVAL') {
@if (isDepositLoan(a)) { @for (check of depositRiskChecks(a); track check.label) { } } @if (!isDepositLoan(a)) { } @if (!isDepositLoan(a)) { } @if (a.secured) { } @if (!isDepositLoan(a)) { } @if (a.guarantorsRequiredCount === undefined) { } @else { }
@if (guarantorsNeeded(a) > 0) { }
} @if (isDepositLoan(a)) {
}
@if (!isDepositLoan(a)) { } @if (a.secured) { } @if (!isDepositLoan(a)) { }
@if (a.legalDocuments.length > 0) {
@if (approvalRequest(a, 'legalApproval')) {

🔒 Sent for approval — the documents can be viewed but not added, replaced or removed. To change anything, withdraw the request first.

} @if (!approvalRequest(a, 'legalApproval')) {
}
}
@if (a.currentStage === 'LEGAL_APPROVAL') {
} @if (a.currentStage === 'CUSTOMER_SIGNING') {

Loan Agreement and Sanction Letter ready for the customer's acknowledgement and signature.

@if (isDepositLoan(a)) { @if (!legalChecklistDone(a)) {

Take the legal documents and the stamp duty before the customer signs.

} } @if (isDepositLoan(a)) {
}
@if (!isCustomerSigned(a)) { } @else { ✓ Signed by Customer ({{ a.customerSigningDate }}) @if (hasLoanAccount(a)) { } }
@if (isCustomerSigned(a)) {
@if (hasLoanAccount(a)) { ✓ Core Banking Loan Account Ready {{ a.fineractLoanAccountNo || 'Linked' }} } @else if (loanAccount) { Loan Account Created {{ loanAccount.status }} } @else { Customer Signed Account Not Created }

@if (hasLoanAccount(a)) { Core Banking Loan Account ready: {{ a.fineractLoanAccountNo || 'Linked' }}. You can now proceed to the next stage. } @else if (loanAccount) { Loan account {{ loanAccount.accountNo }} is already created for this application and is {{ loanAccount.status }}. A second account cannot be created. @if (loanAccount.pendingApproval) { Use Check Status to see when it is approved. } @else if (loanAccountReady) { You can now proceed to the next stage. } } @else { Loan agreement signed for {{ a.productName }} (₹{{ a.requestedAmount | number: '1.0-0' }}). Core Banking Loan Account not created yet for this application. Click below to create the official loan account first. }

@if (!hasLoanAccount(a)) { @if (loanAccount) { @if (loanAccountReady) { } } } @else { ✓ Account: {{ a.fineractLoanAccountNo || 'Created' }} }
}
} @if (a.currentStage === 'CHEQUE_ACH') {
@if (isDepositLoan(a)) {

Not required for a loan against a deposit — the bank recovers by set-off against the lien.

} @else {
}
} @if (a.currentStage === 'POST_CHECK') {

Document Signing by:

@if (!isDepositLoan(a)) { } @if (!isDepositLoan(a)) { }
} @if (a.currentStage === 'DISBURSED') {

@if (!isDepositLoan(a)) { Disbursing also confirms EMI Activation for this account in the same step. } @if (a.customerType === 'EXISTING' && a.clientId) { A real Fineract loan account will be created, approved and disbursed in Core Banking at the same time. } @else { This is a mock disbursement only — no Core Banking account exists until this customer is fully onboarded as a client. }

@if (a.fineractLoanError) {

{{ a.fineractLoanError }}

} @if (isDepositLoan(a)) { @if (disbursementLienIssue(a); as issue) {

{{ issue }}

} @else {

✓ On disbursement the lien is marked on {{ a.depositSelection?.accountNos?.join(', ') }} for ₹{{ a.requestedAmount | number: '1.0-0' }}.

} }
} } @if (a.currentStage === 'DEPOSIT_SELECTION' && showLienCard(a)) {
@if (!a.depositSelection?.saved) { Save the deposit first to open step 2. }
} @if (a.currentStage === 'DEPOSIT_SELECTION' && (!showLienCard(a) || depositStep === 1)) {
@if (loadingDeposits) {

Loading the customer's deposits…

} @else if (!isLicLoan(a) && realDeposits.length === 0) {

No active {{ depositKindLabel(a) }} account found for this customer.

} @else { @if (isLicLoan(a)) {

A LIC policy is not a bank account. Record the policy from the policy bond and the insurer's surrender value letter (both collected at KYC & Documents).

} @else {
@for (row of realDeposits; track row.id) { }
{{ depositKindLabel(a) }} Account Opened Maturity {{ depositKindOf(a.productCode) === 'RD' || depositKindOf(a.productCode) === 'DS' ? 'Instalment' : 'Principal' }} Interest so far Balance + Interest Rate Lien
{{ row.accountNo }} {{ row.openedOn | date: 'dd-MM-yyyy' }} {{ row.maturityDate | date: 'dd-MM-yyyy' }} @if (row.monthsLeft < 12) { < 12 m } ₹{{ row.principal | number: '1.2-2' }} ₹{{ row.interest | number: '1.2-2' }} ₹{{ row.value | number: '1.2-2' }} {{ row.rate }}% @if (row.underLien) { Under lien } @else if (otherPledges[row.id]) { Pledged in {{ otherPledges[row.id] }} } @else { Free }
} @if (!isLicLoan(a) && depositRules(a).allowThirdParty) { } @if (!isLicLoan(a) && !depositRules(a).allowMultiple) {

This product allows one deposit per loan.

} @if (depositCalc(a); as calc) {
{{ calc.lic ? 'Security value (surrender value)' : 'Security value (balance + accrued interest)' }}{{ calc.hasSecurity ? '₹' + (calc.value | number: '1.0-0') : '—' }}
Normal limit — {{ calc.limitPct }}% {{ calc.hasSecurity ? '₹' + (calc.normalLimit | number: '1.0-0') : '—' }}
{{ calc.rateLabel }}{{ calc.hasSecurity ? calc.rateText : '—' }}
{{ calc.tenureLabel }}{{ calc.hasSecurity ? calc.maxTenure + ' months' : '—' }}
Eligible loan amount{{ calc.hasSecurity ? '₹' + (calc.eligible | number: '1.0-0') + ' (' + (depositOver85 ? '100' : calc.limitPct) + '%)' : '—' }}
@if (depositOver85) { } @for (err of calc.errors; track err) {

{{ err }}

} @if (calc.ok) {

✓ ₹{{ a.requestedAmount | number: '1.0-0' }} for {{ a.tenureMonths }} months at {{ calc.rate | number: '1.2-2' }}% is within the limit.

}
@if (showLienCard(a) && a.depositSelection?.saved) { }
} }
} @if (showLienCard(a) && depositStep === 2) {
Lien Marking & Set-Off Agreement

A security lien blocks withdrawal, premature closure, and renewal in another name until the loan is fully repaid.

@if (a.lien?.marked) { ✓ Lien Active } @else if (lienAtDisbursement(a)) { Auto-Lien at Disbursement } @else { Lien Pending }
Deposits Under Lien {{ a.depositSelection?.accountNos?.join(', ') || 'Select & save deposit above' }}
Lien Security Amount ₹{{ a.requestedAmount | number: '1.0-0' }}
Letter of Lien and Set-Off
Signed by the depositor (and all joint account holders)
@if (!canMakeLienLetter(a)) {
Select and save a deposit above to generate the Letter of Lien and Set-off.
}
@if (lienLetterStored) {
Signed Letter of Lien & Set-Off
✓ Received
@for (stored of storedDocsFor('LIEN:letter'); track stored.id) {
}
} @else {
Upload Signed Letter
Attach scanned PDF or photo signed by the depositor & joint holders
}
@if (a.lien?.marked && depositRules(a).certificateRequired) {
LIEN CERTIFICATE
No: {{ a.lien?.certificateNo }}
Date: {{ a.lien?.markedOn }}

A lien of ₹{{ a.lien?.amount | number: '1.0-0' }} is noted on deposit {{ a.lien?.accountNos?.join(', ') }} in favour of the bank against loan application {{ a.applicationNo }}.

} @else if (lienAtDisbursement(a)) {
Automated Lien at Disbursement

This product marks the lien at disbursement. The lien is placed on the deposit automatically when the loan is disbursed, so there is nothing to mark now. Before that: save the deposit selection and upload the signed letter of lien and set-off above.

} @else {
@if (!lienReady(a)) { Save the deposit selection and upload the letter of lien and set-off to enable Mark Lien. }
}
} @if (a.currentStage === 'DEPOSIT_SELECTION' && (!showLienCard(a) || depositStep === 2)) {

Order: choose the deposit and save it, then download the letter of lien and set-off, get it signed, and upload it. Then proceed.

@if (depositStageIssue(a); as issue) {

{{ issue }}

} @else {

✓ Deposit saved and the signed letter is on file. Ready to proceed.

}
}

{{ a.stageHistory.length }} recorded audit trail events · 4 sanctioning approval checkpoints.

} @else {
}
{{ toastMsg }}