Broker System for Supercredit
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

195 lines
5.7KB

  1. import {Component, Input, OnInit, Output, EventEmitter, ViewChild} from '@angular/core';
  2. import {FormControl, FormGroup, Validators} from '@angular/forms';
  3. import {AuthService} from '../../service/auth.service';
  4. import {LoanModel} from '../../models/loan.model';
  5. import {RewardModel} from '../../models/reward.model';
  6. import {PeopleModel, RelevantPeopleModel} from '../../models/people.model';
  7. import {debounce} from 'ts-debounce';
  8. import {LoanSingleService} from '../../service/loan.single.service';
  9. import {ClonerService} from '../../service/clone.service';
  10. import {PeopleService} from '../../service/people.service';
  11. import {Observable, of} from 'rxjs';
  12. import {map} from 'rxjs/operators';
  13. const createFormGroup = dataItem => new FormGroup({
  14. Id: new FormControl(dataItem.Id),
  15. To: new FormControl(dataItem.To, [Validators.required, Validators.maxLength(128), Validators.minLength(1)]),
  16. From: new FormControl(dataItem.From),
  17. Role: new FormControl({value: dataItem.Role, disabled: true} , [Validators.required, Validators.minLength(2), Validators.maxLength(40)]),
  18. Amount: new FormControl(dataItem.Amount, Validators.compose([Validators.required, Validators.min(0), Validators.max(1000000)])),
  19. Description: new FormControl(dataItem.Description, [Validators.required, Validators.maxLength(128)]),
  20. Ts: new FormControl( dataItem.Ts, Validators.required)
  21. });
  22. @Component({
  23. selector: 'app-loan-people-reward',
  24. templateUrl: './people-reward.component.html',
  25. styleUrls: ['./people-reward.component.scss']
  26. })
  27. export class PeopleRewardComponent implements OnInit {
  28. @Input() public Loan: LoanModel;
  29. @Output() public NotifyNext = new EventEmitter<boolean>();
  30. @Output() public NotifyPrev = new EventEmitter<boolean>();
  31. @Output() public errorOccurred = new EventEmitter<string>();
  32. public relevantPeople: RelevantPeopleModel[] = [];
  33. public total = 0;
  34. public pendingReward: RewardModel[] = [];
  35. public paidReward: RewardModel[] = [];
  36. public formGroup: FormGroup;
  37. private editedRowIndex: number;
  38. public existingRoles: string[] = [
  39. 'Broker',
  40. 'Client',
  41. 'Referral',
  42. 'Admin'
  43. ];
  44. public existingPayDescription: string[] = [
  45. 'Upfront',
  46. 'Broker Fee',
  47. 'SFM Incentive',
  48. 'Special Reward',
  49. 'Discount',
  50. 'Fringe Cost',
  51. 'Unknown',
  52. 'Trail'
  53. ];
  54. private debounceFilter: any ;
  55. constructor(private ls: LoanSingleService,
  56. private auth: AuthService,
  57. private dcs: ClonerService
  58. ) {
  59. }
  60. public ngOnInit(): void {
  61. this.initPeople(); // make sure people has the one that we need
  62. this.initReward();
  63. }
  64. public initPeople(): void{
  65. this.relevantPeople = this.Loan.getRelevantPeople();
  66. }
  67. public initReward(): void {
  68. this.Loan.Reward.forEach((r) => {
  69. const o = this.dcs.deepClone<RewardModel>(r);
  70. if ( r.PayOutId > 0 ){
  71. this.paidReward.push(o);
  72. }else{
  73. this.pendingReward.push(o);
  74. this.pendingReward.sort((a, b) => a.Ts > b.Ts ? -1 : 1 );
  75. }
  76. });
  77. }
  78. public addHandler({ sender }): void {
  79. this.closeEditor(sender);
  80. this.formGroup = createFormGroup({
  81. Id: 0,
  82. To: '',
  83. From: '',
  84. Role: 'Unknown',
  85. Amount: 0,
  86. Description: '',
  87. PayOutId: 0,
  88. Ts: new Date()
  89. });
  90. sender.addRow(this.formGroup);
  91. }
  92. public editHandler({ sender, rowIndex, dataItem }): void {
  93. this.closeEditor(sender);
  94. // console.log(sender);
  95. this.formGroup = createFormGroup(dataItem);
  96. this.editedRowIndex = rowIndex;
  97. sender.editRow(rowIndex, this.formGroup);
  98. // console.log('editing' , dataItem, this.formGroup);
  99. }
  100. public cancelHandler({ sender, rowIndex }): void{
  101. // console.log(sender);
  102. this.closeEditor(sender, rowIndex);
  103. }
  104. public saveHandler({ sender, rowIndex, formGroup, isNew }): void {
  105. const reward = formGroup.value;
  106. reward.From = '0'; // Admin
  107. // reward.Ts = new Date(); // Now
  108. reward.LoanId = this.Loan.Id; // Enforce LoanId
  109. reward.PayOutId = 0; // make sure it is not paid
  110. this.ls.saveReward(reward, isNew).subscribe(
  111. resp => {
  112. if ( reward.Id === 0 ) {
  113. const r = this.Loan.addReward(resp.Amount, resp.Description, resp.Id, resp.LoanId, resp.PayOutId, resp.To, resp.From, resp.Ts);
  114. this.pendingReward.unshift(r);
  115. }else{
  116. const idx = this.pendingReward.findIndex( v => v.Id === reward.Id);
  117. // update
  118. this.pendingReward[idx].To = reward.To;
  119. this.pendingReward[idx].Amount = reward.Amount;
  120. this.pendingReward[idx].Description = reward.Description;
  121. this.pendingReward[idx].Ts = reward.Ts;
  122. // update Loan
  123. this.Loan.updateReward(resp.Amount, resp.Description, resp.Id, resp.LoanId, resp.PayOutId, resp.To, resp.From, resp.Ts);
  124. }
  125. }
  126. );
  127. sender.closeRow(rowIndex);
  128. }
  129. peopleChanged(id: string): void {
  130. this.formGroup.get('Role').setValue(this.Loan.getRoleById(id));
  131. }
  132. public removeHandler({ dataItem }): void {
  133. const na = this.pendingReward.filter(v => {
  134. return v.Id !== dataItem.Id;
  135. });
  136. this.Loan.removeReward(dataItem.Id);
  137. this.pendingReward = na;
  138. this.ls.removeReward(dataItem);
  139. }
  140. private closeEditor(grid, rowIndex = this.editedRowIndex): void {
  141. grid.closeRow(rowIndex);
  142. this.editedRowIndex = undefined;
  143. this.formGroup = undefined;
  144. }
  145. public getContactImageUrl(contactId: string): string {
  146. return this.auth.getUrl('avatar/' + contactId);
  147. }
  148. public photoURL(peopleId: string): string {
  149. const url = this.auth.getUrl('avatar/') + peopleId;
  150. return 'url("' + url + '")';
  151. }
  152. public UserName(dataItem: RewardModel): string {
  153. return dataItem.UserName;
  154. }
  155. public next(): void{
  156. this.NotifyNext.emit(true);
  157. }
  158. public prev(): void {
  159. this.NotifyPrev.emit(true);
  160. }
  161. }