diff --git a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts index 5cbc3b024..d0fb025da 100644 --- a/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts +++ b/src/app/clients/client-stepper/client-general-step/client-general-step.component.ts @@ -954,6 +954,75 @@ export class ClientGeneralStepComponent implements OnInit, OnDestroy, OnChanges Validators.required ] }); + + this.linkMonthlyAnnual('monthlyIncome', 'annualIncome'); + this.linkMonthlyAnnual('monthlyTurnover', 'annualTurnover'); + this.linkIncomeToTurnover(); + } + + /** + * Keeps a Monthly/Annual pair of amount fields in sync at a 12x ratio — typing into either + * one auto-fills the other. Uses { emitEvent: false } on the write side so the two + * subscriptions don't trigger each other back and forth. + */ + /** Rounds to at most 2 decimals without padding whole numbers with a trailing ".00". */ + private round2(n: number): string { + return (Math.round(n * 100) / 100).toString(); + } + + private linkMonthlyAnnual(monthlyControlName: string, annualControlName: string): void { + const monthly = this.createClientForm.get(monthlyControlName); + const annual = this.createClientForm.get(annualControlName); + if (!monthly || !annual) { + return; + } + + monthly.valueChanges.subscribe((value) => { + if (this.suppressMonthlyAnnualLink) { + return; + } + const num = parseFloat(value); + annual.setValue(!isNaN(num) && num >= 0 ? this.round2(num * 12) : '', { emitEvent: false }); + }); + + annual.valueChanges.subscribe((value) => { + if (this.suppressMonthlyAnnualLink) { + return; + } + const num = parseFloat(value); + monthly.setValue(!isNaN(num) && num >= 0 ? this.round2(num / 12) : '', { emitEvent: false }); + }); + } + + /** + * Auto-calculates turnover based on income (doubling monthly income for monthly turnover, + * and annual income for annual/yearly turnover). + */ + private linkIncomeToTurnover(): void { + const monthlyIncome = this.createClientForm.get('monthlyIncome'); + const monthlyTurnover = this.createClientForm.get('monthlyTurnover'); + const annualIncome = this.createClientForm.get('annualIncome'); + const annualTurnover = this.createClientForm.get('annualTurnover'); + + if (monthlyIncome && monthlyTurnover) { + monthlyIncome.valueChanges.subscribe((value) => { + if (this.suppressMonthlyAnnualLink) { + return; + } + const num = parseFloat(value); + monthlyTurnover.setValue(!isNaN(num) && num >= 0 ? this.round2(num * 2) : '', { emitEvent: true }); + }); + } + + if (annualIncome && annualTurnover) { + annualIncome.valueChanges.subscribe((value) => { + if (this.suppressMonthlyAnnualLink) { + return; + } + const num = parseFloat(value); + annualTurnover.setValue(!isNaN(num) && num >= 0 ? this.round2(num * 2) : '', { emitEvent: true }); + }); + } } /** diff --git a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html index b8644c83a..faa14f689 100644 --- a/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html +++ b/src/app/clients/client-stepper/client-kyc-step/client-kyc-step.component.html @@ -723,6 +723,33 @@ PAN verification requires client to be created first. Complete General tab and click Next to save. } + + +
| Quarter | +Interest | +Cumulative | +Liability to date | +TDS this quarter | +Return due | +
|---|---|---|---|---|---|
| + {{ line.label }} + @if (line.thresholdCrossedHere) { + threshold crossed + } + @if (line.declarationActive) { + Form 121 active + } + | +₹{{ line.interest | number: '1.0-0' }} | +₹{{ line.cumInterest | number: '1.0-0' }} | +₹{{ line.cumLiability | number: '1.0-0' }} | ++ @if (line.tds !== 0) { + ₹{{ line.tds | number: '1.0-0' }} + } @else { + — + } + | +{{ line.dueDate }} | +
| Total | ++ ₹{{ schedule.totalInterest | number: '1.0-0' }} + | ++ | + | + ₹{{ schedule.totalTds | number: '1.0-0' }} + | ++ |
| Account | +Type | +Interest (FY) | +TDS deducted | +Withholding | +Settles | +
|---|---|---|---|---|---|
|
+ {{ a.accountNo }}
+ {{ a.productName }}
+ |
+ {{ a.kind }} | +₹{{ a.interest | number: '1.0-0' }} | +₹{{ a.tdsDeducted | number: '1.0-0' }} | +
+ @if (a.withHoldTax) {
+ On
+ @if (a.taxGroup) {
+ {{ a.taxGroup }}
+ }
+ } @else {
+ Off
+ }
+ |
+ {{ a.mode === 'QUARTERLY' ? 'Quarterly' : 'Year end' }} | +
| Account | +Type | +Interest (FY) | +Deducted against | +
|---|---|---|---|
|
+ {{ a.accountNo }}
+ {{ a.productName }}
+ |
+ {{ a.kind }} | +₹{{ a.interest | number: '1.0-0' }} | ++ First-named holder + @if (a.deducteeClientId) { + (client {{ a.deducteeClientId }}) + } + | +
| Account | +Type | +Interest (FY) | +TDS | +
|---|---|---|---|
|
+ {{ a.accountNo }}
+ {{ a.productName }}
+ |
+ {{ a.kind }} | +₹{{ a.interest | number: '1.0-0' }} | +Not applicable | +
| Client / Account | +Branch | +Exception Reason & Date | +Risk | +Contact Status | +Contact Logs | +Actions | +
|---|---|---|---|---|---|---|
|
+ {{ c.name }}
+ {{ c.account }}
+ |
+ {{ c.contact.branch }} | +
+ {{ c.exceptionReason }}
+ Opened: {{ c.exceptionDate }}
+ |
+ + {{ c.riskLabel }} + | +
+ @if (c.contactHistory && c.contactHistory.length > 0) {
+ Contacted
+ Last: {{ c.contactHistory[c.contactHistory.length - 1].date }}
+ } @else {
+ Not Contacted
+ }
+ |
+
+ @if (c.contactHistory && c.contactHistory.length > 0) {
+
+ @for (log of c.contactHistory; track $index) {
+
+ } @else {
+ No logs recorded
+ }
+
+ {{ log.date }} ({{ log.action }}): {{ log.notes }} — {{ log.officer }}
+ @if (log.platformSent) {
+ @if (log.delivered) {
+ Sent {{ log.destinationMasked }}
+ } @else {
+ Not sent
+ }
+ }
+
+ }
+ |
+
+
+
+
+
+ |
+
| Client / Account | +Branch | +Exception Reason & Resolution | +Risk | +Contact Logs | +Status | +
|---|---|---|---|---|---|
|
+ {{ c.name }}
+ {{ c.account }}
+ |
+ {{ c.contact.branch }} | +
+ {{ c.exceptionReason }}
+ Resolved On: {{ c.exceptionResolvedOn }}
+ |
+ + {{ c.riskLabel }} + | +
+ @if (c.contactHistory && c.contactHistory.length > 0) {
+
+ @for (log of c.contactHistory; track $index) {
+
+ } @else {
+ No logs recorded
+ }
+
+ {{ log.date }} ({{ log.action }}): {{ log.notes }} — {{ log.officer }}
+ @if (log.platformSent) {
+ @if (log.delivered) {
+ Sent {{ log.destinationMasked }}
+ } @else {
+ Not sent
+ }
+ }
+
+ }
+ |
+
+
+ |
+
- This is to certify that {{ interest.record.customerName }} (Customer ID - {{ interest.record.customerId }}) is availing the following loan facility from our bank, and the interest paid by the above customer during the - financial year {{ interest.fy.fy }} is as detailed below. -
++ This is to certify that {{ interest.record.customerName }} (Customer ID + {{ interest.record.customerId }}) is availing the following loan facility from our bank, and the + interest paid by the above customer during the + financial year {{ interest.fy.fy }} is as detailed below. +
-| Loan Account No. | -- {{ interest.record.accountNo }} - | -Branch | -{{ interest.record.branch }} | -
| Loan Type | -{{ interest.record.loanType }} | -Disbursed On | -{{ interest.record.disbursementDate | date: 'd MMM y' }} | -
| Sanctioned Amount | -₹{{ interest.record.sanctionedAmount | number: '1.2-2' }} | -Interest Rate | -{{ interest.record.interestRate }}% p.a. | -
| Opening Balance ({{ interest.fy.fy | slice: 0 : 8 }}) | -₹{{ interest.fy.openingBalance | number: '1.2-2' }} | -Closing Balance | -₹{{ interest.fy.closingBalance | number: '1.2-2' }} | -
| Principal Repaid | -₹{{ interest.fy.principalPaid | number: '1.2-2' }} | -Interest Paid | -- ₹{{ interest.fy.interestPaid | number: '1.2-2' }} - | -
| TOTAL INTEREST PAID DURING {{ interest.fy.fy }} | -- ₹{{ interest.fy.interestPaid | number: '1.2-2' }} - | -||
| Loan Account No. | ++ {{ interest.record.accountNo }} + | +Branch | +{{ interest.record.branch }} | +
| Loan Type | +{{ interest.record.loanType }} | +Disbursed On | +{{ interest.record.disbursementDate | date: 'd MMM y' }} | +
| Sanctioned Amount | +₹{{ interest.record.sanctionedAmount | number: '1.2-2' }} | +Interest Rate | +{{ interest.record.interestRate }}% p.a. | +
| Opening Balance ({{ interest.fy.fy | slice: 0 : 8 }}) | +₹{{ interest.fy.openingBalance | number: '1.2-2' }} | +Closing Balance | +₹{{ interest.fy.closingBalance | number: '1.2-2' }} | +
| Principal Repaid | +₹{{ interest.fy.principalPaid | number: '1.2-2' }} | +Interest Paid | ++ ₹{{ interest.fy.interestPaid | number: '1.2-2' }} + | +
| TOTAL INTEREST PAID DURING {{ interest.fy.fy }} | ++ ₹{{ interest.fy.interestPaid | number: '1.2-2' }} + | +||
- 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. -
++ 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. +
} @if (isShare && share) { -- This is to certify that {{ share.memberName }} is the registered holder of - {{ share.shareCount | number }} ({{ classLabelText() }}) shares of - ₹{{ share.faceValue | number: '1.0-0' }} each, fully paid up, in {{ bankName }}, subject to the bye-laws of the bank. -
++ This is to certify that {{ share.memberName }} is the registered holder of + {{ share.shareCount | number }} ({{ classLabelText() }}) shares of + ₹{{ share.faceValue | number: '1.0-0' }} each, fully paid up, in {{ bankName }}, + subject to the bye-laws of the bank. +
-| Certificate No. | -- {{ share.certificateNo }} - | -Folio No. | -{{ share.folioNo }} | -
| Branch | -{{ share.branch }} | -Member Since | -{{ share.joiningDate | date: 'd MMM y' }} | -
| Share Class | -{{ classLabelText() }} | -Date of Issue | -{{ share.issueDate | date: 'd MMM y' }} | -
| Share Numbers | -{{ share.shareNoFrom | number }} – {{ share.shareNoTo | number }} | -Dividend Paid (Cumulative) | -₹{{ share.dividendYtd | number: '1.0-0' }} | -
| TOTAL FACE VALUE | -- ₹{{ share.shareCount * share.faceValue | number: '1.2-2' }} - | -||
| Certificate No. | ++ {{ share.certificateNo }} + | +Folio No. | +{{ share.folioNo }} | +
| Branch | +{{ share.branch }} | +Member Since | +{{ share.joiningDate | date: 'd MMM y' }} | +
| Share Class | +{{ classLabelText() }} | +Date of Issue | +{{ share.issueDate | date: 'd MMM y' }} | +
| Share Numbers | +{{ share.shareNoFrom | number }} – {{ share.shareNoTo | number }} | +Dividend Paid (Cumulative) | +₹{{ share.dividendYtd | number: '1.0-0' }} | +
| TOTAL FACE VALUE | ++ ₹{{ share.shareCount * share.faceValue | number: '1.2-2' }} + | +||
- Given under the common seal of the bank this {{ issuedOn | date: 'd' }} day of {{ issuedOn | date: 'MMMM y' }}. -
++ Given under the common seal of the bank this {{ issuedOn | date: 'd' }} day of {{ issuedOn | date: 'MMMM y' }}. +
} @if (isBalance && balance) { -- This is to certify that {{ balance.record.customerName }} (Customer ID - {{ balance.record.customerId }}) maintains the following account with our bank, and the balance available in the said account as on - {{ balance.asOnDate | date: 'd MMMM y' }} is as detailed below. -
++ This is to certify that {{ balance.record.customerName }} (Customer ID + {{ balance.record.customerId }}) maintains the following account with our bank, and the balance + available in the said account as on + {{ balance.asOnDate | date: 'd MMMM y' }} is as detailed below. +
-| Account No. | -- {{ balance.record.accountNo }} - | -Branch | -{{ balance.record.branch }} | -
| Account Type | -{{ accountTypeLabelText() }} | -Product | -{{ balance.record.productName }} | -
| Account Opened | -{{ balance.record.openedOn | date: 'd MMM y' }} | -Interest Rate | -- @if (balance.record.interestRate) { - {{ balance.record.interestRate }}% p.a. - } @else { - — - } - | -
| Available Balance | -₹{{ balance.record.availableBalance | number: '1.2-2' }} | -Accrued Interest | -₹{{ balance.record.accruedInterest | number: '1.2-2' }} | -
| TOTAL LEDGER BALANCE AS ON {{ balance.asOnDate | date: 'd MMM y' }} | -- ₹{{ balance.record.ledgerBalance | number: '1.2-2' }} - | -||
| Account No. | ++ {{ balance.record.accountNo }} + | +Branch | +{{ balance.record.branch }} | +
| Account Type | +{{ accountTypeLabelText() }} | +Product | +{{ balance.record.productName }} | +
| Account Opened | +{{ balance.record.openedOn | date: 'd MMM y' }} | +Interest Rate | ++ @if (balance.record.interestRate) { + {{ balance.record.interestRate }}% p.a. + } @else { + — + } + | +
| Available Balance | +₹{{ balance.record.availableBalance | number: '1.2-2' }} | +Accrued Interest | +₹{{ balance.record.accruedInterest | number: '1.2-2' }} | +
| TOTAL LEDGER BALANCE AS ON {{ balance.asOnDate | date: 'd MMM y' }} | ++ ₹{{ balance.record.ledgerBalance | number: '1.2-2' }} + | +||
- 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. -
++ 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. +
} @if (isForm60 && form60) { -- Declaration under Section 114B 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. -
++ Declaration under Section 114B 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. +
-| 1. Full Name (in Block Letters) | -- {{ form60.customerName }} - | -||
| 2. Father's / Spouse's Name | -{{ form60.fatherName }} | -||
| 3. Date of Birth | -{{ form60.dob | date: 'd MMM y' }} | -4. Customer ID | -{{ form60.customerId }} | -
| 5. Address | -{{ form60.customerAddress }} | -||
| 6. ID Proof Submitted | -{{ idProofLabelText() }} | -7. ID Document No. | -{{ form60.idProofNumber }} | -
| 8. Nature of Transaction | -{{ form60.transactionType }} | -||
| 9. Transaction Amount | -₹{{ form60.transactionAmount | number: '1.2-2' }} | -10. Transaction Date | -{{ form60.transactionDate | date: 'd MMM y' }} | -
| 11. Estimated Total Income (Current FY) | -₹{{ form60.estimatedIncome | number: '1.0-0' }} | -12. Agricultural Income | -₹{{ form60.agriIncome | number: '1.0-0' }} | -
| PAN STATUS | -- NOT ALLOTTED — Form 97 declared - | -||
| 1. Full Name (in Block Letters) | ++ {{ form60.customerName }} + | +||
| 2. Father's / Spouse's Name | +{{ form60.fatherName }} | +||
| 3. Date of Birth | +{{ form60.dob | date: 'd MMM y' }} | +4. Customer ID | +{{ form60.customerId }} | +
| 5. Address | +{{ form60.customerAddress }} | +||
| 6. ID Proof Submitted | +{{ idProofLabelText() }} | +7. ID Document No. | +{{ form60.idProofNumber }} | +
| 8. Nature of Transaction | +{{ form60.transactionType }} | +||
| 9. Transaction Amount | +₹{{ form60.transactionAmount | number: '1.2-2' }} | +10. Transaction Date | +{{ form60.transactionDate | date: 'd MMM y' }} | +
| 11. Estimated Total Income (Current FY) | +₹{{ form60.estimatedIncome | number: '1.0-0' }} | +12. Agricultural Income | +₹{{ form60.agriIncome | number: '1.0-0' }} | +
| PAN STATUS | ++ NOT ALLOTTED — Form 97 declared + | +||
- I, {{ form60.customerName }}, 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. -
++ I, {{ form60.customerName }}, 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. +
} @if (isForm15gh && form15gh) { -- Declaration under Section {{ form15gh.kind === '15H' ? '197A(1C)' : '197A(1) / 197A(1A)' }} - 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' - }}. -
++ Declaration under Section {{ form15gh.kind === '15H' ? '197A(1C)' : '197A(1) / 197A(1A)' }} + 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' + }}. +
-| 1. Name of Assessee | -- {{ form15gh.record.customerName }} - | -||
| 2. PAN of Assessee | -{{ form15gh.record.customerPan }} | -3. Status | -Individual | -
| 4. Previous Year | -{{ form15gh.record.fy }} | -5. Age (years) | -{{ form15gh.age }} | -
| 6. Address | -{{ form15gh.record.customerAddress }} | -||
| 7. Branch | -{{ form15gh.record.branch }} | -8. Customer ID | -{{ form15gh.record.customerId }} | -
| 9. Deposit Principal | -₹{{ form15gh.record.depositPrincipal | number: '1.0-0' }} | -10. Estimated Interest ({{ form15gh.record.fy }}) | -- ₹{{ form15gh.record.estimatedInterest | number: '1.0-0' }} - | -
| 11. Estimated Total Income | -₹{{ form15gh.record.estimatedIncome | number: '1.0-0' }} | -12. Previously Assessed? | -{{ form15gh.record.assessed ? 'Yes' : 'No' }} | -
| TAX PAYABLE ON ESTIMATED INCOME | -NIL | -||
| 1. Name of Assessee | ++ {{ form15gh.record.customerName }} + | +||
| 2. PAN of Assessee | +{{ form15gh.record.customerPan }} | +3. Status | +Individual | +
| 4. Previous Year | +{{ form15gh.record.fy }} | +5. Age (years) | +{{ form15gh.age }} | +
| 6. Address | +{{ form15gh.record.customerAddress }} | +||
| 7. Branch | +{{ form15gh.record.branch }} | +8. Customer ID | +{{ form15gh.record.customerId }} | +
| 9. Deposit Principal | +₹{{ form15gh.record.depositPrincipal | number: '1.0-0' }} | +10. Estimated Interest ({{ form15gh.record.fy }}) | ++ ₹{{ form15gh.record.estimatedInterest | number: '1.0-0' }} + | +
| 11. Estimated Total Income | +₹{{ form15gh.record.estimatedIncome | number: '1.0-0' }} | +12. Previously Assessed? | +{{ form15gh.record.assessed ? 'Yes' : 'No' }} | +
| TAX PAYABLE ON ESTIMATED INCOME | +NIL | +||
- I, {{ form15gh.record.customerName }}, 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. -
++ I, {{ form15gh.record.customerName }}, 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. +
} @if (isHypothecation && hypothecation) { -- This is to certify that the asset described below stands hypothecated to - {{ bankName }} as security for the captioned loan facility extended to - {{ hypothecation.customerName }}, and the bank holds the first and exclusive charge over the said asset until the loan is fully discharged. -
++ This is to certify that the asset described below stands hypothecated to + {{ bankName }} as security for the captioned loan facility extended to + {{ hypothecation.customerName }}, and the bank holds the first and exclusive charge over the said + asset until the loan is fully discharged. +
-| Certificate No. | -- {{ hypothecation.certificateNo }} - | -Loan Account No. | -{{ hypothecation.accountNo }} | -
| Loan Type | -{{ hypothecation.loanType }} | -Branch | -{{ hypothecation.branch }} | -
| Sanctioned Amount | -₹{{ hypothecation.sanctionedAmount | number: '1.0-0' }} | -Disbursed On | -{{ hypothecation.disbursementDate | date: 'd MMM y' }} | -
| Asset Type | -{{ assetLabelText() }} | -Identifier | -{{ hypothecation.assetIdentifier }} | -
| Asset Description | -{{ hypothecation.assetDescription }} | -||
| Insured Value | -₹{{ hypothecation.insuredValue | number: '1.0-0' }} | -Insurance Valid Till | -{{ hypothecation.insuranceValidTill | date: 'd MMM y' }} | -
| OUTSTANDING PRINCIPAL | -- ₹{{ hypothecation.outstandingPrincipal | number: '1.2-2' }} - | -||
| Certificate No. | ++ {{ hypothecation.certificateNo }} + | +Loan Account No. | +{{ hypothecation.accountNo }} | +
| Loan Type | +{{ hypothecation.loanType }} | +Branch | +{{ hypothecation.branch }} | +
| Sanctioned Amount | +₹{{ hypothecation.sanctionedAmount | number: '1.0-0' }} | +Disbursed On | +{{ hypothecation.disbursementDate | date: 'd MMM y' }} | +
| Asset Type | +{{ assetLabelText() }} | +Identifier | +{{ hypothecation.assetIdentifier }} | +
| Asset Description | +{{ hypothecation.assetDescription }} | +||
| Insured Value | +₹{{ hypothecation.insuredValue | number: '1.0-0' }} | +Insurance Valid Till | +{{ hypothecation.insuranceValidTill | date: 'd MMM y' }} | +
| OUTSTANDING PRINCIPAL | ++ ₹{{ hypothecation.outstandingPrincipal | number: '1.2-2' }} + | +||
- 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. -
++ 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. +
} @if (isNoc && noc) { -- This is to certify that the captioned loan account in the name of - {{ noc.customerName }} - has been - @if (noc.status === 'ISSUED') { - duly closed and the bank - } @else { - closed and the bank - } - has NO OBJECTION 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. -
- -| NOC No. | -- {{ noc.nocNo }} - | -Loan Account No. | -{{ noc.accountNo }} | -
| Loan Type | -{{ nocLoanTypeLabel() }} | -Branch | -{{ noc.branch }} | -
| Sanctioned Amount | -₹{{ noc.sanctionedAmount | number: '1.0-0' }} | -Disbursed On | -{{ noc.disbursementDate | date: 'd MMM y' }} | -
| Account Closed On | -- {{ noc.closureDate | date: 'd MMM y' }} - | -Total Paid | -₹{{ noc.totalPaid | number: '1.2-2' }} | -
| Asset Type | -{{ nocAssetLabel() }} | -Identifier | -{{ noc.assetIdentifier }} | -
| Asset Description | -{{ noc.assetDescription }} | -||
| Forward To | -{{ noc.forwardTo }} | -||
| - @if (noc.assetType === 'NONE') { - ACCOUNT CLOSED — NO DUES OUTSTANDING - } @else { - LIEN RELEASED — NO OBJECTION TO TRANSFER - } - | -NIL | -||
- @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. - } -
- - @if (noc.status === 'ISSUED' && noc.issuedOn) { -- Issued on: {{ noc.issuedOn | date: 'd MMM y' }} - @if (noc.issuedBy) { - · By: {{ noc.issuedBy }} - } -
++ This is to certify that the captioned loan account in the name of + {{ noc.customerName }} + has been + @if (noc.status === 'ISSUED') { + duly closed and the bank + } @else { + closed and the bank } + has NO OBJECTION 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. +
+ +| NOC No. | ++ {{ noc.nocNo }} + | +Loan Account No. | +{{ noc.accountNo }} | +
| Loan Type | +{{ nocLoanTypeLabel() }} | +Branch | +{{ noc.branch }} | +
| Sanctioned Amount | +₹{{ noc.sanctionedAmount | number: '1.0-0' }} | +Disbursed On | +{{ noc.disbursementDate | date: 'd MMM y' }} | +
| Account Closed On | ++ {{ noc.closureDate | date: 'd MMM y' }} + | +Total Paid | +₹{{ noc.totalPaid | number: '1.2-2' }} | +
| Asset Type | +{{ nocAssetLabel() }} | +Identifier | +{{ noc.assetIdentifier }} | +
| Asset Description | +{{ noc.assetDescription }} | +||
| Forward To | +{{ noc.forwardTo }} | +||
| + @if (noc.assetType === 'NONE') { + ACCOUNT CLOSED — NO DUES OUTSTANDING + } @else { + LIEN RELEASED — NO OBJECTION TO TRANSFER + } + | +NIL | +||
+ @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. + } +
+ + @if (noc.status === 'ISSUED' && noc.issuedOn) { ++ Issued on: {{ noc.issuedOn | date: 'd MMM y' }} + @if (noc.issuedBy) { + · By: {{ noc.issuedBy }} + } +
+ } } @@ -660,25 +660,25 @@| Quarter | +Interest | +Cumulative | +Liability to date | +TDS this quarter | +Return due | +
|---|---|---|---|---|---|
| + {{ line.label }} + @if (line.thresholdCrossedHere) { + threshold crossed + } + @if (line.declarationActive) { + Form 121 active + } + | +₹{{ line.interest | number: '1.0-0' }} | +₹{{ line.cumInterest | number: '1.0-0' }} | +₹{{ line.cumLiability | number: '1.0-0' }} | ++ @if (line.tds !== 0) { + ₹{{ line.tds | number: '1.0-0' }} + } @else { + — + } + | +{{ line.dueDate }} | +
| Total | ++ ₹{{ row.schedule.totalInterest | number: '1.0-0' }} + | ++ | + | + ₹{{ row.schedule.totalTds | number: '1.0-0' }} + | ++ |
| Customer · PAN | +Form · Band | +Age | +Branch | +Est. Interest | +Threshold | +TDS Payable | +TDS Saved | +Settlement | +Status | +Actions | +||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
+ {{ row.row.record.customerName }}
+ {{ row.row.record.customerId }} · PAN {{ row.row.record.customerPan || '—' }}
+ DOB {{ row.row.record.dob | date: 'd MMM y' }}
+ |
+
+
+ {{ row.row.form === '121' ? 'Form 121' : 'Form ' + row.row.form }}
+
+ {{ row.row.band === 'SENIOR' ? 'Senior citizen' : 'General' }}
+ |
+ {{ row.row.age }} yrs | +{{ row.row.record.branch || '—' }} | ++ ₹{{ row.row.record.estimatedInterest | number: '1.0-0' }} + | +₹{{ row.row.schedule.threshold | number: '1.0-0' }} | +
+ @if (row.row.schedule.totalTds > 0) {
+ ₹{{ row.row.schedule.totalTds | number: '1.0-0' }}
+ @ {{ row.row.schedule.rateApplied * 100 | number: '1.0-0' }}%
+ } @else {
+ —
+ }
+ |
+ + @if (row.row.tdsSaved > 0) { + ₹{{ row.row.tdsSaved | number: '1.0-0' }} + } @else { + — + } + | +
+
+ {{ row.row.mode === 'QUARTERLY' ? 'Quarterly' : 'Year end' }}
+
+ product-driven
+ |
+
+ @if (row.row.record.status === 'FILED') {
+ {{ row.row.record.filedOn | date: 'd MMM y' }}
+ }
+ } @else {
+
+
+ }
+ |
+
+
+
+ |
+ ||||||||||||||||||
|
+ @if (!row.row.eligibility.eligible) {
+
+
+ }
+ @for (note of row.row.eligibility.unassessed; track note) {
+
+ Declaration cannot be accepted
+
+
+
+ }
+ @for (note of row.row.schedule.notes; track note) {
+ {{ note }}
+
+
+ }
+
+ {{ note }}
+
+ ₹{{ row.row.schedule.shieldedInterest | number: '1.0-0' }} paid without deduction on the strength of
+ the declaration — reportable in the quarterly {{ statute.statement }} return.
+
+ }
+ |
+ ||||||||||||||||||||||||||||
|
+ |
+ ||||||||||||||||||||||||||||
| Customer · PAN | +Branch | +Form · Band | +Q1 | +Q2 | +Q3 | +Q4 | +Year total | +Threshold | +Crossed | +TDS | +Saved | ++ | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
+ {{ row.deductee.name }}
+
+ {{ row.deductee.customerId }} ·
+ @if (row.panOnRecord) {
+ {{ row.deductee.pan }}
+ } @else {
+ no PAN
+ }
+
+ |
+ {{ branchName(row.branchCode) }} | +
+
+ {{ row.form === '121' ? '121' : row.form }}
+
+ {{ row.band === 'SENIOR' ? 'Senior' : 'General' }}
+ @if (row.hasDeclaration) {
+ {{ row.declarationUin }}
+ }
+ |
+ @for (q of quarters; track q) {
+ + @if (row.quarters[q]) { + ₹{{ row.quarters[q] | number: '1.0-0' }} + } @else { + — + } + | + } +
+ ₹{{ row.tdsApplicableInterest | number: '1.0-0' }}
+ @if (row.exemptInterest) {
+ +₹{{ row.exemptInterest | number: '1.0-0' }} SB (exempt)
+ }
+ |
+ ₹{{ row.threshold | number: '1.0-0' }} | ++ @if (row.crossedInQuarter) { + Q{{ row.crossedInQuarter }} + } @else if (row.nearThreshold) { + ₹{{ row.headroom | number: '1.0-0' }} left + } @else { + — + } + | +
+ @if (row.schedule.totalTds) {
+ ₹{{ row.schedule.totalTds | number: '1.0-0' }}
+ @ {{ row.rateApplied * 100 | number: '1.0-0' }}%
+ } @else {
+ —
+ }
+ |
+ + @if (row.tdsSaved) { + ₹{{ row.tdsSaved | number: '1.0-0' }} + } @else { + — + } + | +
+ |
+ |||||||||||||||
|
+ @for (note of row.schedule.notes; track note) {
+
+
+ }
+ @if (row.jointHeldInterest) {
+ {{ note }}
+
+
+ }
+
+
+ ₹{{ row.jointHeldInterest | number: '1.0-0' }} of interest sits on deposits where this customer
+ is a joint holder but not the first-named one. Tax there is deducted against the first-named
+ holder, so it is excluded from the figures above.
+
+
|
+ ||||||||||||||||||||||||
|
+ |
+ ||||||||||||||||||||||||
| Quarter | +Deduction month | +Amount | +Due date | +Deposited on | +Challan · BSR | +Status | +Late-deposit interest | +{{ statute.statement }} due | +
|---|---|---|---|---|---|---|---|---|
| + {{ quarterLabel[row.quarter] }} + | +{{ row.month }} | ++ ₹{{ row.amount | number: '1.0-0' }} + | +{{ row.dueDate | date: 'd MMM y' }} | ++ @if (row.depositedOn) { + {{ row.depositedOn | date: 'd MMM y' }} + } @else { + — + } + | +
+ @if (row.challanNo) {
+ {{ row.challanNo }}
+ BSR {{ row.bsrCode }}
+ } @else {
+ —
+ }
+ |
+ + @if (row.overdue) { + Overdue + } @else if (row.late) { + Late by {{ row.delayMonths }}m + } @else if (row.depositedOn) { + On time + } @else { + Within due date + } + | +
+ @if (row.defaultInterest) {
+ ₹{{ row.defaultInterest | number: '1.0-0' }}
+ 1.5% × {{ row.delayMonths }}
+ } @else {
+ —
+ }
+ |
+ {{ row.returnDueDate }} | +
|
+ |
+ ||||||||