| @@ -105,6 +105,7 @@ import { LenderAaaIncomeComponent } from './pay-in/lender-aaa-income/lender-aaa- | |||
| 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 { 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'; | |||
| @@ -179,6 +180,7 @@ export function initializeApp(appConfig: AppConfig): () => Promise<void> { | |||
| LenderConnectiveIncomeComponent, | |||
| LenderResimacXlsIncomeComponent, | |||
| LenderResimacPdfIncomeComponent, | |||
| LenderPepperIncomeComponent, | |||
| ], | |||
| imports: [ | |||
| BrowserModule, | |||
| @@ -100,7 +100,8 @@ | |||
| </kendo-grid-column-group> | |||
| <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> | |||
| <app-biukop-rating | |||
| [value]="dataItem.Rating" | |||
| @@ -17,7 +17,7 @@ export class ListAllRewardsComponent implements OnInit { | |||
| public gridView: GridDataResult; | |||
| public state: State = { | |||
| skip: 0, | |||
| take: 10 | |||
| take: 20 | |||
| }; | |||
| public loading = true; | |||
| @@ -29,7 +29,7 @@ | |||
| <bkp-divider> | |||
| <kendo-icon [name]="'table'"></kendo-icon> Monthly Income | |||
| <kendo-icon [name]="'table'"></kendo-icon> Income of this Loan | |||
| </bkp-divider> | |||
| <kendo-grid [data]="Loan.PayIn" | |||
| @@ -56,7 +56,9 @@ | |||
| <kendo-grid-column field="Id" title="Id" width="50" editable="false"> | |||
| </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 field="Ts" title="Trail Date" editor="date"> | |||
| @@ -9,7 +9,8 @@ import {Router} from '@angular/router'; | |||
| const createFormGroup = dataItem => new FormGroup({ | |||
| 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), | |||
| Balance: new FormControl(dataItem.Balance, Validators.required), | |||
| OffsetBalance: new FormControl(dataItem.OffsetBalance, Validators.required), | |||
| @@ -57,7 +58,8 @@ export class TrailIncomeComponent implements OnInit { | |||
| this.formGroup = createFormGroup({ | |||
| Id: 0, | |||
| Trail: 168, | |||
| IncomeAmount: 168, | |||
| IncomeType: 'Trail', | |||
| Ts: new Date(), | |||
| Balance: balance, | |||
| OffsetBalance: offsetBalance, | |||
| @@ -107,7 +109,8 @@ export class TrailIncomeComponent implements OnInit { | |||
| pi.LoanNumber = this.Loan.LenderLoanNumber; | |||
| pi.OffsetBalance = v.OffsetBalance; | |||
| 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.UploadId = v.UploadId; | |||
| @@ -23,9 +23,6 @@ export const mainMenuItems: any[] = [ | |||
| { text: 'list income', icon: 'dollar', url: './#list-income' }, | |||
| { text: '--', separator: 'true' }, | |||
| { 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' }, | |||
| ] | |||
| }, | |||
| { | |||
| @@ -30,7 +30,7 @@ export class PayInConnectiveModel extends PayInLenderIncomeModel { | |||
| this.Balance = payload.Balance || 0; | |||
| this.Associate = payload.Associate || ''; | |||
| this.Comm = payload.Comm || 0; | |||
| this.Type = payload.Type || ''; | |||
| this.Type = this.mapIncomeType(payload.Type || ''); | |||
| this.Percent = payload.Percent || 0; | |||
| this.Paid = payload.Paid || 0; | |||
| this.GST = payload.GST || 0; | |||
| @@ -38,6 +38,18 @@ export class PayInConnectiveModel extends PayInLenderIncomeModel { | |||
| 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 { | |||
| if ( this.Lender.indexOf(this.AgencyName) === -1 ){ | |||
| this.Lender += '_' + this.AgencyName; | |||
| @@ -0,0 +1,98 @@ | |||
| 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(); | |||
| } | |||
| } | |||
| @@ -4,6 +4,7 @@ import {PayInAAARowModel} from './Pay.In.AAA.Row.model'; | |||
| import {PayInConnectiveModel} from './pay-in-connective.model'; | |||
| import {PayInResimacXlsModel} from './pay-in-resimac-xls.mode'; | |||
| import {PayInResimacPdfModel} from './pay-in-resimac-pdf.model'; | |||
| import {PayInPepperModel} from './pay-in-pepper.model'; | |||
| @@ -17,6 +18,7 @@ export class UploadAnalysisModel { | |||
| public Connective?: PayInConnectiveModel[]; | |||
| public ResimacXls?: PayInResimacXlsModel[]; | |||
| public ResimacPdf?: PayInResimacPdfModel[]; | |||
| public Pepper?: PayInPepperModel[]; | |||
| public IsDuplicate: boolean; | |||
| public Uid?: string; // client side unique id when upload | |||
| @@ -57,6 +59,10 @@ export class UploadAnalysisModel { | |||
| if (Array.isArray(payload.ResimacPdf)){ | |||
| 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.Uid = payload.Uid || '' ; | |||
| @@ -15,7 +15,7 @@ | |||
| <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="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="Paid" format='{0:c}' width="150"> </kendo-grid-column> | |||
| <kendo-grid-column field="GST" format='{0:c}' width="150"> </kendo-grid-column> | |||
| @@ -0,0 +1,39 @@ | |||
| <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> | |||
| @@ -0,0 +1,3 @@ | |||
| kendo-grid{ | |||
| height: 100%; | |||
| } | |||
| @@ -0,0 +1,25 @@ | |||
| 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(); | |||
| }); | |||
| }); | |||
| @@ -0,0 +1,30 @@ | |||
| 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); | |||
| } | |||
| } | |||
| @@ -75,6 +75,12 @@ | |||
| [newPayInUpdate]="newPayInUpdateSubject | async" | |||
| (Selected)="onSelected($event)"> | |||
| </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> | |||
| </ng-template> | |||