Files
cbsnexora/src/app/letter-mgmt/certificates/certificate-preview-dialog/certificate-preview-dialog.component.html
T
keshav 569f17ef46
build-run / Run Lint, Build and Deploy (push) Canceled after 0s
Publish Image in Docker Hub / build (push) Canceled after 0s
Playwright E2E Tests / Run Playwright Tests (push) Canceled after 0s
Tests / testRigor (push) Canceled after 0s
kyc exception at client creation time and some tds work
2026-08-05 17:23:56 +05:30

703 lines
25 KiB
HTML

<!--
Copyright since 2025 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<div class="cpd-root">
<!-- TOOLBAR -->
<div class="cpd-toolbar no-print">
<div class="cpd-toolbar-l">
<fa-icon [icon]="isInterest ? 'file-invoice' : 'certificate'" class="cpd-toolbar-ic"></fa-icon>
<div>
<div class="cpd-toolbar-t">{{ title }}</div>
<div class="cpd-toolbar-s">{{ refLine }}</div>
</div>
</div>
<div class="cpd-toolbar-r">
<button class="cpd-tb-btn" (click)="printCertificate()" matTooltip="Print or Save as PDF">
<fa-icon icon="print"></fa-icon> Print / PDF
</button>
<button class="cpd-tb-btn" (click)="downloadPdf()" matTooltip="Download as PDF">
<fa-icon icon="download"></fa-icon> Download PDF
</button>
<button class="cpd-tb-btn cpd-tb-x" (click)="close()" matTooltip="Close">
<fa-icon icon="times"></fa-icon>
</button>
</div>
</div>
<!-- CERTIFICATE PAGE -->
<div class="cpd-page" [ngClass]="pageToneClass">
<!-- Bank letterhead -->
<div class="cpd-letterhead">
<div class="cpd-bank-name">{{ bankName }}</div>
<div class="cpd-bank-sub">{{ bankAddress }}</div>
<div class="cpd-bank-sub">{{ bankRegNo }} · {{ bankContact }}</div>
</div>
<!-- Certificate title strip -->
<div class="cpd-title-strip">
<span class="cpd-title-l">{{ title }}</span>
</div>
<!-- Meta strip -->
<div class="cpd-meta-row">
<div>
<div class="cpd-meta-l">Certificate Reference</div>
<div class="cpd-meta-v mono">
@if (isInterest && interest) {
INT-{{ interest.record.accountNo }}-{{ interest.fy.fy | slice: 3 }}
} @else if (isShare && share) {
{{ share.certificateNo }}
}
</div>
</div>
<div>
<div class="cpd-meta-l">Date of Issue</div>
<div class="cpd-meta-v">{{ issuedOn | date: 'd MMMM y' }}</div>
</div>
<div>
<div class="cpd-meta-l">
@if (isInterest) {
Financial Year
} @else if (isShare) {
Folio No.
} @else if (isBalance) {
As-on Date
} @else if (isForm60) {
Trigger
} @else if (isForm15gh) {
Form
} @else if (isHypothecation) {
Status
} @else if (isNoc) {
Status
}
</div>
<div class="cpd-meta-v">
@if (isInterest && interest) {
<span class="cpd-stage-pill">{{ interest.fy.fy }}</span>
} @else if (isShare && share) {
<span class="cpd-stage-pill cpd-stage-pill--amber">{{ share.folioNo }}</span>
} @else if (isBalance && balance) {
<span class="cpd-stage-pill">{{ balance.asOnDate | date: 'd MMM y' }}</span>
} @else if (isForm60 && form60) {
<span class="cpd-stage-pill cpd-stage-pill--amber">No PAN — Form 97</span>
} @else if (isForm15gh && form15gh) {
<span class="cpd-stage-pill cpd-stage-pill--teal">Form {{ form15gh.kind }}</span>
} @else if (isHypothecation && hypothecation) {
<span class="cpd-stage-pill cpd-stage-pill--red">{{ hypothecation.status }}</span>
} @else if (isNoc && noc) {
<span class="cpd-stage-pill cpd-stage-pill--green">
{{ noc.status === 'READY_TO_ISSUE' ? 'Ready to Issue' : noc.status }}
</span>
}
</div>
</div>
</div>
<!-- ── LOAN INTEREST CERTIFICATE ── -->
@if (isInterest && interest) {
<div class="cpd-block">
<div class="cpd-block-l">To,</div>
<div class="cpd-block-v">
<div>
<strong>{{ interest.record.customerName }}</strong>
</div>
<div>
Customer ID: <span class="mono">{{ interest.record.customerId }}</span> · PAN:
<span class="mono">{{ interest.record.customerPan }}</span>
</div>
<div>{{ interest.record.customerAddress }}</div>
</div>
</div>
<p class="cpd-para">
This is to certify that <strong>{{ interest.record.customerName }}</strong> (Customer ID
<strong>{{ interest.record.customerId }}</strong>) is availing the following loan facility from our bank, and the
interest paid by the above customer during the
financial year <strong>{{ interest.fy.fy }}</strong> is as detailed below.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>Loan Account No.</td>
<td class="mono">
<strong>{{ interest.record.accountNo }}</strong>
</td>
<td>Branch</td>
<td>{{ interest.record.branch }}</td>
</tr>
<tr>
<td>Loan Type</td>
<td>{{ interest.record.loanType }}</td>
<td>Disbursed On</td>
<td>{{ interest.record.disbursementDate | date: 'd MMM y' }}</td>
</tr>
<tr>
<td>Sanctioned Amount</td>
<td>₹{{ interest.record.sanctionedAmount | number: '1.2-2' }}</td>
<td>Interest Rate</td>
<td>{{ interest.record.interestRate }}% p.a.</td>
</tr>
<tr>
<td>Opening Balance ({{ interest.fy.fy | slice: 0 : 8 }})</td>
<td>₹{{ interest.fy.openingBalance | number: '1.2-2' }}</td>
<td>Closing Balance</td>
<td>₹{{ interest.fy.closingBalance | number: '1.2-2' }}</td>
</tr>
<tr>
<td>Principal Repaid</td>
<td>₹{{ interest.fy.principalPaid | number: '1.2-2' }}</td>
<td>Interest Paid</td>
<td>
<strong class="cpd-amount">₹{{ interest.fy.interestPaid | number: '1.2-2' }}</strong>
</td>
</tr>
<tr class="cpd-summary-total">
<td colspan="3">TOTAL INTEREST PAID DURING {{ interest.fy.fy }}</td>
<td>
<strong>₹{{ interest.fy.interestPaid | number: '1.2-2' }}</strong>
</td>
</tr>
</tbody>
</table>
<p class="cpd-para">
This certificate is issued at the request of the borrower for income-tax / financial record purposes and
reflects the interest credited to the captioned loan account during the said financial year as per our books.
</p>
}
<!-- ── SHARE CERTIFICATE ── -->
@if (isShare && share) {
<div class="cpd-block">
<div class="cpd-block-l">Issued To,</div>
<div class="cpd-block-v">
<div>
<strong>{{ share.memberName }}</strong>
</div>
<div>
Member ID: <span class="mono">{{ share.memberId }}</span> · PAN:
<span class="mono">{{ share.memberPan }}</span>
</div>
<div>{{ share.memberAddress }}</div>
</div>
</div>
<p class="cpd-para cpd-para--centered">
This is to certify that <strong>{{ share.memberName }}</strong> is the registered holder of
<strong>{{ share.shareCount | number }}</strong> ({{ classLabelText() }}) shares of
<strong>₹{{ share.faceValue | number: '1.0-0' }}</strong> each, fully paid up, in <strong>{{ bankName }}</strong>,
subject to the bye-laws of the bank.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>Certificate No.</td>
<td class="mono">
<strong>{{ share.certificateNo }}</strong>
</td>
<td>Folio No.</td>
<td class="mono">{{ share.folioNo }}</td>
</tr>
<tr>
<td>Branch</td>
<td>{{ share.branch }}</td>
<td>Member Since</td>
<td>{{ share.joiningDate | date: 'd MMM y' }}</td>
</tr>
<tr>
<td>Share Class</td>
<td>{{ classLabelText() }}</td>
<td>Date of Issue</td>
<td>{{ share.issueDate | date: 'd MMM y' }}</td>
</tr>
<tr>
<td>Share Numbers</td>
<td class="mono">{{ share.shareNoFrom | number }} &ndash; {{ share.shareNoTo | number }}</td>
<td>Dividend Paid (Cumulative)</td>
<td>₹{{ share.dividendYtd | number: '1.0-0' }}</td>
</tr>
<tr class="cpd-summary-total">
<td colspan="3">TOTAL FACE VALUE</td>
<td>
<strong> ₹{{ share.shareCount * share.faceValue | number: '1.2-2' }} </strong>
</td>
</tr>
</tbody>
</table>
<p class="cpd-para">
Given under the common seal of the bank this {{ issuedOn | date: 'd' }} day of {{ issuedOn | date: 'MMMM y' }}.
</p>
}
<!-- ── BALANCE CERTIFICATE ── -->
@if (isBalance && balance) {
<div class="cpd-block">
<div class="cpd-block-l">To Whom It May Concern,</div>
<div class="cpd-block-v">
<div>
<strong>{{ balance.record.customerName }}</strong>
</div>
<div>
Customer ID: <span class="mono">{{ balance.record.customerId }}</span> · PAN:
<span class="mono">{{ balance.record.customerPan }}</span>
</div>
<div>{{ balance.record.customerAddress }}</div>
@if (balance.record.jointHolders) {
<div class="small">Jointly with: {{ balance.record.jointHolders }}</div>
}
</div>
</div>
<p class="cpd-para">
This is to certify that <strong>{{ balance.record.customerName }}</strong> (Customer ID
<strong>{{ balance.record.customerId }}</strong>) maintains the following account with our bank, and the balance
available in the said account as on
<strong>{{ balance.asOnDate | date: 'd MMMM y' }}</strong> is as detailed below.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>Account No.</td>
<td class="mono">
<strong>{{ balance.record.accountNo }}</strong>
</td>
<td>Branch</td>
<td>{{ balance.record.branch }}</td>
</tr>
<tr>
<td>Account Type</td>
<td>{{ accountTypeLabelText() }}</td>
<td>Product</td>
<td>{{ balance.record.productName }}</td>
</tr>
<tr>
<td>Account Opened</td>
<td>{{ balance.record.openedOn | date: 'd MMM y' }}</td>
<td>Interest Rate</td>
<td>
@if (balance.record.interestRate) {
{{ balance.record.interestRate }}% p.a.
} @else {
—
}
</td>
</tr>
<tr>
<td>Available Balance</td>
<td>₹{{ balance.record.availableBalance | number: '1.2-2' }}</td>
<td>Accrued Interest</td>
<td>₹{{ balance.record.accruedInterest | number: '1.2-2' }}</td>
</tr>
<tr class="cpd-summary-total">
<td colspan="3">TOTAL LEDGER BALANCE AS ON {{ balance.asOnDate | date: 'd MMM y' }}</td>
<td>
<strong>₹{{ balance.record.ledgerBalance | number: '1.2-2' }}</strong>
</td>
</tr>
</tbody>
</table>
<p class="cpd-para">
This certificate is issued at the request of the customer for record purposes and reflects the balance available
in the said account as per our books as on the date mentioned above.
</p>
}
<!-- ── FORM 97 ── -->
@if (isForm60 && form60) {
<p class="cpd-para">
Declaration under <strong>Section 114B</strong> of the Income-tax Rules, 1962, to be made by a person who does
not have a Permanent Account Number (PAN) and who enters into any transaction specified in rule 114B.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>1. Full Name (in Block Letters)</td>
<td colspan="3">
<strong>{{ form60.customerName }}</strong>
</td>
</tr>
<tr>
<td>2. Father's / Spouse's Name</td>
<td colspan="3">{{ form60.fatherName }}</td>
</tr>
<tr>
<td>3. Date of Birth</td>
<td>{{ form60.dob | date: 'd MMM y' }}</td>
<td>4. Customer ID</td>
<td class="mono">{{ form60.customerId }}</td>
</tr>
<tr>
<td>5. Address</td>
<td colspan="3">{{ form60.customerAddress }}</td>
</tr>
<tr>
<td>6. ID Proof Submitted</td>
<td>{{ idProofLabelText() }}</td>
<td>7. ID Document No.</td>
<td class="mono">{{ form60.idProofNumber }}</td>
</tr>
<tr>
<td>8. Nature of Transaction</td>
<td colspan="3">{{ form60.transactionType }}</td>
</tr>
<tr>
<td>9. Transaction Amount</td>
<td>₹{{ form60.transactionAmount | number: '1.2-2' }}</td>
<td>10. Transaction Date</td>
<td>{{ form60.transactionDate | date: 'd MMM y' }}</td>
</tr>
<tr>
<td>11. Estimated Total Income (Current FY)</td>
<td>₹{{ form60.estimatedIncome | number: '1.0-0' }}</td>
<td>12. Agricultural Income</td>
<td>₹{{ form60.agriIncome | number: '1.0-0' }}</td>
</tr>
<tr class="cpd-summary-total">
<td colspan="3">PAN STATUS</td>
<td>
<strong>NOT ALLOTTED — Form 97 declared</strong>
</td>
</tr>
</tbody>
</table>
<p class="cpd-para">
I, <strong>{{ form60.customerName }}</strong>, do hereby declare that the particulars given above are true and
correct to the best of my knowledge and
belief. I further declare that I have applied / not applied for a Permanent Account Number with the Income-tax
department, and that I have neither been assessed nor am liable to be assessed under the Income-tax Act, 1961.
</p>
}
<!-- ── FORM 15G / 15H ── -->
@if (isForm15gh && form15gh) {
<p class="cpd-para">
Declaration under <strong>Section {{ form15gh.kind === '15H' ? '197A(1C)' : '197A(1) / 197A(1A)' }}</strong>
of the Income-tax Act, 1961, for non-deduction of tax at source on certain incomes —
{{
form15gh.kind === '15H'
? 'applicable to resident individuals aged 60 years or above'
: 'applicable to resident individuals (other than companies / firms) below 60 years'
}}.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>1. Name of Assessee</td>
<td colspan="3">
<strong>{{ form15gh.record.customerName }}</strong>
</td>
</tr>
<tr>
<td>2. PAN of Assessee</td>
<td class="mono">{{ form15gh.record.customerPan }}</td>
<td>3. Status</td>
<td>Individual</td>
</tr>
<tr>
<td>4. Previous Year</td>
<td>{{ form15gh.record.fy }}</td>
<td>5. Age (years)</td>
<td>{{ form15gh.age }}</td>
</tr>
<tr>
<td>6. Address</td>
<td colspan="3">{{ form15gh.record.customerAddress }}</td>
</tr>
<tr>
<td>7. Branch</td>
<td>{{ form15gh.record.branch }}</td>
<td>8. Customer ID</td>
<td class="mono">{{ form15gh.record.customerId }}</td>
</tr>
<tr>
<td>9. Deposit Principal</td>
<td>₹{{ form15gh.record.depositPrincipal | number: '1.0-0' }}</td>
<td>10. Estimated Interest ({{ form15gh.record.fy }})</td>
<td>
<strong>₹{{ form15gh.record.estimatedInterest | number: '1.0-0' }}</strong>
</td>
</tr>
<tr>
<td>11. Estimated Total Income</td>
<td>₹{{ form15gh.record.estimatedIncome | number: '1.0-0' }}</td>
<td>12. Previously Assessed?</td>
<td>{{ form15gh.record.assessed ? 'Yes' : 'No' }}</td>
</tr>
<tr class="cpd-summary-total">
<td colspan="3">TAX PAYABLE ON ESTIMATED INCOME</td>
<td><strong>NIL</strong></td>
</tr>
</tbody>
</table>
<p class="cpd-para">
I, <strong>{{ form15gh.record.customerName }}</strong>, do hereby declare that the particulars given above are
true and correct, and that the tax on my estimated
total income for the previous year {{ form15gh.record.fy }} will be NIL. I therefore request that no tax be
deducted at source on the interest paid to me by the bank on the captioned deposits during the said previous
year.
</p>
}
<!-- ── HYPOTHECATION CERTIFICATE ── -->
@if (isHypothecation && hypothecation) {
<div class="cpd-block">
<div class="cpd-block-l">Issued To,</div>
<div class="cpd-block-v">
<div>
<strong>{{ hypothecation.customerName }}</strong>
</div>
<div>
Customer ID: <span class="mono">{{ hypothecation.customerId }}</span> · PAN:
<span class="mono">{{ hypothecation.customerPan }}</span>
</div>
<div>{{ hypothecation.customerAddress }}</div>
</div>
</div>
<p class="cpd-para">
This is to certify that the asset described below stands hypothecated to
<strong>{{ bankName }}</strong> as security for the captioned loan facility extended to
<strong>{{ hypothecation.customerName }}</strong>, and the bank holds the first and exclusive charge over the said
asset until the loan is fully discharged.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>Certificate No.</td>
<td class="mono">
<strong>{{ hypothecation.certificateNo }}</strong>
</td>
<td>Loan Account No.</td>
<td class="mono">{{ hypothecation.accountNo }}</td>
</tr>
<tr>
<td>Loan Type</td>
<td>{{ hypothecation.loanType }}</td>
<td>Branch</td>
<td>{{ hypothecation.branch }}</td>
</tr>
<tr>
<td>Sanctioned Amount</td>
<td>₹{{ hypothecation.sanctionedAmount | number: '1.0-0' }}</td>
<td>Disbursed On</td>
<td>{{ hypothecation.disbursementDate | date: 'd MMM y' }}</td>
</tr>
<tr>
<td>Asset Type</td>
<td>{{ assetLabelText() }}</td>
<td>Identifier</td>
<td class="mono">{{ hypothecation.assetIdentifier }}</td>
</tr>
<tr>
<td>Asset Description</td>
<td colspan="3">{{ hypothecation.assetDescription }}</td>
</tr>
@if (hypothecation.insuredValue > 0) {
<tr>
<td>Insured Value</td>
<td>₹{{ hypothecation.insuredValue | number: '1.0-0' }}</td>
<td>Insurance Valid Till</td>
<td>{{ hypothecation.insuranceValidTill | date: 'd MMM y' }}</td>
</tr>
}
<tr class="cpd-summary-total">
<td colspan="3">OUTSTANDING PRINCIPAL</td>
<td>
<strong>₹{{ hypothecation.outstandingPrincipal | number: '1.2-2' }}</strong>
</td>
</tr>
</tbody>
</table>
<p class="cpd-para">
The lien on the said asset shall stand released only upon the bank issuing a No-Objection Certificate (NOC)
after the entire outstanding under the captioned facility is paid in full, together with all interest, charges,
and incidental costs.
</p>
}
<!-- ── NO-OBJECTION CERTIFICATE ── -->
@if (isNoc && noc) {
<div class="cpd-block">
<div class="cpd-block-l">Issued To,</div>
<div class="cpd-block-v">
<div>
<strong>{{ noc.customerName }}</strong>
</div>
<div>
Customer ID: <span class="mono">{{ noc.customerId }}</span> · PAN:
<span class="mono">{{ noc.customerPan }}</span>
</div>
<div>{{ noc.customerAddress }}</div>
</div>
</div>
<p class="cpd-para">
This is to certify that the captioned loan account in the name of
<strong>{{ noc.customerName }}</strong>
has been
@if (noc.status === 'ISSUED') {
duly closed and the bank
} @else {
closed and the bank
}
has <strong>NO OBJECTION</strong> to the release of the lien hereinafter recorded over the asset described
below. All dues under the said facility, including principal, interest, and incidental charges, have been
received by the bank as on the closure date.
</p>
<table class="cpd-summary">
<tbody>
<tr>
<td>NOC No.</td>
<td class="mono">
<strong>{{ noc.nocNo }}</strong>
</td>
<td>Loan Account No.</td>
<td class="mono">{{ noc.accountNo }}</td>
</tr>
<tr>
<td>Loan Type</td>
<td>{{ nocLoanTypeLabel() }}</td>
<td>Branch</td>
<td>{{ noc.branch }}</td>
</tr>
<tr>
<td>Sanctioned Amount</td>
<td>₹{{ noc.sanctionedAmount | number: '1.0-0' }}</td>
<td>Disbursed On</td>
<td>{{ noc.disbursementDate | date: 'd MMM y' }}</td>
</tr>
@if (noc.closureDate) {
<tr>
<td>Account Closed On</td>
<td>
<strong>{{ noc.closureDate | date: 'd MMM y' }}</strong>
</td>
<td>Total Paid</td>
<td>₹{{ noc.totalPaid | number: '1.2-2' }}</td>
</tr>
}
@if (noc.assetType !== 'NONE') {
<tr>
<td>Asset Type</td>
<td>{{ nocAssetLabel() }}</td>
<td>Identifier</td>
<td class="mono">{{ noc.assetIdentifier }}</td>
</tr>
<tr>
<td>Asset Description</td>
<td colspan="3">{{ noc.assetDescription }}</td>
</tr>
}
@if (noc.forwardTo) {
<tr>
<td>Forward To</td>
<td colspan="3">{{ noc.forwardTo }}</td>
</tr>
}
<tr class="cpd-summary-total">
<td colspan="3">
@if (noc.assetType === 'NONE') {
ACCOUNT CLOSED — NO DUES OUTSTANDING
} @else {
LIEN RELEASED — NO OBJECTION TO TRANSFER
}
</td>
<td><strong>NIL</strong></td>
</tr>
</tbody>
</table>
<p class="cpd-para">
@if (noc.assetType === 'VEHICLE') {
The Regional Transport Authority is hereby requested to delete the hypothecation endorsement of the bank from
the registration certificate of the captioned vehicle.
} @else if (noc.assetType === 'PROPERTY') {
The Sub-Registrar's office is hereby requested to delete the equitable / registered mortgage of the bank from
the property records of the captioned property.
} @else if (noc.assetType === 'GOLD') {
The pledged gold ornaments described above may be released to the customer / authorised representative after
due verification at the branch counter.
} @else if (noc.assetType !== 'NONE') {
The bank's lien over the captioned asset stands released with effect from the closure date, and the customer
is free to deal with the said asset.
} @else {
This certificate is issued at the request of the customer for record purposes and confirms that no dues are
outstanding under the captioned facility.
}
</p>
@if (noc.status === 'ISSUED' && noc.issuedOn) {
<p class="cpd-para">
<strong>Issued on:</strong> {{ noc.issuedOn | date: 'd MMM y' }}
@if (noc.issuedBy) {
<strong>· By:</strong> {{ noc.issuedBy }}
}
</p>
}
}
<!-- Common sign-off -->
<div class="cpd-signoff">
<div class="cpd-sign-block">
<div class="cpd-sig-line"></div>
<div class="cpd-sig-l">Authorised Signatory</div>
@if (isInterest && interest) {
<div class="cpd-sig-sub">{{ interest.record.branch }}</div>
}
@if (isShare && share) {
<div class="cpd-sig-sub">{{ share.branch }}</div>
}
@if (isBalance && balance) {
<div class="cpd-sig-sub">{{ balance.record.branch }}</div>
}
@if (isForm60 && form60) {
<div class="cpd-sig-sub">{{ form60.branch }}</div>
}
@if (isForm15gh && form15gh) {
<div class="cpd-sig-sub">{{ form15gh.record.branch }}</div>
}
@if (isHypothecation && hypothecation) {
<div class="cpd-sig-sub">{{ hypothecation.branch }}</div>
}
@if (isNoc && noc) {
<div class="cpd-sig-sub">{{ noc.branch }}</div>
}
</div>
<div class="cpd-seal">
<div class="cpd-seal-ring">
<div class="cpd-seal-inner">
<div class="cpd-seal-bank">NEXORA</div>
<div class="cpd-seal-line"></div>
<div class="cpd-seal-sub">CO-OPERATIVE BANK</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="cpd-footer">
<span>
Issued by {{ bankName }} on {{ issuedOn | date: 'd MMM y' }}. Computer generated — does not require physical
signature for record purposes.
</span>
</div>
</div>
</div>