| import { LenderConnectiveIncomeComponent } from './pay-in/lender-connective-income/lender-connective-income.component'; | import { LenderConnectiveIncomeComponent } from './pay-in/lender-connective-income/lender-connective-income.component'; | ||||
| import { LenderResimacXlsIncomeComponent } from './pay-in/lender-resimac-xls-income/lender-resimac-xls-income.component'; | import { LenderResimacXlsIncomeComponent } from './pay-in/lender-resimac-xls-income/lender-resimac-xls-income.component'; | ||||
| import { LenderResimacPdfIncomeComponent } from './pay-in/lender-resimac-pdf-income/lender-resimac-pdf-income.component'; | import { LenderResimacPdfIncomeComponent } from './pay-in/lender-resimac-pdf-income/lender-resimac-pdf-income.component'; | ||||
| import { LenderPepperIncomeComponent } from './pay-in/lender-pepper-income/lender-pepper-income.component'; | |||||
| LenderConnectiveIncomeComponent, | LenderConnectiveIncomeComponent, | ||||
| LenderResimacXlsIncomeComponent, | LenderResimacXlsIncomeComponent, | ||||
| LenderResimacPdfIncomeComponent, | LenderResimacPdfIncomeComponent, | ||||
| LenderPepperIncomeComponent, | |||||
| ], | ], | ||||
| imports: [ | imports: [ | ||||
| BrowserModule, | BrowserModule, |
| </kendo-grid-column-group> | </kendo-grid-column-group> | ||||
| <kendo-grid-column-group title="Loan Details" [columnMenu]="false" [headerClass]="'colGroupLoanDetails'"> | <kendo-grid-column-group title="Loan Details" [columnMenu]="false" [headerClass]="'colGroupLoanDetails'"> | ||||
| <kendo-grid-column field="Rating" title="Rating" width="150" [resizable]="false" [filterable]="false" [headerClass]="'colRating'" [class]="'topAlign colRating'"> | |||||
| <kendo-grid-column field="Rating" title="Rating" width="150" [resizable]="false" | |||||
| [filterable]="false" [headerClass]="'colRating'" [class]="'topAlign colRating'"> | |||||
| <ng-template kendoGridCellTemplate let-dataItem> | <ng-template kendoGridCellTemplate let-dataItem> | ||||
| <app-biukop-rating | <app-biukop-rating | ||||
| [value]="dataItem.Rating" | [value]="dataItem.Rating" |
| public gridView: GridDataResult; | public gridView: GridDataResult; | ||||
| public state: State = { | public state: State = { | ||||
| skip: 0, | skip: 0, | ||||
| take: 10 | |||||
| take: 20 | |||||
| }; | }; | ||||
| public loading = true; | public loading = true; | ||||
| <bkp-divider> | <bkp-divider> | ||||
| <kendo-icon [name]="'table'"></kendo-icon> Monthly Income | |||||
| <kendo-icon [name]="'table'"></kendo-icon> Income of this Loan | |||||
| </bkp-divider> | </bkp-divider> | ||||
| <kendo-grid [data]="Loan.PayIn" | <kendo-grid [data]="Loan.PayIn" | ||||
| <kendo-grid-column field="Id" title="Id" width="50" editable="false"> | <kendo-grid-column field="Id" title="Id" width="50" editable="false"> | ||||
| </kendo-grid-column> | </kendo-grid-column> | ||||
| <kendo-grid-column field="Trail" title="Trail Received" width="200" format="{0:c}" editor="numeric"> | |||||
| <kendo-grid-column field="IncomeAmount" title="Income Received" width="200" format="{0:c}" editor="numeric"> | |||||
| </kendo-grid-column> | |||||
| <kendo-grid-column field="IncomeType" title="Income Type" width="200" editor="string"> | |||||
| </kendo-grid-column> | </kendo-grid-column> | ||||
| <kendo-grid-column field="Ts" title="Trail Date" editor="date"> | <kendo-grid-column field="Ts" title="Trail Date" editor="date"> |
| const createFormGroup = dataItem => new FormGroup({ | const createFormGroup = dataItem => new FormGroup({ | ||||
| Id: new FormControl({value: dataItem.Id, disabled: true}, Validators.required), | Id: new FormControl({value: dataItem.Id, disabled: true}, Validators.required), | ||||
| Trail : new FormControl(dataItem.Trail, Validators.required), | |||||
| IncomeAmount : new FormControl(dataItem.IncomeAmount, Validators.required), | |||||
| IncomeType : new FormControl(dataItem.IncomeType, Validators.required), | |||||
| Ts: new FormControl(dataItem.Ts, Validators.required), | Ts: new FormControl(dataItem.Ts, Validators.required), | ||||
| Balance: new FormControl(dataItem.Balance, Validators.required), | Balance: new FormControl(dataItem.Balance, Validators.required), | ||||
| OffsetBalance: new FormControl(dataItem.OffsetBalance, Validators.required), | OffsetBalance: new FormControl(dataItem.OffsetBalance, Validators.required), | ||||
| this.formGroup = createFormGroup({ | this.formGroup = createFormGroup({ | ||||
| Id: 0, | Id: 0, | ||||
| Trail: 168, | |||||
| IncomeAmount: 168, | |||||
| IncomeType: 'Trail', | |||||
| Ts: new Date(), | Ts: new Date(), | ||||
| Balance: balance, | Balance: balance, | ||||
| OffsetBalance: offsetBalance, | OffsetBalance: offsetBalance, | ||||
| pi.LoanNumber = this.Loan.LenderLoanNumber; | pi.LoanNumber = this.Loan.LenderLoanNumber; | ||||
| pi.OffsetBalance = v.OffsetBalance; | pi.OffsetBalance = v.OffsetBalance; | ||||
| pi.Settlement = this.Loan.Settlement; | pi.Settlement = this.Loan.Settlement; | ||||
| pi.IncomeAmount = v.Trail; //TODO: rename Trail to incomeAmount and add IncomeType | |||||
| pi.IncomeAmount = v.IncomeAmount; | |||||
| pi.IncomeType = v.IncomeType; | |||||
| pi.Ts = new Date(v.Ts); | pi.Ts = new Date(v.Ts); | ||||
| pi.UploadId = v.UploadId; | pi.UploadId = v.UploadId; | ||||
| { text: 'list income', icon: 'dollar', url: './#list-income' }, | { text: 'list income', icon: 'dollar', url: './#list-income' }, | ||||
| { text: '--', separator: 'true' }, | { text: '--', separator: 'true' }, | ||||
| { text: 'Uploads', icon: 'dollar', url: './#lender-uploads' }, | { text: 'Uploads', icon: 'dollar', url: './#lender-uploads' }, | ||||
| { text: '--', separator: 'true' }, | |||||
| { text: 'Test Uploads by Id', icon: 'dollar', url: './#upload-details/1' }, | |||||
| { text: 'Test Pay-in', icon: 'dollar', url: './#pay-in' }, | |||||
| ] | ] | ||||
| }, | }, | ||||
| { | { |
| this.Balance = payload.Balance || 0; | this.Balance = payload.Balance || 0; | ||||
| this.Associate = payload.Associate || ''; | this.Associate = payload.Associate || ''; | ||||
| this.Comm = payload.Comm || 0; | this.Comm = payload.Comm || 0; | ||||
| this.Type = payload.Type || ''; | |||||
| this.Type = this.mapIncomeType(payload.Type || ''); | |||||
| this.Percent = payload.Percent || 0; | this.Percent = payload.Percent || 0; | ||||
| this.Paid = payload.Paid || 0; | this.Paid = payload.Paid || 0; | ||||
| this.GST = payload.GST || 0; | this.GST = payload.GST || 0; | ||||
| this.matchedPayIn = payload.matchedPayIn || -1; | this.matchedPayIn = payload.matchedPayIn || -1; | ||||
| } | } | ||||
| private mapIncomeType( input: string ): string { | |||||
| const myMap = new Map(); | |||||
| myMap.set('tc', 'Trail'); | |||||
| myMap.set('ufc', 'Upfront'); | |||||
| if ( myMap.has(input.toLowerCase()) ) { | |||||
| return myMap.get(input.toLowerCase()); | |||||
| }else{ | |||||
| return input; | |||||
| } | |||||
| } | |||||
| private ensureLenderHasAgencyNameAppended(): void { | private ensureLenderHasAgencyNameAppended(): void { | ||||
| if ( this.Lender.indexOf(this.AgencyName) === -1 ){ | if ( this.Lender.indexOf(this.AgencyName) === -1 ){ | ||||
| this.Lender += '_' + this.AgencyName; | this.Lender += '_' + this.AgencyName; |
| import {PayInLenderIncomeModel} from '../abstract/pay-in-lender.income.model'; | |||||
| import {PayInModel} from './pay-in.model'; | |||||
| export class PayInPepperModel extends PayInLenderIncomeModel { | |||||
| public InvoiceDate: Date; | |||||
| // Shared Fields for both upfront and Trailer | |||||
| public LoanNumber: string; | |||||
| public Customer: string; | |||||
| public PrimaryIntroducer: string; | |||||
| public NextGenNumber: string; | |||||
| public Settlement: Date; | |||||
| public NetAmount: number; | |||||
| public GST: number; | |||||
| public GrossAmount: number; | |||||
| // Trailer Only | |||||
| public Period: Date; | |||||
| public Balance: number; | |||||
| public SettlementAmount: number; | |||||
| public TrailerMargin: number; | |||||
| // Upfront only | |||||
| public UpfrontRate: number; | |||||
| // Derived | |||||
| public IncomeType: string; | |||||
| public IncomeAmount: number; | |||||
| constructor(payload: Partial<PayInPepperModel>) { | |||||
| super('Pepper', payload); | |||||
| if ( payload.InvoiceDate !== undefined && payload.InvoiceDate !== null){ | |||||
| this.InvoiceDate = new Date(payload.InvoiceDate); | |||||
| }else{ | |||||
| this.InvoiceDate = new Date('1800-01-01'); // some invalid date before 1900-01-01 | |||||
| } | |||||
| this.LoanNumber = payload.LoanNumber || ''; | |||||
| this.Customer = payload.Customer || ''; | |||||
| this.PrimaryIntroducer = payload.PrimaryIntroducer || ''; | |||||
| this.NextGenNumber = payload.NextGenNumber || ''; | |||||
| if ( payload.Settlement !== undefined && payload.Settlement !== null){ | |||||
| this.Settlement = new Date(payload.Settlement); | |||||
| }else{ | |||||
| this.Settlement = new Date('1800-01-01'); // some invalid date before 1900-01-01 | |||||
| } | |||||
| this.NetAmount = payload.NetAmount || 0; | |||||
| this.GST = payload.GST || 0; | |||||
| this.GrossAmount = payload.GrossAmount || 0; | |||||
| // Trailer only | |||||
| if ( payload.Period !== undefined && payload.Period !== null){ | |||||
| this.Period = new Date(payload.Period); | |||||
| }else{ | |||||
| this.Period = new Date('1800-01-01'); // some invalid date before 1900-01-01 | |||||
| } | |||||
| this.Balance = payload.Balance || 0; | |||||
| this.SettlementAmount = payload.SettlementAmount || 0; | |||||
| this.TrailerMargin = payload.TrailerMargin || 0; | |||||
| // Upfront only | |||||
| this.UpfrontRate = payload.UpfrontRate || 0; | |||||
| // Derived | |||||
| this.IncomeType = payload.IncomeType || ''; | |||||
| this.IncomeAmount = payload.IncomeAmount || 0; | |||||
| } | |||||
| public convertToPayIn(): PayInModel { | |||||
| const pi = new PayInModel({}); | |||||
| pi.Lender = 'Pepper'; | |||||
| pi.LoanNumber = this.LoanNumber; | |||||
| pi.Amount = this.SettlementAmount; | |||||
| pi.Settlement = this.Settlement; | |||||
| pi.IncomeAmount = this.IncomeAmount; | |||||
| pi.IncomeType = this.IncomeType; | |||||
| pi.Balance = this.Balance; | |||||
| pi.OffsetBalance = -1; | |||||
| if ( this.IncomeType.toLowerCase() === 'upfront' ){ | |||||
| pi.Ts = this.InvoiceDate; | |||||
| }else{ | |||||
| pi.Ts = this.Period; | |||||
| } | |||||
| return pi; | |||||
| } | |||||
| public isMatch(pi: PayInModel): boolean{ | |||||
| return this.LoanNumber === pi.LoanNumber && this.LoanNumber !== '' && | |||||
| this.AgencyName === pi.Lender && this.AgencyName !== '' && | |||||
| this.IncomeAmount === pi.IncomeAmount && | |||||
| this.Balance === pi.Balance && | |||||
| this.IncomeType.toLowerCase() === pi.IncomeType.toLowerCase(); | |||||
| } | |||||
| } |
| import {PayInConnectiveModel} from './pay-in-connective.model'; | import {PayInConnectiveModel} from './pay-in-connective.model'; | ||||
| import {PayInResimacXlsModel} from './pay-in-resimac-xls.mode'; | import {PayInResimacXlsModel} from './pay-in-resimac-xls.mode'; | ||||
| import {PayInResimacPdfModel} from './pay-in-resimac-pdf.model'; | import {PayInResimacPdfModel} from './pay-in-resimac-pdf.model'; | ||||
| import {PayInPepperModel} from './pay-in-pepper.model'; | |||||
| public Connective?: PayInConnectiveModel[]; | public Connective?: PayInConnectiveModel[]; | ||||
| public ResimacXls?: PayInResimacXlsModel[]; | public ResimacXls?: PayInResimacXlsModel[]; | ||||
| public ResimacPdf?: PayInResimacPdfModel[]; | public ResimacPdf?: PayInResimacPdfModel[]; | ||||
| public Pepper?: PayInPepperModel[]; | |||||
| public IsDuplicate: boolean; | public IsDuplicate: boolean; | ||||
| public Uid?: string; // client side unique id when upload | public Uid?: string; // client side unique id when upload | ||||
| if (Array.isArray(payload.ResimacPdf)){ | if (Array.isArray(payload.ResimacPdf)){ | ||||
| payload.ResimacPdf.forEach( v => { this.ResimacPdf.push(new PayInResimacPdfModel(v)); }); | payload.ResimacPdf.forEach( v => { this.ResimacPdf.push(new PayInResimacPdfModel(v)); }); | ||||
| } | } | ||||
| this.Pepper = []; | |||||
| if (Array.isArray(payload.Pepper)){ | |||||
| payload.Pepper.forEach(v => { this.Pepper.push (new PayInPepperModel(v)); }); | |||||
| } | |||||
| this.IsDuplicate = payload.IsDuplicate || false; | this.IsDuplicate = payload.IsDuplicate || false; | ||||
| this.Uid = payload.Uid || '' ; | this.Uid = payload.Uid || '' ; |
| <kendo-grid-column field="Balance" format='{0:c}' width="150" > </kendo-grid-column> | <kendo-grid-column field="Balance" format='{0:c}' width="150" > </kendo-grid-column> | ||||
| <kendo-grid-column field="Associate" width="150"> </kendo-grid-column> | <kendo-grid-column field="Associate" width="150"> </kendo-grid-column> | ||||
| <kendo-grid-column field="Comm" format='{0:c}'> </kendo-grid-column> | <kendo-grid-column field="Comm" format='{0:c}'> </kendo-grid-column> | ||||
| <kendo-grid-column field="Type" width="50"> </kendo-grid-column> | |||||
| <kendo-grid-column field="Type" width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column field="Percent" format='{0:p}' width="80"> </kendo-grid-column> | <kendo-grid-column field="Percent" format='{0:p}' width="80"> </kendo-grid-column> | ||||
| <kendo-grid-column field="Paid" format='{0:c}' width="150"> </kendo-grid-column> | <kendo-grid-column field="Paid" format='{0:c}' width="150"> </kendo-grid-column> | ||||
| <kendo-grid-column field="GST" format='{0:c}' width="150"> </kendo-grid-column> | <kendo-grid-column field="GST" format='{0:c}' width="150"> </kendo-grid-column> |
| <kendo-grid [data]="data" (cellClick)="onCellClick($event)" [selectable]="true"> | |||||
| <ng-template kendoGridToolbarTemplate> | |||||
| {{ AgencyName }} - <span> {{InvoiceDate | date:'longDate'}} </span> | |||||
| </ng-template> | |||||
| <kendo-grid-column *ngIf="IncomeType=='trail'" field="Period" title="Period" format='{0:yyyy MMMM}' width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column *ngIf="IncomeType=='trail'" field="IncomeAmount" width="150" format='{0:c}' > </kendo-grid-column> | |||||
| <kendo-grid-column field="LoanNumber" width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column field="Customer" width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column field="PrimaryIntroducer" width="150" > </kendo-grid-column> | |||||
| <kendo-grid-column field="NextGenNumber" width="100" > </kendo-grid-column> | |||||
| <kendo-grid-column field="Settlement" width="150" format='{0:MM/dd/yyyy}'> | |||||
| <ng-template kendoGridCellTemplate let-dataItem> | |||||
| <div *ngIf="dataItem.Settlement != null && dataItem.Settlement >= Epoc" > | |||||
| {{ dataItem.Settlement | date: 'yyyy-MM-dd' }} | |||||
| </div> | |||||
| </ng-template> | |||||
| </kendo-grid-column> | |||||
| <kendo-grid-column field="Balance" width="150" format='{0:c}' > </kendo-grid-column> | |||||
| <kendo-grid-column *ngIf="IncomeType=='trail'" field="SettlementAmount" format='{0:c}' width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column *ngIf="IncomeType=='trail'" field="TrailerMargin" width="150"> </kendo-grid-column> | |||||
| <kendo-grid-column *ngIf="IncomeType=='upfront'" field="UpfrontRate" width="150" > </kendo-grid-column> | |||||
| <kendo-grid-column field="NetAmount" width="150" format='{0:c}' > </kendo-grid-column> | |||||
| <kendo-grid-column field="GST" width="150" format='{0:c}' > </kendo-grid-column> | |||||
| <kendo-grid-column field="GrossAmount" width="150" format='{0:c}' > </kendo-grid-column> | |||||
| <kendo-grid-column field="matchedPayIn" title="Matched" width="200" format='{0:c}'> | |||||
| <ng-template kendoGridCellTemplate let-dataItem> | |||||
| <kendo-icon *ngIf="dataItem.matchedPayIn === -1" [name]="'close-circle'" [size]="'small'" [themeColor]="'warning'"></kendo-icon> | |||||
| <kendo-icon *ngIf="dataItem.matchedPayIn !== -1" [name]="'tick'" [size]="'small'" [themeColor]="'success'"></kendo-icon> | |||||
| {{ dataItem.matchedPayIn === -1? 'Not matched': dataItem.matchedPayIn.Id}} | |||||
| </ng-template> | |||||
| </kendo-grid-column> | |||||
| </kendo-grid> |
| kendo-grid{ | |||||
| height: 100%; | |||||
| } |
| import { ComponentFixture, TestBed } from '@angular/core/testing'; | |||||
| import { LenderPepperIncomeComponent } from './lender-pepper-income.component'; | |||||
| describe('LenderPepperIncomeComponent', () => { | |||||
| let component: LenderPepperIncomeComponent; | |||||
| let fixture: ComponentFixture<LenderPepperIncomeComponent>; | |||||
| beforeEach(async () => { | |||||
| await TestBed.configureTestingModule({ | |||||
| declarations: [ LenderPepperIncomeComponent ] | |||||
| }) | |||||
| .compileComponents(); | |||||
| }); | |||||
| beforeEach(() => { | |||||
| fixture = TestBed.createComponent(LenderPepperIncomeComponent); | |||||
| component = fixture.componentInstance; | |||||
| fixture.detectChanges(); | |||||
| }); | |||||
| it('should create', () => { | |||||
| expect(component).toBeTruthy(); | |||||
| }); | |||||
| }); |
| import {Component, OnChanges, OnInit} from '@angular/core'; | |||||
| import {LenderIncomeAbstractDirective} from '../../abstract/lender-income-abstract.directive'; | |||||
| import {PayInPepperModel} from '../../models/pay-in-pepper.model'; | |||||
| @Component({ | |||||
| selector: 'app-lender-pepper-income', | |||||
| templateUrl: './lender-pepper-income.component.html', | |||||
| styleUrls: ['./lender-pepper-income.component.scss'] | |||||
| }) | |||||
| export class LenderPepperIncomeComponent extends LenderIncomeAbstractDirective implements OnInit, OnChanges { | |||||
| InvoiceDate = new Date(); | |||||
| IncomeType = ''; | |||||
| Epoc = new Date('1900-01-01'); | |||||
| constructor() { super('Pepper'); } | |||||
| ngOnInit(): void { | |||||
| this.analysis.Pepper.forEach(v => { | |||||
| v.matchedPayIn = this.matchPayIn(v); | |||||
| this.IncomeType = v.IncomeType.toLowerCase(); | |||||
| this.InvoiceDate = v.InvoiceDate; | |||||
| console.log(v.InvoiceDate, this.InvoiceDate); | |||||
| this.data.push(new PayInPepperModel(v)); | |||||
| }); | |||||
| } | |||||
| ngOnChanges(changes): void { | |||||
| super.OnChanges(changes); | |||||
| } | |||||
| } |
| [newPayInUpdate]="newPayInUpdateSubject | async" | [newPayInUpdate]="newPayInUpdateSubject | async" | ||||
| (Selected)="onSelected($event)"> | (Selected)="onSelected($event)"> | ||||
| </app-lender-resimac-pdf-income> | </app-lender-resimac-pdf-income> | ||||
| <app-lender-pepper-income *ngIf="LenderFormat === 'Pepper'" | |||||
| [analysis]="ua" | |||||
| [payIn]="payIn.gridData.data" | |||||
| [newPayInUpdate]="newPayInUpdateSubject | async" | |||||
| (Selected)="onSelected($event)"> | |||||
| </app-lender-pepper-income> | |||||
| </div> | </div> | ||||
| </ng-template> | </ng-template> |