diff --git a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html index 18c322677..efa63325b 100644 --- a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html +++ b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.html @@ -52,10 +52,18 @@ [loansAccountProductTemplate]="loansAccountProductTemplate" [loansAccountTemplate]="loansAccountTemplate" [loansAccountFormValid]="loansAccountFormValid" - [activeClientMembers]="activeClientMembers" > + + {{ 'labels.heading.Active Client Members' | translate }} + + + + {{ 'labels.inputs.REPAYMENT SCHEDULE' | translate }} diff --git a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts index add87c3ff..5cac4bb7d 100644 --- a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts +++ b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts @@ -10,6 +10,7 @@ import { ClientsService } from 'app/clients/clients.service'; /** Step Components */ import { LoansAccountDetailsStepComponent } from '../../loans-account-stepper/loans-account-details-step/loans-account-details-step.component'; +import { LoansActiveClientMembersComponent } from '../../loans-account-stepper/loans-active-client-members/loans-active-client-members.component'; import { LoansAccountTermsStepComponent } from '../../loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component'; import { LoansAccountChargesStepComponent } from '../../loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component'; import { LoansAccountDatatableStepComponent } from '../../loans-account-stepper/loans-account-datatable-step/loans-account-datatable-step.component'; @@ -26,6 +27,8 @@ export class CreateGlimAccountComponent { @ViewChild(LoansAccountTermsStepComponent, { static: true }) loansAccountTermsStep: LoansAccountTermsStepComponent; @ViewChild(LoansAccountChargesStepComponent, { static: true }) loansAccountChargesStep: LoansAccountChargesStepComponent; + @ViewChild(LoansActiveClientMembersComponent, { static: true }) + loansActiveClientMembers: LoansActiveClientMembersComponent; /** Get handle on dtloan tags in the template */ @ViewChildren('dtloan') loanDatatables: QueryList; @@ -128,7 +131,10 @@ export class CreateGlimAccountComponent { /** Checks whether all the forms in different steps are valid or not */ get loansAccountFormValid() { return ( - this.loansAccountDetailsForm.valid && this.loansAccountTermsForm.valid && this.loansAccountChargesStep.isValid + this.loansAccountDetailsForm.valid && + this.loansAccountTermsForm.valid && + // this.loansAccountChargesStep.isValid && + this.loansActiveClientMembers.isValid ); } @@ -139,7 +145,7 @@ export class CreateGlimAccountComponent { /** Retrieves Data of all forms except Currency to submit the data */ get loansAccount() { - this.selectedMembers = this.loansAccountChargesStep.selectedClientMembers; + this.selectedMembers = this.loansActiveClientMembers.selectedClientMembers; return { ...this.loansAccountDetailsStep.loansAccountDetails, ...this.loansAccountTermsStep.loansAccountTerms, diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html index d4f5a545b..bafaa2cbc 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html @@ -132,60 +132,6 @@ - - - - - - - - - - - - - - - - {{ 'labels.inputs.Client ID' | translate }} - {{ element.id }} - - - - - {{ 'labels.inputs.Client Name' | translate }} - {{ element.displayName }} - - - - - {{ 'labels.inputs.Loan Purpose' | translate }} - - - {{ 'labels.inputs.Select Purpose' | translate }} - - - {{ purpose.name }} - - - - - - - - - {{ 'labels.inputs.Original Loan' | translate }} - - - - - - - - - - - @@ -193,7 +139,7 @@ {{ 'labels.buttons.Previous' | translate }} - + {{ 'labels.buttons.Next' | translate }} diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts index 7b32aeab6..39e09e465 100644 --- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.ts @@ -264,10 +264,9 @@ export class LoansAccountChargesStepComponent implements OnInit, OnChanges { } get isValid() { - return ( - !this.activeClientMembers || - this.selectedClientMembers?.selectedMembers?.reduce((acc: any, cur: any) => acc + (cur.principal ?? 0), 0) > 0 - ); + return true; + // !this.activeClientMembers || + // this.selectedClientMembers?.selectedMembers?.reduce((acc: any, cur: any) => acc + (cur.principal ?? 0), 0) > 0 } /** diff --git a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts index 8f9f474dc..1bec23e30 100644 --- a/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts +++ b/src/app/loans/loans-account-stepper/loans-account-terms-step/loans-account-terms-step.component.ts @@ -241,10 +241,13 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { if (this.loansAccountTermsData) { if (this.loansAccountTermsData.loanProductId) { + let formattedDate = null; + if (this.loansAccountTermsData.expectedFirstRepaymentOnDate) { + const repaymentDate = new Date(this.loansAccountTermsData.expectedFirstRepaymentOnDate); + formattedDate = this.formatDateToDDMMYYYY(repaymentDate); + } this.loansAccountTermsForm.patchValue({ - repaymentsStartingFromDate: - this.loansAccountTermsData.expectedFirstRepaymentOnDate && - new Date(this.loansAccountTermsData.expectedFirstRepaymentOnDate) + repaymentsStartingFromDate: this.loansAccountTermsData.expectedFirstRepaymentOnDate && formattedDate }); } this.loansAccountTermsForm.patchValue({ @@ -284,6 +287,12 @@ export class LoansAccountTermsStepComponent implements OnInit, OnChanges { allowAddDisbursementDetails() { return this.multiDisburseLoan && !this.loansAccountTermsData.disallowExpectedDisbursements; } + formatDateToDDMMYYYY(date: Date): string { + const day = date.getDate().toString().padStart(2, '0'); + const month = (date.getMonth() + 1).toString().padStart(2, '0'); + const year = date.getFullYear(); + return `${day}-${month}-${year}`; + } /** Custom Validators for the form */ setCustomValidators() { diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html new file mode 100644 index 000000000..ac9876eab --- /dev/null +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.html @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + {{ 'labels.inputs.Client ID' | translate }} + {{ element.id }} + + + + + {{ 'labels.inputs.Client Name' | translate }} + {{ element.displayName }} + + + + + {{ 'labels.inputs.Loan Purpose' | translate }} + + + {{ 'labels.inputs.Select Purpose' | translate }} + + + {{ purpose.name }} + + + + + + + + + {{ 'labels.inputs.Original Loan' | translate }} + + + + + + + + + + + + + + + + {{ 'labels.buttons.Previous' | translate }} + + + {{ 'labels.buttons.Next' | translate }} + + + + {{ 'labels.buttons.Cancel' | translate }} + + diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.scss b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.scss new file mode 100644 index 000000000..c0decdcb9 --- /dev/null +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.scss @@ -0,0 +1,36 @@ +table { + width: 100%; +} + +.mat-elevation-z1 { + margin: 1em 0 1.5em; +} + +.margin-t { + margin-top: 1em; +} + +h4 { + font-weight: 500; + margin: 1em 0; +} + +h3 { + font-weight: 500; +} + +mat-divider { + margin: 1em 0; +} + +.margin-v { + margin: 1em 0; +} + +.margin-b { + margin: 0 0 1em; +} + +.tableName { + padding-left: 2%; +} diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.spec.ts b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.spec.ts new file mode 100644 index 000000000..f1656ce90 --- /dev/null +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LoansActiveClientMembersComponent } from './loans-active-client-members.component'; + +describe('LoansActiveClientMembersComponent', () => { + let component: LoansActiveClientMembersComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [LoansActiveClientMembersComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(LoansActiveClientMembersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts new file mode 100644 index 000000000..94220ed4e --- /dev/null +++ b/src/app/loans/loans-account-stepper/loans-active-client-members/loans-active-client-members.component.ts @@ -0,0 +1,62 @@ +import { Component, OnInit, Input } from '@angular/core'; +import { MatTableDataSource } from '@angular/material/table'; +import { ActivatedRoute } from '@angular/router'; + +@Component({ + selector: 'mifosx-loans-active-client-members', + templateUrl: './loans-active-client-members.component.html', + styleUrls: ['./loans-active-client-members.component.scss'] +}) +export class LoansActiveClientMembersComponent implements OnInit { + loanId: any = null; + @Input() activeClientMembers?: any; + @Input() loansAccountFormValid: boolean; + + constructor(private route: ActivatedRoute) { + this.loanId = this.route.snapshot.params['loanId']; + } + dataSource: any; + /** Check for select all the Clients List */ + selectAllItems = false; + /** Loan Purpose Options */ + loanPurposeOptions: string[] = []; + /** Table Displayed Columns */ + displayedColumn: string[] = [ + 'check', + 'id', + 'name', + 'purpose', + 'amount' + ]; + + ngOnInit(): void { + // console.log("Active Client Members in LoansActiveClientMembersComponent:", this.activeClientMembers); + + this.dataSource = new MatTableDataSource(this.activeClientMembers); + } + + get isValid() { + // console.log("LoansActiveClientMembersComponent isValid:", this.selectedClientMembers?.selectedMembers?.reduce((acc: any, cur: any) => acc + (cur.principal ?? 0), 0) > 0); + return ( + !this.activeClientMembers || + this.selectedClientMembers?.selectedMembers?.reduce((acc: any, cur: any) => acc + (cur.principal ?? 0), 0) > 0 + ); + } + get selectedClientMembers() { + return { selectedMembers: this.activeClientMembers.filter((item: any) => item.selected) }; + } + + /** Toggle all checks */ + toggleSelects() { + for (const member of this.activeClientMembers) { + member.selected = this.selectAllItems; + } + } + + /** Check if all the checks are selected */ + toggleSelect() { + const len = this.activeClientMembers.length; + this.selectAllItems = + len === 0 ? false : this.activeClientMembers.filter((item: any) => item.selected).length === len; + } +} diff --git a/src/app/loans/loans.module.ts b/src/app/loans/loans.module.ts index 5b8d29c1c..afb6ad378 100644 --- a/src/app/loans/loans.module.ts +++ b/src/app/loans/loans.module.ts @@ -80,6 +80,7 @@ import { LoanReagingComponent } from './loans-view/loan-account-actions/loan-rea import { LoanReamortizeComponent } from './loans-view/loan-account-actions/loan-reamortize/loan-reamortize.component'; import { LoanTermVariationsTabComponent } from './loans-view/loan-term-variations-tab/loan-term-variations-tab.component'; import { AddInterestPauseComponent } from './loans-view/loan-account-actions/add-interest-pause/add-interest-pause.component'; +import { LoansActiveClientMembersComponent } from './loans-account-stepper/loans-active-client-members/loans-active-client-members.component'; /** * Loans Module @@ -163,7 +164,8 @@ import { AddInterestPauseComponent } from './loans-view/loan-account-actions/add LoanReagingComponent, LoanReamortizeComponent, LoanTermVariationsTabComponent, - AddInterestPauseComponent + AddInterestPauseComponent, + LoansActiveClientMembersComponent ], providers: [] }) diff --git a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html index bf9f569a9..fa4dc3aa1 100644 --- a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html +++ b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.html @@ -50,6 +50,13 @@ + + {{ 'labels.heading.Active Client Members' | translate }} + + + + + {{ 'labels.inputs.PREVIEW' | translate }} diff --git a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts index 92e0e7b8a..fc4311a4e 100644 --- a/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts +++ b/src/app/savings/gsim-account/create-gsim-account/create-gsim-account.component.ts @@ -6,6 +6,7 @@ import { Router, ActivatedRoute } from '@angular/router'; import { SavingsAccountDetailsStepComponent } from '../../savings-account-stepper/savings-account-details-step/savings-account-details-step.component'; import { SavingsAccountTermsStepComponent } from '../../savings-account-stepper/savings-account-terms-step/savings-account-terms-step.component'; import { SavingsAccountChargesStepComponent } from '../../savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component'; +import { SavingsActiveClientMembersComponent } from '../../savings-account-stepper/savings-active-client-members/savings-active-client-members.component'; /** Custom Services */ import { SavingsService } from '../../savings.service'; @@ -39,6 +40,9 @@ export class CreateGsimAccountComponent { /** Savings Account Charges Step */ @ViewChild(SavingsAccountChargesStepComponent, { static: true }) savingsAccountChargesStep: SavingsAccountChargesStepComponent; + /** Savings Active Client Members */ + @ViewChild(SavingsActiveClientMembersComponent, { static: true }) + savingsActiveClientMembers: SavingsActiveClientMembersComponent; /** * Fetches savings account template from `resolve` @@ -105,7 +109,7 @@ export class CreateGsimAccountComponent { * Retrieves savings account object. */ get savingsAccount() { - this.selectedMembers = this.savingsAccountChargesStep.selectedClientMembers; + this.selectedMembers = this.savingsActiveClientMembers.selectedClientMembers; return { ...this.savingsAccountDetailsStep.savingsAccountDetails, ...this.savingsAccountTermsStep.savingsAccountTerms, diff --git a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html index e97d20fe2..f0afc515a 100644 --- a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html +++ b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.html @@ -124,47 +124,14 @@ - - - - - - - - - - - - - - - {{ 'labels.inputs.Client ID' | translate }} - {{ element.id }} - - - - - {{ 'labels.inputs.Client Name' | translate }} - {{ element.displayName }} - - - - - + + + + {{ 'labels.buttons.Previous' | translate }} + + + {{ 'labels.buttons.Next' | translate }} + + - - - - - {{ 'labels.buttons.Previous' | translate }} - - - {{ 'labels.buttons.Next' | translate }} - - - diff --git a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts index e193a0754..d739df61c 100644 --- a/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts +++ b/src/app/savings/savings-account-stepper/savings-account-charges-step/savings-account-charges-step.component.ts @@ -81,7 +81,6 @@ export class SavingsAccountChargesStepComponent implements OnInit, OnChanges { } else { this.chargesDataSource = []; } - this.dataSource = new MatTableDataSource(this.activeClientMembers); } } @@ -226,24 +225,4 @@ export class SavingsAccountChargesStepComponent implements OnInit, OnChanges { get savingsAccountCharges() { return { charges: this.chargesDataSource }; } - - get selectedClientMembers() { - return { - selectedMembers: this.activeClientMembers ? this.activeClientMembers.filter((item: any) => item.selected) : [] - }; - } - - /** Toggle all checks */ - toggleSelects() { - for (const member of this.activeClientMembers) { - member.selected = this.selectAllItems; - } - } - - /** Check if all the checks are selected */ - toggleSelect() { - const len = this.activeClientMembers.length; - this.selectAllItems = - len === 0 ? false : this.activeClientMembers.filter((item: any) => item.selected).length === len; - } } diff --git a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html new file mode 100644 index 000000000..29b1fbdbe --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.html @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + {{ 'labels.inputs.Client ID' | translate }} + {{ element.id }} + + + + + {{ 'labels.inputs.Client Name' | translate }} + {{ element.displayName }} + + + + + + + + + + + {{ 'labels.buttons.Previous' | translate }} + + + {{ 'labels.buttons.Next' | translate }} + + + diff --git a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.scss b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.scss new file mode 100644 index 000000000..83c545b0f --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.scss @@ -0,0 +1,11 @@ +table { + width: 100%; +} + +.mat-elevation-z1 { + margin: 1em 0 1.5em; +} + +.margin-t { + margin-top: 1em; +} diff --git a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.spec.ts b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.spec.ts new file mode 100644 index 000000000..a6a14459e --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.spec.ts @@ -0,0 +1,22 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { SavingsActiveClientMembersComponent } from './savings-active-client-members.component'; + +describe('SavingsActiveClientMembersComponent', () => { + let component: SavingsActiveClientMembersComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [SavingsActiveClientMembersComponent] + }).compileComponents(); + + fixture = TestBed.createComponent(SavingsActiveClientMembersComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.ts b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.ts new file mode 100644 index 000000000..8cb4af522 --- /dev/null +++ b/src/app/savings/savings-account-stepper/savings-active-client-members/savings-active-client-members.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit, OnChanges, Input } from '@angular/core'; +import { MatTableDataSource } from '@angular/material/table'; + +@Component({ + selector: 'mifosx-savings-active-client-members', + templateUrl: './savings-active-client-members.component.html', + styleUrls: ['./savings-active-client-members.component.scss'] +}) +export class SavingsActiveClientMembersComponent implements OnInit { + @Input() activeClientMembers?: any; + selectAllItems = false; + displayedColumn: string[] = [ + 'check', + 'id', + 'name' + ]; + + constructor() {} + + dataSource: any; + ngOnInit(): void { + console.log('Active Client Members in LoansActiveClientMembersComponent:', this.activeClientMembers); + this.dataSource = new MatTableDataSource(this.activeClientMembers); + } + get selectedClientMembers() { + return { selectedMembers: this.activeClientMembers.filter((item: any) => item.selected) }; + } + + /** Toggle all checks */ + toggleSelects() { + for (const member of this.activeClientMembers) { + member.selected = this.selectAllItems; + } + } + + /** Check if all the checks are selected */ + toggleSelect() { + const len = this.activeClientMembers.length; + this.selectAllItems = + len === 0 ? false : this.activeClientMembers.filter((item: any) => item.selected).length === len; + } +} diff --git a/src/app/savings/savings.module.ts b/src/app/savings/savings.module.ts index 06e7423ed..191bf8e69 100644 --- a/src/app/savings/savings.module.ts +++ b/src/app/savings/savings.module.ts @@ -53,6 +53,7 @@ import { DatatableTransactionTabComponent } from './savings-account-view/transac import { SavingsTransactionGeneralTabComponent } from './savings-account-view/transactions/view-transaction/savings-transaction-general-tab/savings-transaction-general-tab.component'; import { SavingsTransactionDatatableTabComponent } from './savings-account-view/transactions/view-transaction/savings-transaction-datatable-tab/savings-transaction-datatable-tab.component'; import { GeneralTabComponent } from './savings-account-view/general-tab/general-tab.component'; +import { SavingsActiveClientMembersComponent } from './savings-account-stepper/savings-active-client-members/savings-active-client-members.component'; /** * Savings Module @@ -111,7 +112,8 @@ import { GeneralTabComponent } from './savings-account-view/general-tab/general- DatatableTransactionTabComponent, SavingsTransactionGeneralTabComponent, SavingsTransactionDatatableTabComponent, - GeneralTabComponent + GeneralTabComponent, + SavingsActiveClientMembersComponent ], providers: [] }) diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json index 31c1ff425..b4a8b5866 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -804,6 +804,7 @@ "Accounts linked to Financial Activities": "Accounts linked to Financial Activities", "Accruals": "Accruals", "Active Asset Transfer": "Active Asset Transfer", + "Active Client Members": "Active Client Members", "AdHocQuery": "AdHocQuery", "Add Account": "Add Account", "Add Currency Form": "Add Currency Form",