fix: Recurring Deposit accounts issues

This commit is contained in:
Jose Alberto Hernandez
2024-06-09 23:06:30 -06:00
committed by Jose Alberto Hernandez
parent 9b51ec4694
commit b23efd3e1c
23 changed files with 402 additions and 121 deletions
@@ -47,7 +47,7 @@
<ng-template matStepLabel>{{"labels.inputs.SETTINGS" | translate }}</ng-template>
<mifosx-recurring-deposits-account-settings-step
<mifosx-recurring-deposits-account-settings-step [isNew]="false"
[recurringDepositsAccountTemplate]="recurringDepositsAccountAndTemplate"
[recurringDepositsAccountProductTemplate]="recurringDepositsAccountProductTemplate">
</mifosx-recurring-deposits-account-settings-step>
@@ -1,6 +1,7 @@
<div class="container">
<mat-card>
<h2 mat-title *ngIf="transactionType.withdrawal">{{'labels.menus.' + actionName | translate }} {{'labels.heading.Recurring Deposit Transactions' | translate}}</h2>
<form [formGroup]="depositRecurringDepositForm" (ngSubmit)="submit()">
@@ -19,15 +20,10 @@
</mat-error>
</mat-form-field>
<mat-form-field appearance="fill">
<mat-label>{{"labels.inputs.Transaction Amount" | translate}}</mat-label>
<span matTextSuffix class="m-l-10">{{ currency.code }}</span>
<span fxFlex="auto"></span>
<input type="number" matInput required class="right-input" formControlName="transactionAmount">
<mat-error *ngIf="depositRecurringDepositForm.controls.transactionAmount.hasError('required')">
{{"labels.inputs.Transaction Amount" | translate}} {{"labels.commons.is" | translate}} <strong>{{"labels.commons.required" | translate}}</strong>
</mat-error>
</mat-form-field>
<mifosx-input-amount [currency]="currency" [isRequired]="true"
[inputFormControl]="depositRecurringDepositForm.controls.transactionAmount"
[inputLabel]="'Transaction Amount'">
</mifosx-input-amount>
<mat-form-field>
<mat-label>{{"labels.inputs.Payment Type Id" | translate }}</mat-label>
@@ -39,6 +39,9 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
depositRecurringDepositForm: UntypedFormGroup;
action: string;
actionName: string;
transactionCommand: string;
transactionType: { deposit: boolean, withdrawal: boolean } = { deposit: false, withdrawal: false };
/**
* Retrieves action details transactions template data from `resolve`
@@ -64,8 +67,10 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
this.transactionAmount = this.transactionAmount + this.outstandingChargeAmount;
}
});
const name: string = this.route.snapshot.params['name'];
this.action = name.toLowerCase();
this.actionName = this.route.snapshot.params['name'];
this.action = this.actionName.toLowerCase();
this.transactionCommand = this.action.toLowerCase();
this.transactionType[this.transactionCommand] = true;
this.accountId = this.route.parent.snapshot.params['recurringDepositAccountId'];
}
@@ -80,7 +85,7 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
createdepositRecurringDepositForm() {
this.depositRecurringDepositForm = this.formBuilder.group({
'transactionDate': [new Date(), Validators.required],
'transactionAmount': [this.transactionAmount, Validators.required],
'transactionAmount': [0.0, Validators.required],
'paymentTypeId': ['', Validators.required],
'note': ''
});
@@ -131,6 +136,7 @@ export class DepositRecurringDepositsAccountComponent implements OnInit {
};
delete data['note'];
data['transactionAmount'] = data['transactionAmount'] * 1;
this.recurringDepositsService.executeRecurringDepositsAccountCommand(this.accountId, this.action, data).subscribe(() => {
this.router.navigate(['../../'], { relativeTo: this.route });
});
@@ -29,14 +29,14 @@
<ng-container matColumnDef="chargeCalculationType">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Type" | translate }} </th>
<td mat-cell *matCellDef="let charge">
{{ charge.chargeCalculationType.value }}
{{ charge.chargeCalculationType.value | translateKey:'catalogs' }}
</td>
</ng-container>
<ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Amount" | translate }} </th>
<td mat-cell *matCellDef="let charge">
{{ charge.amount }}
{{ charge.amount | formatNumber }}
<button mat-icon-button color="primary" (click)="editChargeAmount(charge)">
<fa-icon icon="pen"></fa-icon>
</button>
@@ -46,7 +46,7 @@
<ng-container matColumnDef="chargeTimeType">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Collected On" | translate }} </th>
<td mat-cell *matCellDef="let charge">
{{ charge.chargeTimeType.value }}
{{ charge.chargeTimeType.value | translateKey:'catalogs' }}
</td>
</ng-container>
@@ -31,17 +31,17 @@
<ng-container matColumnDef="period">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Period" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">
{{chartSlab.fromPeriod}}-{{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value}}</td>
{{chartSlab.fromPeriod}} - {{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value | translateKey:'catalogs'}}</td>
</ng-container>
<ng-container matColumnDef="amountRange">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Amount Range" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom}}-{{chartSlab.amountRangeTo}}</td>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom | formatNumber}} - {{chartSlab.amountRangeTo | formatNumber }}</td>
</ng-container>
<ng-container matColumnDef="interest">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Interest" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate }} </td>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate | formatNumber }} %</td>
</ng-container>
<ng-container matColumnDef="description">
@@ -120,7 +120,7 @@
<ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Interest" | translate }} </th>
<td mat-cell *matCellDef="let incentive">
{{ incentive.amount }}
{{ incentive.amount | formatNumber }}
</td>
</ng-container>
@@ -46,25 +46,25 @@
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Interest Compounding Period" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.interestCompoundingPeriodType | find:recurringDepositsAccountProductTemplate.interestCompoundingPeriodTypeOptions:'id':'value' }}</span>
fxFlex="60%">{{ recurringDepositAccountData.interestCompoundingPeriodType | find:recurringDepositsAccountProductTemplate.interestCompoundingPeriodTypeOptions:'id':'value' | translateKey:'catalogs' }}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Interest Posting Period" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.interestPostingPeriodType | find:recurringDepositsAccountProductTemplate.interestPostingPeriodTypeOptions:'id':'value' }}</span>
fxFlex="60%">{{ recurringDepositAccountData.interestPostingPeriodType | find:recurringDepositsAccountProductTemplate.interestPostingPeriodTypeOptions:'id':'value' | translateKey:'catalogs' }}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Interest Calculated using" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.interestCalculationType | find:recurringDepositsAccountProductTemplate.interestCalculationTypeOptions:'id':'value' }}</span>
fxFlex="60%">{{ recurringDepositAccountData.interestCalculationType | find:recurringDepositsAccountProductTemplate.interestCalculationTypeOptions:'id':'value' | translateKey:'catalogs' }}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Days in Year" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.interestCalculationDaysInYearType | find:recurringDepositsAccountProductTemplate.interestCalculationDaysInYearTypeOptions:'id':'value' }}</span>
fxFlex="60%">{{ recurringDepositAccountData.interestCalculationDaysInYearType | find:recurringDepositsAccountProductTemplate.interestCalculationDaysInYearTypeOptions:'id':'value' | translateKey:'catalogs' }}</span>
</div>
<h3 class="mat-h3" fxFlexFill>{{"labels.heading.Settings" | translate }}</h3>
@@ -74,7 +74,7 @@
<div fxFlexFill *ngIf="recurringDepositAccountData.lockinPeriodFrequency">
<span fxFlex="40%">{{"labels.inputs.Lock-in Period" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.lockinPeriodFrequency + ' ' + (recurringDepositAccountData.lockinPeriodFrequencyType | find:recurringDepositsAccountProductTemplate.lockinPeriodFrequencyTypeOptions:'id':'value') }}</span>
fxFlex="60%">{{ recurringDepositAccountData.lockinPeriodFrequency}} {{(recurringDepositAccountData.lockinPeriodFrequencyType | find:recurringDepositsAccountProductTemplate.lockinPeriodFrequencyTypeOptions:'id':'value') | translateKey:'catalogs'}}</span>
</div>
<div fxFlexFill *ngIf="recurringDepositAccountData.mandatoryRecommendedDepositAmount">
@@ -85,12 +85,12 @@
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Deposit Period" | translate }}:</span>
<span
fxFlex="60%">{{ recurringDepositAccountData.depositPeriod + ' ' + (recurringDepositAccountData.depositPeriodFrequencyId | find:recurringDepositsAccountProductTemplate.periodFrequencyTypeData:'id':'value') }}</span>
fxFlex="60%">{{ recurringDepositAccountData.depositPeriod}} {{recurringDepositAccountData.depositPeriodFrequencyId | find:recurringDepositsAccountProductTemplate.periodFrequencyTypeOptions:'id':'value' | translateKey:'catalogs'}}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Deposit Frequency Same as Group/Center meeting" | translate }}:</span>
<span fxFlex="60%">{{ recurringDepositsAccountProductTemplate.isCalendarInherited === true ? 'Yes' : 'No' }}</span>
<span fxFlex="60%">{{ recurringDepositsAccountProductTemplate.isCalendarInherited | yesNo }}</span>
</div>
<ng-container *ngIf="!recurringDepositsAccountProductTemplate.isCalendarInherited">
@@ -102,7 +102,7 @@
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Deposit Frequency" | translate }}:</span>
<span *ngIf="recurringDepositAccountData.recurringFrequency"
fxFlex="60%">{{ recurringDepositAccountData.recurringFrequency + ' ' + (recurringDepositAccountData.recurringFrequencyType | find:recurringDepositsAccountProductTemplate.periodFrequencyTypeData:'id':'value')}}</span>
fxFlex="60%">{{ recurringDepositAccountData.recurringFrequency}} {{(recurringDepositAccountData.recurringFrequencyType | find:recurringDepositsAccountProductTemplate.periodFrequencyTypeOptions:'id':'value') | translateKey:'catalogs'}}</span>
</div>
</ng-container>
@@ -110,19 +110,19 @@
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Minimum Deposit Term" | translate }}:</span>
<span
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.minDepositTerm ? recurringDepositsAccountProductTemplate.minDepositTerm: '') + ' ' + (this.recurringDepositsAccountProductTemplate.minDepositTermType ? this.recurringDepositsAccountProductTemplate.minDepositTermType.value: '') }}</span>
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.minDepositTerm ? recurringDepositsAccountProductTemplate.minDepositTerm: '')}} {{(this.recurringDepositsAccountProductTemplate.minDepositTermType ? this.recurringDepositsAccountProductTemplate.minDepositTermType.value: '') | translateKey:'catalogs'}}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.In Multiples Of" | translate }}:</span>
<span
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.inMultiplesOfDepositTerm ? recurringDepositsAccountProductTemplate.inMultiplesOfDepositTerm: '') + ' ' + (this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType ? this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType.value: '') }}</span>
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.inMultiplesOfDepositTerm ? recurringDepositsAccountProductTemplate.inMultiplesOfDepositTerm: '')}} {{(this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType ? this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType.value: '') | translateKey:'catalogs'}}</span>
</div>
<div fxFlexFill>
<span fxFlex="40%">{{"labels.inputs.Maximum Deposit Term" | translate }}</span>
<span
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.maxDepositTerm ? recurringDepositsAccountProductTemplate.maxDepositTerm: '') + ' ' + (this.recurringDepositsAccountProductTemplate.maxDepositTermType ? this.recurringDepositsAccountProductTemplate.maxDepositTermType.value: '') }}</span>
fxFlex="60%">{{ (recurringDepositsAccountProductTemplate.maxDepositTerm ? recurringDepositsAccountProductTemplate.maxDepositTerm: '')}} {{(this.recurringDepositsAccountProductTemplate.maxDepositTermType ? this.recurringDepositsAccountProductTemplate.maxDepositTermType.value: '') | translateKey:'catalogs'}}</span>
</div>
@@ -163,17 +163,17 @@
<ng-container matColumnDef="period">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Period" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">
{{chartSlab.fromPeriod}}-{{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value}}</td>
{{chartSlab.fromPeriod}} - {{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value | translateKey:'catalogs'}}</td>
</ng-container>
<ng-container matColumnDef="amountRange">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Amount Range" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom}}-{{chartSlab.amountRangeTo}}</td>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom | formatNumber}} - {{chartSlab.amountRangeTo | formatNumber}}</td>
</ng-container>
<ng-container matColumnDef="interest">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Interest" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate }} </td>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate | formatNumber }} %</td>
</ng-container>
<ng-container matColumnDef="description">
@@ -292,14 +292,14 @@
<ng-container matColumnDef="chargeCalculationType">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Type" | translate }} </th>
<td mat-cell *matCellDef="let charge">
{{ charge.chargeCalculationType.value }}
{{ charge.chargeCalculationType.value | translateKey:'catalogs' }}
</td>
</ng-container>
<ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Amount" | translate }} </th>
<td mat-cell *matCellDef="let charge">
{{ charge.amount }}
{{ charge.amount | formatNumber }}
</td>
</ng-container>
@@ -27,7 +27,7 @@
<mat-select formControlName="lockinPeriodFrequencyType">
<mat-option *ngFor="let lockinPeriodFrequencyType of lockinPeriodFrequencyTypeData"
[value]="lockinPeriodFrequencyType.id">
{{ lockinPeriodFrequencyType.value }}
{{ lockinPeriodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
@@ -53,7 +53,7 @@
<mat-label>{{"labels.inputs.Type" | translate }}</mat-label>
<mat-select formControlName="depositPeriodFrequencyId" required>
<mat-option *ngFor="let periodFrequencyType of periodFrequencyTypeData" [value]="periodFrequencyType.id">
{{ periodFrequencyType.value }}
{{ periodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
@@ -85,7 +85,7 @@
<mat-label>{{"labels.inputs.Type" | translate }}</mat-label>
<mat-select formControlName="recurringFrequencyType" required>
<mat-option *ngFor="let periodFrequencyType of periodFrequencyTypeData" [value]="periodFrequencyType.id">
{{ periodFrequencyType.value }}
{{ periodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -94,7 +94,6 @@
</mat-form-field>
</ng-container>
<mat-divider fxFlex="98%"></mat-divider>
<h4 fxFlex="98%" class="mat-h4">{{"labels.heading.Minimum Deposit Term" | translate }}</h4>
@@ -111,7 +110,7 @@
<mat-label>{{"labels.inputs.Frequency Type" | translate }}</mat-label>
<mat-select formControlName="minDepositTermTypeId" required>
<mat-option *ngFor="let periodFrequencyType of periodFrequencyTypeData" [value]="periodFrequencyType.id">
{{ periodFrequencyType.value }}
{{ periodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -130,7 +129,7 @@
<mat-label>{{"labels.inputs.Type" | translate }}</mat-label>
<mat-select formControlName="inMultiplesOfDepositTermTypeId">
<mat-option *ngFor="let periodFrequencyType of periodFrequencyTypeData" [value]="periodFrequencyType.id">
{{ periodFrequencyType.value }}
{{ periodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
@@ -146,7 +145,7 @@
<mat-label>{{"labels.inputs.Type" | translate }}</mat-label>
<mat-select formControlName="maxDepositTermTypeId">
<mat-option *ngFor="let periodFrequencyType of periodFrequencyTypeData" [value]="periodFrequencyType.id">
{{ periodFrequencyType.value }}
{{ periodFrequencyType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
@@ -169,7 +168,7 @@
<mat-select formControlName="preClosurePenalInterestOnTypeId">
<mat-option *ngFor="let preClosurePenalInterestOnType of preClosurePenalInterestOnTypeData"
[value]="preClosurePenalInterestOnType.id">
{{ preClosurePenalInterestOnType.value }}
{{ preClosurePenalInterestOnType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
</mat-form-field>
@@ -15,6 +15,7 @@ import { SettingsService } from 'app/settings/settings.service';
})
export class RecurringDepositsAccountSettingsStepComponent implements OnInit, OnChanges {
@Input() isNew = true;
@Input() recurringDepositsAccountTemplate: any;
@Input() recurringDepositsAccountProductTemplate: any;
@@ -44,32 +45,36 @@ export class RecurringDepositsAccountSettingsStepComponent implements OnInit, On
}
ngOnChanges() {
if (this.recurringDepositsAccountProductTemplate) {
const recurringDepositsAccount: any = this.isNew ? this.recurringDepositsAccountProductTemplate : this.recurringDepositsAccountTemplate;
if (recurringDepositsAccount) {
this.recurringDepositAccountSettingsForm.patchValue({
'isMandatoryDeposit': this.recurringDepositsAccountProductTemplate.isMandatoryDeposit,
'adjustAdvanceTowardsFuturePayments': this.recurringDepositsAccountProductTemplate.adjustAdvanceTowardsFuturePayments,
'allowWithdrawal': this.recurringDepositsAccountProductTemplate.allowWithdrawal,
'lockinPeriodFrequency': this.recurringDepositsAccountProductTemplate.lockinPeriodFrequency,
'lockinPeriodFrequencyType': this.recurringDepositsAccountProductTemplate.lockinPeriodFrequencyType ? this.recurringDepositsAccountProductTemplate.lockinPeriodFrequencyType.id : '',
'minDepositTerm': this.recurringDepositsAccountProductTemplate.minDepositTerm,
'minDepositTermTypeId': this.recurringDepositsAccountProductTemplate.minDepositTermType ? this.recurringDepositsAccountProductTemplate.minDepositTermType.id : '',
'inMultiplesOfDepositTerm': this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTerm,
'inMultiplesOfDepositTermTypeId': this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType ? this.recurringDepositsAccountProductTemplate.inMultiplesOfDepositTermType.id : '',
'maxDepositTerm': this.recurringDepositsAccountProductTemplate.maxDepositTerm,
'maxDepositTermTypeId': this.recurringDepositsAccountProductTemplate.maxDepositTermType ? this.recurringDepositsAccountProductTemplate.maxDepositTermType.id : '',
'preClosurePenalApplicable': this.recurringDepositsAccountProductTemplate.preClosurePenalApplicable,
'preClosurePenalInterest': this.recurringDepositsAccountProductTemplate.preClosurePenalInterest,
'preClosurePenalInterestOnTypeId': this.recurringDepositsAccountProductTemplate.preClosurePenalInterestOnType ? this.recurringDepositsAccountProductTemplate.preClosurePenalInterestOnType.id : '',
'minBalanceForInterestCalculation': this.recurringDepositsAccountProductTemplate.minBalanceForInterestCalculation,
'depositPeriod': this.recurringDepositsAccountProductTemplate.minDepositTerm,
'depositPeriodFrequencyId': this.recurringDepositsAccountProductTemplate.minDepositTermType.id
'isMandatoryDeposit': recurringDepositsAccount.isMandatoryDeposit,
'adjustAdvanceTowardsFuturePayments': recurringDepositsAccount.adjustAdvanceTowardsFuturePayments,
'allowWithdrawal': recurringDepositsAccount.allowWithdrawal,
'lockinPeriodFrequency': recurringDepositsAccount.lockinPeriodFrequency,
'lockinPeriodFrequencyType': recurringDepositsAccount.lockinPeriodFrequencyType ? recurringDepositsAccount.lockinPeriodFrequencyType.id : '',
'minDepositTerm': recurringDepositsAccount.minDepositTerm,
'minDepositTermTypeId': recurringDepositsAccount.minDepositTermType ? recurringDepositsAccount.minDepositTermType.id : '',
'inMultiplesOfDepositTerm': recurringDepositsAccount.inMultiplesOfDepositTerm,
'inMultiplesOfDepositTermTypeId': recurringDepositsAccount.inMultiplesOfDepositTermType ? recurringDepositsAccount.inMultiplesOfDepositTermType.id : '',
'maxDepositTerm': recurringDepositsAccount.maxDepositTerm,
'maxDepositTermTypeId': recurringDepositsAccount.maxDepositTermType ? recurringDepositsAccount.maxDepositTermType.id : '',
'preClosurePenalApplicable': recurringDepositsAccount.preClosurePenalApplicable,
'preClosurePenalInterest': recurringDepositsAccount.preClosurePenalInterest,
'preClosurePenalInterestOnTypeId': recurringDepositsAccount.preClosurePenalInterestOnType ? recurringDepositsAccount.preClosurePenalInterestOnType.id : '',
'minBalanceForInterestCalculation': recurringDepositsAccount.minBalanceForInterestCalculation,
'depositPeriod': recurringDepositsAccount.minDepositTerm,
'depositPeriodFrequencyId': recurringDepositsAccount.minDepositTermType.id,
'expectedFirstDepositOnDate': recurringDepositsAccount.expectedFirstDepositOnDate && new Date(recurringDepositsAccount.expectedFirstDepositOnDate),
'recurringFrequency': recurringDepositsAccount.recurringFrequency,
'recurringFrequencyType': recurringDepositsAccount.recurringFrequencyType ? recurringDepositsAccount.recurringFrequencyType.id : ''
});
if (this.recurringDepositsAccountProductTemplate.withHoldTax) {
if (recurringDepositsAccount.withHoldTax) {
this.recurringDepositAccountSettingsForm.addControl('withHoldTax', new UntypedFormControl(false));
this.recurringDepositAccountSettingsForm.get('withHoldTax').valueChanges.subscribe((value: boolean) => {
if (value) {
this.recurringDepositAccountSettingsForm.addControl('taxGroupId', new UntypedFormControl({ value: '', disabled: true }));
this.recurringDepositAccountSettingsForm.get('taxGroupId').patchValue(this.recurringDepositsAccountProductTemplate.taxGroup && this.recurringDepositsAccountProductTemplate.taxGroup.name);
this.recurringDepositAccountSettingsForm.get('taxGroupId').patchValue(recurringDepositsAccount.taxGroup && recurringDepositsAccount.taxGroup.name);
} else {
this.recurringDepositAccountSettingsForm.removeControl('taxGroupId');
}
@@ -78,8 +83,8 @@ export class RecurringDepositsAccountSettingsStepComponent implements OnInit, On
} else {
this.recurringDepositAccountSettingsForm.removeControl('withHoldTax');
}
this.taxGroup = this.recurringDepositsAccountProductTemplate.taxGroup;
this.setOptions();
this.taxGroup = recurringDepositsAccount.taxGroup;
this.setOptions(recurringDepositsAccount);
}
}
@@ -127,10 +132,10 @@ export class RecurringDepositsAccountSettingsStepComponent implements OnInit, On
/**
* Sets all select dropdown options.
*/
setOptions() {
this.lockinPeriodFrequencyTypeData = this.recurringDepositsAccountProductTemplate.lockinPeriodFrequencyTypeOptions;
this.periodFrequencyTypeData = this.recurringDepositsAccountProductTemplate.periodFrequencyTypeOptions;
this.preClosurePenalInterestOnTypeData = this.recurringDepositsAccountProductTemplate.preClosurePenalInterestOnTypeOptions;
setOptions(recurringDepositsAccount: any) {
this.lockinPeriodFrequencyTypeData = recurringDepositsAccount.lockinPeriodFrequencyTypeOptions;
this.periodFrequencyTypeData = recurringDepositsAccount.periodFrequencyTypeOptions;
this.preClosurePenalInterestOnTypeData = recurringDepositsAccount.preClosurePenalInterestOnTypeOptions;
}
/**
@@ -7,7 +7,7 @@
<mat-select formControlName="interestCompoundingPeriodType" required>
<mat-option *ngFor="let interestCompoundingPeriodType of interestCompoundingPeriodTypeData"
[value]="interestCompoundingPeriodType.id">
{{ interestCompoundingPeriodType.value }}
{{ interestCompoundingPeriodType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -20,7 +20,7 @@
<mat-select formControlName="interestPostingPeriodType" required>
<mat-option *ngFor="let interestPostingPeriodType of interestPostingPeriodTypeData"
[value]="interestPostingPeriodType.id">
{{ interestPostingPeriodType.value }}
{{ interestPostingPeriodType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -33,7 +33,7 @@
<mat-select formControlName="interestCalculationType" required>
<mat-option *ngFor="let interestCalculationType of interestCalculationTypeData"
[value]="interestCalculationType.id">
{{ interestCalculationType.value }}
{{ interestCalculationType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -46,7 +46,7 @@
<mat-select formControlName="interestCalculationDaysInYearType" required>
<mat-option *ngFor="let interestCalculationDaysInYearType of interestCalculationDaysInYearTypeData"
[value]="interestCalculationDaysInYearType.id">
{{ interestCalculationDaysInYearType.value }}
{{ interestCalculationDaysInYearType.value | translateKey:'catalogs' }}
</mat-option>
</mat-select>
<mat-error>
@@ -38,9 +38,9 @@
</tr>
<tr>
<td>{{"labels.inputs.Deposit Frequency" | translate }}</td>
<td><span>{{recurringDepositsAccountData.recurringFrequency}}
&nbsp;{{recurringDepositsAccountData.recurringFrequencyType.value}}
</span></td>
<td><span class="m-r-5">{{recurringDepositsAccountData.recurringFrequency}}</span>
{{recurringDepositsAccountData.recurringFrequencyType.value | translateKey:'catalogs'}}
</td>
</tr>
<tr *ngIf="recurringDepositsAccountData.minBalanceForInterestCalculation">
<td> {{"labels.inputs.Balance Required for Interest Calculation" | translate }}</td>
@@ -189,13 +189,13 @@
</tr>
<tr>
<td>{{"labels.inputs.Rate of Interest" | translate }}</td>
<td>
<span>{{recurringDepositsAccountData.nominalAnnualInterestRate}}</span>
<td class="r-amount">
<span>{{recurringDepositsAccountData.nominalAnnualInterestRate | formatNumber}} %</span>
</td>
</tr>
<tr *ngIf="recurringDepositsAccountData.maturityDate">
<td>{{"labels.inputs.Maturity Amount" | translate }}</td>
<td>
<td class="r-amount">
<span>{{ recurringDepositsAccountData.maturityAmount | currency:currency.code:'symbol-narrow':'1.2-2'}}</span>
</td>
</tr>
@@ -217,7 +217,7 @@
<tr>
<td> {{"labels.inputs.Deposits Frequency" | translate }} </td>
<td>
{{ recurringDepositsAccountData.recurringFrequency }}&nbsp;{{ recurringDepositsAccountData.recurringFrequencyType.value }}
{{ recurringDepositsAccountData.recurringFrequency }}&nbsp;{{ recurringDepositsAccountData.recurringFrequencyType.value | translateKey:'catalogs' }}
</td>
</tr>
<tr *ngIf="recurringDepositsAccountData.summary.totalInterestEarned">
@@ -242,28 +242,28 @@
<tbody>
<tr>
<td>{{"labels.inputs.Interest Rate" | translate }}</td>
<td class="r-amount">{{recurringDepositsAccountData.nominalAnnualInterestRate}}%</td>
<td class="r-amount">{{recurringDepositsAccountData.nominalAnnualInterestRate | formatNumber}} %</td>
</tr>
<tr>
<td>{{"labels.inputs.Interest Compounding Period" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCompoundingPeriodType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCompoundingPeriodType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Interest Posting Period" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestPostingPeriodType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestPostingPeriodType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Interest calculated using" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCalculationType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCalculationType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Days in Year" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCalculationDaysInYearType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCalculationDaysInYearType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr *ngIf="recurringDepositsAccountData.preClosurePenalApplicable">
<td>{{"labels.inputs.Pre-closure penal Interest (less)" | translate }}</td>
<td><span>{{recurringDepositsAccountData.preClosurePenalInterest}} % on
{{recurringDepositsAccountData.preClosurePenalInterestOnType.value}}</span></td>
{{recurringDepositsAccountData.preClosurePenalInterestOnType.value | translateKey:'catalogs'}}</span></td>
</tr>
</tbody>
</table>
@@ -275,24 +275,24 @@
<tbody>
<tr>
<td>{{"labels.inputs.Interest Compounding Period" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCompoundingPeriodType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCompoundingPeriodType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Interest Posting Period" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestPostingPeriodType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestPostingPeriodType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Interest calculated using" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCalculationType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCalculationType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr>
<td>{{"labels.inputs.Days in Year" | translate }}</td>
<td><span>{{recurringDepositsAccountData.interestCalculationDaysInYearType.value}}</span></td>
<td><span>{{recurringDepositsAccountData.interestCalculationDaysInYearType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr *ngIf="recurringDepositsAccountData.preClosurePenalApplicable">
<td>{{"labels.inputs.Pre-closure penal Interest (less)" | translate }}</td>
<td><span>{{recurringDepositsAccountData.preClosurePenalInterest}} % on
{{recurringDepositsAccountData.preClosurePenalInterestOnType.value}}</span></td>
{{recurringDepositsAccountData.preClosurePenalInterestOnType.value | translateKey:'catalogs'}}</span></td>
</tr>
<tr *ngIf="recurringDepositsAccountData.witdHoldTax">
<td> {{"labels.inputs.Witdhold Tax Group" | translate }} </td>
@@ -13,17 +13,17 @@
<ng-container matColumnDef="period">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Period" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">
{{chartSlab.fromPeriod}}-{{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value}}</td>
{{chartSlab.fromPeriod}} - {{chartSlab.toPeriod}}&nbsp;{{chartSlab.periodType.value | translateKey:'catalogs'}}</td>
</ng-container>
<ng-container matColumnDef="amountRange">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Amount Range" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom}}-{{chartSlab.amountRangeTo}}</td>
<td mat-cell *matCellDef="let chartSlab">{{chartSlab.amountRangeFrom | formatNumber}} - {{chartSlab.amountRangeTo | formatNumber}}</td>
</ng-container>
<ng-container matColumnDef="interest">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Interest" | translate }} </th>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate }} </td>
<td mat-cell *matCellDef="let chartSlab"> {{ chartSlab.annualInterestRate | formatNumber }} %</td>
</ng-container>
<ng-container matColumnDef="description">
@@ -102,7 +102,7 @@
<ng-container matColumnDef="amount">
<th mat-header-cell *matHeaderCellDef> {{"labels.inputs.Interest" | translate }} </th>
<td mat-cell *matCellDef="let incentive">
{{ incentive.amount }}
{{ incentive.amount | formatNumber}}
</td>
</ng-container>
@@ -32,17 +32,22 @@ export class RecurringDepositsButtonsConfiguration {
this.buttonsArray = [
{
name: 'Deposit',
icon: 'arrow-up',
icon: 'fa fa-arrow-up',
taskPermissionName: 'DEPOSIT_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Withdrawal',
icon: 'fa fa-arrow-down',
taskPermissionName: 'WITHDRAWAL_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Premature Close',
icon: 'arrow-left',
icon: 'fa fa-arrow-left',
taskPermissionName: 'PREMATURECLOSE_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Calculate Interest',
icon: 'calculator',
icon: 'fa fa-calculator',
taskPermissionName: 'CALCULATEINTEREST_RECURRINGDEPOSITACCOUNT'
},
{
@@ -56,12 +61,12 @@ export class RecurringDepositsButtonsConfiguration {
this.buttonsArray = [
{
name: 'Modify Application',
icon: 'edit',
icon: 'fa fa-edit',
taskPermissionName: 'UPDATE_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Approve',
icon: 'check',
icon: 'fa fa-check',
taskPermissionName: 'APPROVE_RECURRINGDEPOSITACCOUNT'
}
];
@@ -70,12 +75,12 @@ export class RecurringDepositsButtonsConfiguration {
this.buttonsArray = [
{
name: 'Undo Approval',
icon: 'undo',
icon: 'fa fa-undo',
taskPermissionName: 'APPROVALUNDO_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Activate',
icon: 'check',
icon: 'fa fa-check',
taskPermissionName: 'ACTIVATE_RECURRINGDEPOSITACCOUNT'
}
];
@@ -84,17 +89,17 @@ export class RecurringDepositsButtonsConfiguration {
this.buttonsArray = [
{
name: 'Close',
icon: 'arrow-right',
icon: 'fa fa-arrow-right',
taskPermissionName: 'CLOSE_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Calculate Interest',
icon: 'calculator',
icon: 'fa fa-calculator',
taskPermissionName: 'CALCULATEINTEREST_RECURRINGDEPOSITACCOUNT'
},
{
name: 'Post Interest',
icon: 'money',
icon: 'fa fa-money',
taskPermissionName: 'POSTINTEREST_RECURRINGDEPOSITACCOUNT'
}
];
@@ -17,13 +17,10 @@
</mat-error>
</mat-form-field>
<mat-form-field>
<mat-label>{{"labels.inputs.Transaction Amount" | translate }}</mat-label>
<input type="number" formControlName="transactionAmount" required matInput />
<mat-error *ngIf="editTransactionForm.controls.transactionAmount.hasError('required')">
{{"labels.inputs.Transaction Amount" | translate }} {{ "labels.commons.is" |translate}} <strong>{{ "labels.commons.required" |translate}}</strong>
</mat-error>
</mat-form-field>
<mifosx-input-amount [currency]="currency" [isRequired]="true"
[inputFormControl]="editTransactionForm.controls.transactionAmount"
[inputLabel]="'Transaction Amount'">
</mifosx-input-amount>
<mat-form-field>
<mat-label>{{"labels.inputs.Payment Type" | translate }}</mat-label>
@@ -33,12 +30,15 @@
</mat-option>
</mat-select>
</mat-form-field>
<div fxLayoutGap="5px" fxLayout="row" fxLayout.xs="column">
<mat-label fxFlexAlign="center">{{"labels.inputs.Show Payment Details" | translate }}</mat-label>
<button type="button" mat-mini-fab color="primary" (click)="addPaymentDetails()">
<fa-icon [icon]="!addPaymentDetailsFlag ? 'plus-circle' : 'minus-circle'" size="lg"></fa-icon>
</button>
<div fxFlexFill>
<span fxFlex="75%" class="expandcollapsebutton m-l-10 m-t-40" (click)="addPaymentDetails()">
<mat-slide-toggle>
<div [className]="addPaymentDetailsFlag ? 'enabled' : 'disabled'">
<span class="m-l-10">{{'labels.inputs.Show Payment Details' | translate}}</span>
</div>
</mat-slide-toggle>
</span>
</div>
<mat-form-field *ngIf="editTransactionForm.controls['accountNumber']">
@@ -7,6 +7,7 @@ import { Dates } from 'app/core/utils/dates';
/** Custom Services */
import { RecurringDepositsService } from 'app/deposits/recurring-deposits/recurring-deposits.service';
import { SettingsService } from 'app/settings/settings.service';
import { Currency } from 'app/shared/models/general.model';
/**
* Edit Transaction component.
@@ -38,6 +39,7 @@ export class EditTransactionComponent implements OnInit {
recurringDepositAccountId: string;
/** Transaction Template */
transactionTemplateData: any;
currency: Currency | null = null;
/**
* Retrieves the Recurring Deposit Account transaction template data from `resolve`.
@@ -56,6 +58,9 @@ export class EditTransactionComponent implements OnInit {
private settingsService: SettingsService, ) {
this.route.data.subscribe((data: { recurringDepositsAccountTransactionTemplate: any }) => {
this.transactionTemplateData = data.recurringDepositsAccountTransactionTemplate;
if (this.transactionTemplateData.currency) {
this.currency = this.transactionTemplateData.currency;
}
this.paymentTypeOptions = this.transactionTemplateData.paymentTypeOptions;
});
this.recurringDepositAccountId = this.route.parent.parent.snapshot.params['recurringDepositAccountId'];
@@ -121,6 +126,7 @@ export class EditTransactionComponent implements OnInit {
dateFormat,
locale
};
data['transactionAmount'] = data['transactionAmount'] * 1;
this.recurringDepositsService.executeRecurringDepositsAccountTransactionsCommand(this.recurringDepositAccountId, 'modify', data, this.transactionTemplateData.id)
.subscribe(res => {
this.router.navigate(['../'], { relativeTo: this.route });