gemcap-be-common 1.2.140 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/classes/bank-transaction-item.d.ts +17 -0
  2. package/classes/bank-transaction-item.js +64 -0
  3. package/classes/bank-transaction-item.ts +66 -0
  4. package/classes/bank-uploaded-transaction.d.ts +17 -0
  5. package/classes/bank-uploaded-transaction.js +35 -0
  6. package/classes/bank-uploaded-transaction.ts +35 -0
  7. package/classes/inventory-item.d.ts +41 -0
  8. package/classes/inventory-item.js +44 -0
  9. package/classes/inventory-item.ts +63 -0
  10. package/classes/payable-account-item.d.ts +22 -0
  11. package/classes/payable-account-item.js +27 -0
  12. package/classes/payable-account-item.ts +35 -0
  13. package/classes/quickbook-item.d.ts +37 -0
  14. package/classes/quickbook-item.js +51 -0
  15. package/classes/quickbook-item.ts +59 -0
  16. package/classes/receivable-item.d.ts +26 -0
  17. package/classes/receivable-item.js +28 -0
  18. package/classes/receivable-item.ts +38 -0
  19. package/constants/date-formats.contsants.d.ts +1 -0
  20. package/constants/date-formats.contsants.js +4 -0
  21. package/constants/date-formats.contsants.ts +1 -0
  22. package/db/brokers.db.d.ts +185 -0
  23. package/db/brokers.db.js +35 -2
  24. package/db/brokers.db.ts +34 -1
  25. package/db/collateral-adjustments.db.d.ts +34 -0
  26. package/db/collateral-adjustments.db.js +52 -0
  27. package/db/collateral-adjustments.db.ts +54 -0
  28. package/db/collaterals.db.d.ts +1 -1
  29. package/db/equipment.db.d.ts +40 -0
  30. package/db/equipment.db.js +55 -0
  31. package/db/equipment.db.ts +56 -0
  32. package/db/financial-spreading.db.ts +2 -1
  33. package/db/groups.d.ts +5 -0
  34. package/db/groups.js +57 -0
  35. package/db/groups.ts +52 -0
  36. package/db/inventories.d.ts +91 -0
  37. package/db/inventories.js +449 -0
  38. package/db/inventories.ts +481 -0
  39. package/db/inventory-availability.d.ts +3 -0
  40. package/db/inventory-availability.js +103 -0
  41. package/db/inventory-availability.ts +113 -0
  42. package/db/new-summary.d.ts +31 -0
  43. package/db/new-summary.js +1295 -0
  44. package/db/new-summary.ts +1509 -0
  45. package/db/payable-accounts.d.ts +30 -0
  46. package/db/payable-accounts.js +55 -0
  47. package/db/payable-accounts.ts +50 -0
  48. package/db/reserve.db.d.ts +34 -0
  49. package/db/reserve.db.js +52 -0
  50. package/db/reserve.db.ts +48 -0
  51. package/db/uploads.db.d.ts +2 -0
  52. package/db/uploads.db.js +29 -0
  53. package/db/uploads.db.ts +24 -0
  54. package/helpers/main.helper.d.ts +31 -0
  55. package/helpers/main.helper.js +63 -0
  56. package/helpers/main.helper.ts +63 -0
  57. package/models/AccountPayableItem.model.d.ts +6 -6
  58. package/models/AllocatedBankTransaction.model.d.ts +54 -0
  59. package/models/AllocatedBankTransaction.model.js +70 -0
  60. package/models/AllocatedBankTransaction.model.ts +94 -0
  61. package/models/AllocatedData.model.d.ts +33 -0
  62. package/models/AllocatedData.model.js +19 -0
  63. package/models/AllocatedData.model.ts +24 -0
  64. package/models/BBCDate.model.d.ts +3 -3
  65. package/models/BBCSheet.model.d.ts +3 -3
  66. package/models/Banks.model.d.ts +3 -3
  67. package/models/Borrower.model.d.ts +3 -3
  68. package/models/BorrowerData.model.d.ts +3 -3
  69. package/models/BorrowerDataInsurance.model.d.ts +3 -3
  70. package/models/BorrowerDataTerm.model.d.ts +3 -3
  71. package/models/BorrowerSummary.model.js +1 -1
  72. package/models/BorrowerSummary.model.ts +1 -1
  73. package/models/CalandarDay.model.d.ts +40 -0
  74. package/models/CalandarDay.model.js +47 -0
  75. package/models/CalandarDay.model.ts +61 -0
  76. package/models/CashAllocationProduct.model.d.ts +119 -0
  77. package/models/CashAllocationProduct.model.js +102 -0
  78. package/models/CashAllocationProduct.model.ts +112 -0
  79. package/models/CashAllocationReference.model.d.ts +37 -0
  80. package/models/CashAllocationReference.model.js +27 -0
  81. package/models/CashAllocationReference.model.ts +40 -0
  82. package/models/CollateralAdjustment.model.d.ts +51 -0
  83. package/models/CollateralAdjustment.model.js +61 -0
  84. package/models/CollateralAdjustment.model.ts +98 -0
  85. package/models/Company.model.d.ts +35 -0
  86. package/models/Company.model.js +18 -0
  87. package/models/Company.model.ts +29 -0
  88. package/models/CustomerAPGroup.model.d.ts +32 -0
  89. package/models/CustomerAPGroup.model.js +24 -0
  90. package/models/CustomerAPGroup.model.ts +31 -0
  91. package/models/Equipment.model.d.ts +53 -0
  92. package/models/Equipment.model.js +140 -0
  93. package/models/Equipment.model.ts +172 -0
  94. package/models/FinancialCompliance.model.d.ts +39 -0
  95. package/models/FinancialCompliance.model.js +64 -0
  96. package/models/FinancialCompliance.model.ts +78 -0
  97. package/models/FinancialComplianceBorrower.model.d.ts +58 -0
  98. package/models/FinancialComplianceBorrower.model.js +82 -0
  99. package/models/FinancialComplianceBorrower.model.ts +118 -0
  100. package/models/FinancialIndexes.model.d.ts +36 -0
  101. package/models/FinancialIndexes.model.js +27 -0
  102. package/models/FinancialIndexes.model.ts +37 -0
  103. package/models/Inventory.model.d.ts +18 -18
  104. package/models/InventoryAvailability.model.d.ts +21 -21
  105. package/models/InventoryAvailabilityItem.model.d.ts +6 -6
  106. package/models/InventoryItem.model.d.ts +24 -24
  107. package/models/InventoryManualEntry.model.d.ts +9 -9
  108. package/models/InventorySeasonalRates.model.d.ts +3 -3
  109. package/models/LoanBroker.model.d.ts +3 -3
  110. package/models/LoanCharges.model.d.ts +12 -12
  111. package/models/LoanProducts.model.d.ts +9 -9
  112. package/models/LoanStatementStatus.model.d.ts +35 -0
  113. package/models/LoanStatementStatus.model.js +34 -0
  114. package/models/LoanStatementStatus.model.ts +45 -0
  115. package/models/LoanStatementTransaction.model.d.ts +9 -9
  116. package/models/LoanTransactionFile.model.d.ts +41 -0
  117. package/models/LoanTransactionFile.model.js +44 -0
  118. package/models/LoanTransactionFile.model.ts +61 -0
  119. package/models/MappedGroup.model.d.ts +37 -0
  120. package/models/MappedGroup.model.js +33 -0
  121. package/models/MappedGroup.model.ts +46 -0
  122. package/models/MonthEndData.Model.d.ts +41 -0
  123. package/models/MonthEndData.Model.js +42 -0
  124. package/models/MonthEndData.Model.ts +53 -0
  125. package/models/OrganizationEmails.model.d.ts +44 -0
  126. package/models/OrganizationEmails.model.js +40 -0
  127. package/models/OrganizationEmails.model.ts +54 -0
  128. package/models/ProductBroker.model.d.ts +9 -9
  129. package/models/QuickbooksAccount.model.d.ts +39 -0
  130. package/models/QuickbooksAccount.model.js +43 -0
  131. package/models/QuickbooksAccount.model.ts +57 -0
  132. package/models/Receivable.model.d.ts +12 -12
  133. package/models/ReceivableAvailability.model.d.ts +54 -54
  134. package/models/ReceivableAvailabilityItem.model.d.ts +57 -57
  135. package/models/ReceivableItem.model.d.ts +6 -6
  136. package/models/Reserve.model.d.ts +51 -0
  137. package/models/Reserve.model.js +96 -0
  138. package/models/Reserve.model.ts +125 -0
  139. package/models/TermLoan.model.d.ts +3 -3
  140. package/models/TermLoanCalculated.model.d.ts +6 -6
  141. package/models/TransactionAttachedFile.Model.d.ts +35 -0
  142. package/models/TransactionAttachedFile.Model.js +37 -0
  143. package/models/TransactionAttachedFile.Model.ts +48 -0
  144. package/models/UploadedBankTransaction.model.d.ts +56 -0
  145. package/models/UploadedBankTransaction.model.js +78 -0
  146. package/models/UploadedBankTransaction.model.ts +110 -0
  147. package/models/UploadedData.model.d.ts +36 -0
  148. package/models/UploadedData.model.js +23 -0
  149. package/models/UploadedData.model.ts +35 -0
  150. package/models/UploadedFile.model.d.ts +40 -0
  151. package/models/UploadedFile.model.js +41 -0
  152. package/models/UploadedFile.model.ts +57 -0
  153. package/models/UploadedSheet.model.d.ts +46 -0
  154. package/models/UploadedSheet.model.js +27 -0
  155. package/models/UploadedSheet.model.ts +51 -0
  156. package/package.json +10 -1
  157. package/repositories/globals.repository.d.ts +8 -0
  158. package/repositories/globals.repository.js +24 -0
  159. package/repositories/globals.repository.ts +21 -0
  160. package/services/attached-files.service.d.ts +57 -0
  161. package/services/attached-files.service.js +103 -0
  162. package/services/attached-files.service.ts +123 -0
  163. package/services/availability.service.d.ts +77 -0
  164. package/services/availability.service.js +897 -0
  165. package/services/availability.service.ts +1034 -0
  166. package/services/bank-uploaded-transactions.service.d.ts +33 -0
  167. package/services/bank-uploaded-transactions.service.js +430 -0
  168. package/services/bank-uploaded-transactions.service.ts +475 -0
  169. package/services/banks.service.d.ts +36 -0
  170. package/services/banks.service.js +91 -0
  171. package/services/banks.service.ts +95 -0
  172. package/services/borrower-summary.service.d.ts +35 -0
  173. package/services/borrower-summary.service.js +310 -0
  174. package/services/borrower-summary.service.ts +334 -0
  175. package/services/borrowers.service.d.ts +103 -0
  176. package/services/borrowers.service.js +268 -0
  177. package/services/borrowers.service.ts +302 -0
  178. package/services/brokers.service.d.ts +212 -0
  179. package/services/brokers.service.js +160 -0
  180. package/services/brokers.service.ts +200 -0
  181. package/services/calendar.service.d.ts +53 -0
  182. package/services/calendar.service.js +108 -0
  183. package/services/calendar.service.ts +128 -0
  184. package/services/cash-allocation.service.d.ts +40 -0
  185. package/services/cash-allocation.service.js +92 -0
  186. package/services/cash-allocation.service.ts +105 -0
  187. package/services/collateral-adjustments.service.d.ts +38 -0
  188. package/services/collateral-adjustments.service.js +82 -0
  189. package/services/collateral-adjustments.service.ts +95 -0
  190. package/services/collaterals.service.d.ts +69 -0
  191. package/services/collaterals.service.js +279 -0
  192. package/services/collaterals.service.ts +319 -0
  193. package/services/companies.service.d.ts +5 -0
  194. package/services/companies.service.js +21 -0
  195. package/services/companies.service.ts +23 -0
  196. package/services/compliance-borrowers.service.d.ts +152 -0
  197. package/services/compliance-borrowers.service.js +569 -0
  198. package/services/compliance-borrowers.service.ts +617 -0
  199. package/services/equipment.service.d.ts +42 -0
  200. package/services/equipment.service.js +120 -0
  201. package/services/equipment.service.ts +149 -0
  202. package/services/file-manager.service.d.ts +44 -0
  203. package/services/file-manager.service.js +120 -0
  204. package/services/file-manager.service.ts +146 -0
  205. package/services/financial-compliance.service.d.ts +58 -0
  206. package/services/financial-compliance.service.js +281 -0
  207. package/services/financial-compliance.service.ts +309 -0
  208. package/services/financial-indexes.service.d.ts +20 -0
  209. package/services/financial-indexes.service.js +241 -0
  210. package/services/financial-indexes.service.ts +257 -0
  211. package/services/financial-spreading.service.d.ts +74 -0
  212. package/services/financial-spreading.service.js +450 -0
  213. package/services/financial-spreading.service.ts +517 -0
  214. package/services/globals.service.d.ts +5 -0
  215. package/services/globals.service.js +11 -0
  216. package/services/globals.service.ts +8 -0
  217. package/services/groups.service.d.ts +39 -0
  218. package/services/groups.service.js +65 -0
  219. package/services/groups.service.ts +64 -0
  220. package/services/inventory-availability.service.d.ts +13 -0
  221. package/services/inventory-availability.service.js +170 -0
  222. package/services/inventory-availability.service.ts +187 -0
  223. package/services/inventory.service.d.ts +118 -0
  224. package/services/inventory.service.js +239 -0
  225. package/services/inventory.service.ts +276 -0
  226. package/services/loan-charges.service.d.ts +83 -0
  227. package/services/loan-charges.service.js +343 -0
  228. package/services/loan-charges.service.ts +396 -0
  229. package/services/loan-payments.service.d.ts +94 -0
  230. package/services/loan-payments.service.js +485 -0
  231. package/services/loan-payments.service.ts +541 -0
  232. package/services/loan-products.service.d.ts +12 -0
  233. package/services/loan-products.service.js +55 -0
  234. package/services/loan-products.service.ts +58 -0
  235. package/services/loan-statement-balance.service.d.ts +16 -0
  236. package/services/loan-statement-balance.service.js +106 -0
  237. package/services/loan-statement-balance.service.ts +113 -0
  238. package/services/loan-statement-effects.service.d.ts +8 -0
  239. package/services/loan-statement-effects.service.js +42 -0
  240. package/services/loan-statement-effects.service.ts +41 -0
  241. package/services/loan-statement-status.service.d.ts +208 -0
  242. package/services/loan-statement-status.service.js +159 -0
  243. package/services/loan-statement-status.service.ts +177 -0
  244. package/services/loan-statement.service.d.ts +186 -0
  245. package/services/loan-statement.service.js +935 -0
  246. package/services/loan-statement.service.ts +1040 -0
  247. package/services/loan-transactions.service.d.ts +169 -0
  248. package/services/loan-transactions.service.js +941 -0
  249. package/services/loan-transactions.service.ts +1042 -0
  250. package/services/lock.service.d.ts +6 -0
  251. package/services/lock.service.js +45 -0
  252. package/services/lock.service.ts +45 -0
  253. package/services/manual-entry.service.d.ts +20 -0
  254. package/services/manual-entry.service.js +186 -0
  255. package/services/manual-entry.service.ts +201 -0
  256. package/services/month-end-data.service.d.ts +34 -0
  257. package/services/month-end-data.service.js +30 -0
  258. package/services/month-end-data.service.ts +35 -0
  259. package/services/nodemailer.service.d.ts +96 -0
  260. package/services/nodemailer.service.js +689 -0
  261. package/services/nodemailer.service.ts +774 -0
  262. package/services/organization-emails.service.d.ts +31 -0
  263. package/services/organization-emails.service.js +10 -0
  264. package/services/organization-emails.service.ts +7 -0
  265. package/services/organizations.service.d.ts +34 -0
  266. package/services/organizations.service.js +74 -0
  267. package/services/organizations.service.ts +84 -0
  268. package/services/pdf.service.d.ts +61 -0
  269. package/services/pdf.service.js +547 -0
  270. package/services/pdf.service.ts +642 -0
  271. package/services/quickbooks.service.d.ts +99 -0
  272. package/services/quickbooks.service.js +640 -0
  273. package/services/quickbooks.service.ts +734 -0
  274. package/services/reports/investor-summary.service.d.ts +28 -0
  275. package/services/reports/investor-summary.service.js +136 -0
  276. package/services/reports/investor-summary.service.ts +159 -0
  277. package/services/reports.service.d.ts +126 -0
  278. package/services/reports.service.js +584 -0
  279. package/services/reports.service.ts +702 -0
  280. package/services/reserve.service.d.ts +37 -0
  281. package/services/reserve.service.js +76 -0
  282. package/services/reserve.service.ts +79 -0
  283. package/services/sentry.service.d.ts +11 -0
  284. package/services/sentry.service.js +49 -0
  285. package/services/sentry.service.ts +33 -0
  286. package/services/signs.service.d.ts +69 -0
  287. package/services/signs.service.js +230 -0
  288. package/services/signs.service.ts +260 -0
  289. package/services/term-loan.service.d.ts +30 -0
  290. package/services/term-loan.service.js +614 -0
  291. package/services/term-loan.service.ts +696 -0
  292. package/services/uploads.service.d.ts +134 -0
  293. package/services/uploads.service.js +587 -0
  294. package/services/uploads.service.ts +643 -0
  295. package/services/user-logs.service.d.ts +23 -0
  296. package/services/user-logs.service.js +160 -0
  297. package/services/user-logs.service.ts +177 -0
  298. package/services/users.service.d.ts +4 -4
  299. package/services/yield.service.d.ts +46 -0
  300. package/services/yield.service.js +42 -12
  301. package/services/yield.service.ts +38 -8
  302. package/tsconfig.json +5 -5
  303. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,95 @@
1
+ import { Bank, IBankView, IBankWithId } from '../models/Banks.model';
2
+
3
+ import { QuickbooksAccount } from '../models/QuickbooksAccount.model';
4
+
5
+ const fieldsToUnset = ['order', '__v', 'createdAt', 'updatedAt'];
6
+
7
+ export class BanksService {
8
+
9
+ async getBanks() {
10
+ return Bank.aggregate<IBankView>([
11
+ {
12
+ $sort: {
13
+ 'order': 1,
14
+ },
15
+ }, {
16
+ $unset: fieldsToUnset,
17
+ }, {
18
+ $addFields: {
19
+ valid: true,
20
+ },
21
+ },
22
+ ]);
23
+ }
24
+
25
+ async createBank(bank: IBankView) {
26
+ const newBank = new Bank(bank);
27
+ await newBank.save();
28
+ }
29
+
30
+ async editBank(bank: IBankView) {
31
+ await Bank.findByIdAndUpdate(bank._id, bank);
32
+ }
33
+
34
+ async findBankByNumber(bankAccountNumber: string) {
35
+ return Bank.findOne({ bankAccountNumber }).lean();
36
+ }
37
+
38
+ async findBankByAccountCode(accountCode: string) {
39
+ const account = await QuickbooksAccount.findOne({ accountCode }).lean();
40
+ if (!account) {
41
+ return null;
42
+ }
43
+ const banks: IBankWithId[] = await Bank.aggregate([
44
+ {
45
+ '$match': {
46
+ '$expr': {
47
+ '$gt': [
48
+ {
49
+ '$size': {
50
+ '$filter': {
51
+ 'input': {
52
+ '$objectToArray': '$ledgerAccountCodes',
53
+ },
54
+ 'as': 'entry',
55
+ 'cond': {
56
+ '$eq': [
57
+ '$$entry.v', account._id,
58
+ ],
59
+ },
60
+ },
61
+ },
62
+ }, 0,
63
+ ],
64
+ },
65
+ },
66
+ }, {
67
+ '$sort': {
68
+ 'bankAccountNumber': 1,
69
+ },
70
+ }, {
71
+ '$limit': 1,
72
+ },
73
+ ]);
74
+ if (banks.length > 0) {
75
+ return banks[0];
76
+ }
77
+ return null;
78
+ }
79
+
80
+ async updateBanks(banks: IBankView[]) {
81
+ const existingBanks = await Bank.find().lean();
82
+ const existingBankIds: string[] = existingBanks.map((bank) => bank._id.toString());
83
+ const updatedBankIds: string[] = banks.map((bank) => bank._id.toString());
84
+ const idsToRemove = existingBankIds.filter((id) => !updatedBankIds.includes(id));
85
+ await Promise.all(banks.map(async (bank) => {
86
+ const { _id, ...rest } = bank;
87
+ if (_id.toString().includes('new_')) {
88
+ await this.createBank({ _id: null, ...rest });
89
+ } else {
90
+ await this.editBank(bank);
91
+ }
92
+ }));
93
+ await Bank.updateMany({ _id: { $in: idsToRemove } }, { isDeleted: true });
94
+ }
95
+ }
@@ -0,0 +1,35 @@
1
+ import { IBorrowerSummaryDoc } from '../models/BorrowerSummary.model';
2
+ import { AvailabilityService } from './availability.service';
3
+ import { BorrowerService } from './borrowers.service';
4
+ import { InventoryService } from './inventory.service';
5
+ import { LoanChargesService } from './loan-charges.service';
6
+ import { LoanTransactionsService } from './loan-transactions.service';
7
+ import { ReportsService } from './reports.service';
8
+ export declare class BorrowerSummaryService {
9
+ private readonly availabilityService;
10
+ private readonly borrowerService;
11
+ private readonly inventoryService;
12
+ private readonly loanChargesService;
13
+ private readonly loanTransactionsService;
14
+ private readonly reportsService;
15
+ constructor(availabilityService: AvailabilityService, borrowerService: BorrowerService, inventoryService: InventoryService, loanChargesService: LoanChargesService, loanTransactionsService: LoanTransactionsService, reportsService: ReportsService);
16
+ getBorrowerSummary(borrowerId: string): Promise<IBorrowerSummaryDoc>;
17
+ private getHighLevelTable;
18
+ private getComplianceItemsTable;
19
+ getTop5SKUsData(borrowerId: string): Promise<{
20
+ _id: string;
21
+ totalAmount: number;
22
+ }[]>;
23
+ private getTop5SKUs;
24
+ private getInventoryTurn;
25
+ getTop5CustomersConcentrationData(borrowerId: string): Promise<{
26
+ _id: string;
27
+ totalAmount: number;
28
+ }[]>;
29
+ private getTop5CustomersConcentration;
30
+ private getAgedCustomers;
31
+ private getLast5TransactionsTable;
32
+ private getChartData;
33
+ updateBorrowerSummary(borrowerId: string): Promise<void>;
34
+ recalculateAllActive(): Promise<void>;
35
+ }
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BorrowerSummaryService = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const dayjs_1 = __importDefault(require("dayjs"));
9
+ const decimal_js_1 = __importDefault(require("decimal.js"));
10
+ const LoanTransaction_model_1 = require("../models/LoanTransaction.model");
11
+ const date_helper_1 = require("../helpers/date.helper");
12
+ const numbers_helper_1 = require("../helpers/numbers.helper");
13
+ const BorrowerCompliance_model_1 = require("../models/BorrowerCompliance.model");
14
+ const ComplianceItem_model_1 = require("../models/ComplianceItem.model");
15
+ const bbcSheets_db_1 = require("../db/bbcSheets.db");
16
+ const collaterals_enum_1 = require("../enums/collaterals.enum");
17
+ const loan_types_enum_1 = require("../enums/loan-types.enum");
18
+ const receivables_db_1 = require("../db/receivables.db");
19
+ const bbcDates_db_1 = require("../db/bbcDates.db");
20
+ const BorrowerSummary_model_1 = require("../models/BorrowerSummary.model");
21
+ const inventories_1 = require("../db/inventories");
22
+ class BorrowerSummaryService {
23
+ availabilityService;
24
+ borrowerService;
25
+ inventoryService;
26
+ loanChargesService;
27
+ loanTransactionsService;
28
+ reportsService;
29
+ constructor(availabilityService, borrowerService, inventoryService, loanChargesService, loanTransactionsService, reportsService) {
30
+ this.availabilityService = availabilityService;
31
+ this.borrowerService = borrowerService;
32
+ this.inventoryService = inventoryService;
33
+ this.loanChargesService = loanChargesService;
34
+ this.loanTransactionsService = loanTransactionsService;
35
+ this.reportsService = reportsService;
36
+ }
37
+ async getBorrowerSummary(borrowerId) {
38
+ return BorrowerSummary_model_1.BorrowerSummary.findOne({ borrowerId });
39
+ }
40
+ async getHighLevelTable(borrowerId, useSignedBBC) {
41
+ const extraInfo = await this.borrowerService.getExtraInfo(borrowerId);
42
+ const lastBBCDate = useSignedBBC ? extraInfo.lastSignedBBCDate : extraInfo.lastBBCDate;
43
+ const loanBalances = {
44
+ [loan_types_enum_1.ELoanTypes.REVOLVER]: 0,
45
+ [loan_types_enum_1.ELoanTypes.TERM]: 0,
46
+ };
47
+ const products = await this.loanChargesService.getLoanProducts(borrowerId);
48
+ await Promise.all(products.map(async (p) => {
49
+ const lastTransaction = await this.loanTransactionsService.getLastTransactionForDate(p._id.toString(), (0, dayjs_1.default)(lastBBCDate).utcOffset(0).endOf('day').toDate());
50
+ if (lastTransaction) {
51
+ loanBalances[loan_types_enum_1.ELoanTypes[p.type]] = new decimal_js_1.default(loanBalances[loan_types_enum_1.ELoanTypes[p.type]]).add(lastTransaction.balance).toNumber();
52
+ }
53
+ }));
54
+ if (!useSignedBBC) {
55
+ return {
56
+ title: 'Loan summary - Current',
57
+ data: [
58
+ ['Loan Balance - REVOLVER', (0, numbers_helper_1.formatNumbers)(loanBalances[loan_types_enum_1.ELoanTypes.REVOLVER])],
59
+ ['Loan Balance - TERM', (0, numbers_helper_1.formatNumbers)(loanBalances[loan_types_enum_1.ELoanTypes.TERM])],
60
+ ],
61
+ };
62
+ }
63
+ const allProductsData = await this.reportsService.generateBankPortfolioSummary([borrowerId], lastBBCDate, {
64
+ useSignedBBC,
65
+ useStoredBalance: false,
66
+ });
67
+ const collateralRevolver = allProductsData.reduce((acc, product) => {
68
+ return new decimal_js_1.default(acc).add(product.totalCollateral).toNumber();
69
+ }, 0);
70
+ const collateralTerm = allProductsData.reduce((acc, product) => {
71
+ return new decimal_js_1.default(acc).add(product.equipmentCollateral).toNumber();
72
+ }, 0);
73
+ return {
74
+ title: `Summary of Last Approved BBC - ${(0, dayjs_1.default)(lastBBCDate).format(date_helper_1.defaultDateFormat)}`,
75
+ data: [
76
+ ['Loan Balance - REVOLVER', (0, numbers_helper_1.formatNumbers)(loanBalances[loan_types_enum_1.ELoanTypes.REVOLVER])],
77
+ ['Loan Balance - TERM', (0, numbers_helper_1.formatNumbers)(loanBalances[loan_types_enum_1.ELoanTypes.TERM])],
78
+ ['Collateral - REVOLVER', (0, numbers_helper_1.formatNumbers)(collateralRevolver)],
79
+ ['Collateral - TERM', (0, numbers_helper_1.formatNumbers)(collateralTerm)],
80
+ ['Available to borrow', (0, numbers_helper_1.formatNumbers)(new decimal_js_1.default(collateralRevolver).sub(loanBalances[loan_types_enum_1.ELoanTypes.REVOLVER]).toNumber())],
81
+ ],
82
+ };
83
+ }
84
+ async getComplianceItemsTable(borrowerId) {
85
+ const complianceBorrower = await BorrowerCompliance_model_1.BorrowerCompliance
86
+ .findOne({ borrower: borrowerId })
87
+ .populate('items.item')
88
+ .lean();
89
+ if (!complianceBorrower) {
90
+ return [];
91
+ }
92
+ const outstandingItems = [];
93
+ const newItems = [];
94
+ complianceBorrower.items.map((item) => {
95
+ item.instances.forEach((i) => {
96
+ if (i.status === ComplianceItem_model_1.EComplianceItemStatus.NEW) {
97
+ newItems.push([
98
+ `${item.item.name} (${(0, dayjs_1.default)(i.nextDate).format('MMM.D, YYYY')})`,
99
+ (0, dayjs_1.default)(i.nextDate).format(date_helper_1.defaultDateFormat),
100
+ ]);
101
+ }
102
+ else if (i.status === ComplianceItem_model_1.EComplianceItemStatus.REJECTED) {
103
+ outstandingItems.push([
104
+ `${item.item.name} (${(0, dayjs_1.default)(i.nextDate).format('MMM.D, YYYY')})`,
105
+ (0, dayjs_1.default)().diff(i.nextDate, 'day'),
106
+ ]);
107
+ }
108
+ });
109
+ });
110
+ return [...outstandingItems, ...newItems];
111
+ }
112
+ async getTop5SKUsData(borrowerId) {
113
+ const lastBBC = await (0, bbcDates_db_1.getLatestSignedBBCDateDoc)(borrowerId);
114
+ if (lastBBC) {
115
+ const bbcGroups = await (0, bbcSheets_db_1.getBBCSheetsByTypeGroupedByBBC)([lastBBC._id.toString()], collaterals_enum_1.ECollaterals.INVENTORY);
116
+ const sheetIds = [];
117
+ bbcGroups.forEach((bbcGroup) => {
118
+ bbcGroup.sheets.forEach((sheet) => {
119
+ sheetIds.push(sheet._id.toString());
120
+ });
121
+ });
122
+ return await (0, inventories_1.getInventoryItemsSKUAndValue)(sheetIds);
123
+ }
124
+ return [];
125
+ }
126
+ async getTop5SKUs(borrowerId) {
127
+ const lastBBC = await (0, bbcDates_db_1.getLatestSignedBBCDateDoc)(borrowerId);
128
+ if (!lastBBC) {
129
+ return [['no signed BBC', '']];
130
+ }
131
+ const SKUs = await this.getTop5SKUsData(borrowerId);
132
+ if (SKUs.length === 0) {
133
+ return [['MANUALLY ENTERED', '']];
134
+ }
135
+ return SKUs.slice(0, 5).map((SKU) => [SKU._id, (0, numbers_helper_1.formatNumbers)(SKU.totalAmount)]);
136
+ }
137
+ async getInventoryTurn(borrowerId) {
138
+ const startPeriod = (0, dayjs_1.default)().utcOffset(0).startOf('day').subtract(150, 'day').toDate().toISOString();
139
+ const endPeriod = (0, dayjs_1.default)().utcOffset(0).endOf('day').toDate().toISOString();
140
+ const allSkuValues = await this.inventoryService.getInventoryTurn(borrowerId, startPeriod, endPeriod);
141
+ const values = allSkuValues.tableByUnit.length > 0
142
+ ? allSkuValues.tableByUnit.sort((a, b) => a.current < b.current ? 1 : -1).slice(0, 5)
143
+ : [];
144
+ return values.map((value) => [value.sku, (0, numbers_helper_1.formatNumbers)(value.current)]);
145
+ }
146
+ async getTop5CustomersConcentrationData(borrowerId) {
147
+ const bbc = await (0, bbcDates_db_1.getBBCDatesByBorrower)(borrowerId, -1);
148
+ if (bbc.length > 0) {
149
+ const lastBBC = bbc[0];
150
+ const bbcGroups = await (0, bbcSheets_db_1.getBBCSheetsByTypeGroupedByBBC)([lastBBC._id.toString()], collaterals_enum_1.ECollaterals.RECEIVABLE);
151
+ const sheetIds = [];
152
+ bbcGroups.forEach((bbcGroup) => {
153
+ bbcGroup.sheets.forEach((sheet) => {
154
+ sheetIds.push(sheet._id.toString());
155
+ });
156
+ });
157
+ return await (0, receivables_db_1.getReceivableItemsCustomerAndValue)(sheetIds);
158
+ }
159
+ return [];
160
+ }
161
+ async getTop5CustomersConcentration(borrowerId) {
162
+ const bbc = await (0, bbcDates_db_1.getBBCDatesByBorrower)(borrowerId, -1);
163
+ if (!bbc) {
164
+ return [['no BBC', '']];
165
+ }
166
+ const customers = await this.getTop5CustomersConcentrationData(borrowerId);
167
+ if (customers.length === 0) {
168
+ return [['MANUALLY ENTERED', '']];
169
+ }
170
+ const totalAmount = customers.reduce((acc, customer) => new decimal_js_1.default(acc).add(customer.totalAmount).toNumber(), 0);
171
+ return customers
172
+ .slice(0, 5)
173
+ .map((customer) => {
174
+ return [customer._id, `${(0, numbers_helper_1.formatNumbers)(new decimal_js_1.default(customer.totalAmount).div(totalAmount).mul(100).toDP(2).toNumber())}%`];
175
+ });
176
+ }
177
+ async getAgedCustomers(borrowerId) {
178
+ const lastSignedBBC = await (0, bbcDates_db_1.getLatestSignedBBCDateDoc)(borrowerId);
179
+ if (lastSignedBBC) {
180
+ const { customerItems } = await this.availabilityService.getAvailabilityItemsWithFilter(lastSignedBBC._id.toString(), 'crossAgeDeduction');
181
+ return customerItems
182
+ .sort((a, b) => a.customerAmount < b.customerAmount ? 1 : -1)
183
+ .map((c) => [c.customerTitle, (0, numbers_helper_1.formatNumbers)(c.customerAmount)]);
184
+ }
185
+ return [['no BBC', '']];
186
+ }
187
+ async getLast5TransactionsTable(borrowerId) {
188
+ const products = await this.loanChargesService.getLoanProducts(borrowerId);
189
+ const startDate = (0, dayjs_1.default)().utcOffset(0).subtract(5, 'day').startOf('day').toDate();
190
+ const transactions = await LoanTransaction_model_1.LoanTransaction.aggregate([
191
+ {
192
+ '$match': {
193
+ 'productId': { '$in': products.map((p) => p._id) },
194
+ 'date': { $gte: startDate },
195
+ },
196
+ }, {
197
+ '$sort': {
198
+ 'date': -1,
199
+ },
200
+ }, {
201
+ '$limit': 5,
202
+ },
203
+ ]);
204
+ return transactions.map((t) => {
205
+ return [
206
+ (0, dayjs_1.default)(t.date).format(date_helper_1.defaultDateFormat),
207
+ t.reference,
208
+ (0, numbers_helper_1.formatNumbers)(t.amount),
209
+ ];
210
+ }, []);
211
+ }
212
+ async getChartData(borrowerId) {
213
+ const products = await this.loanChargesService.getLoanProducts(borrowerId);
214
+ const revolverProduct = products.find((product) => product.type === loan_types_enum_1.ELoanTypes.REVOLVER);
215
+ const chartData = [];
216
+ if (revolverProduct) {
217
+ const lastSignedBBC = await (0, bbcDates_db_1.getLatestSignedBBCDateDoc)(borrowerId);
218
+ if (lastSignedBBC) {
219
+ const periodEnd = lastSignedBBC.bbcDate;
220
+ const periodStart = (0, dayjs_1.default)(lastSignedBBC.bbcDate).utcOffset(0).subtract(6, 'month').toDate();
221
+ const BBCs = await (0, bbcDates_db_1.getBBCDatesForPeriod)(borrowerId, periodStart, periodEnd);
222
+ await Promise.all(BBCs.map(async (bbc) => {
223
+ if (bbc) {
224
+ const lastTransaction = await this.loanTransactionsService.getLastTransactionForDate(revolverProduct._id.toString(), (0, dayjs_1.default)(bbc.bbcDate).utcOffset(0).endOf('day').toDate());
225
+ const allProductsData = await this.reportsService.generateBankPortfolioSummary([borrowerId], bbc.bbcDate, {
226
+ useSignedBBC: false,
227
+ useStoredBalance: false,
228
+ });
229
+ const revolverData = allProductsData.find((p) => p.productType === loan_types_enum_1.ELoanTypes.REVOLVER);
230
+ chartData.push({
231
+ bbc: (0, date_helper_1.formatDate)(bbc.bbcDate),
232
+ revolverCollateralTotal: revolverData ? revolverData.totalCollateral : 0,
233
+ revolverLoanBalance: lastTransaction ? lastTransaction.balance : 0,
234
+ });
235
+ }
236
+ }));
237
+ }
238
+ }
239
+ return {
240
+ data: chartData.sort((a, b) => new Date(a.bbc).valueOf() - new Date(b.bbc).valueOf()),
241
+ series: [
242
+ {
243
+ type: 'bar',
244
+ xKey: 'bbc',
245
+ yKey: 'revolverCollateralTotal',
246
+ yName: 'Revolver Collateral Total',
247
+ },
248
+ {
249
+ type: 'bar',
250
+ xKey: 'bbc',
251
+ yKey: 'revolverLoanBalance',
252
+ yName: 'Revolver Loan Balance',
253
+ },
254
+ ],
255
+ };
256
+ }
257
+ async updateBorrowerSummary(borrowerId) {
258
+ const newSummary = {
259
+ borrowerId: new mongoose_1.default.Types.ObjectId(borrowerId),
260
+ lastCalculatedAt: new Date(),
261
+ tableData: {
262
+ [BorrowerSummary_model_1.ETableNames.HIGH_LEVEL]: await this.getHighLevelTable(borrowerId, false),
263
+ [BorrowerSummary_model_1.ETableNames.HIGH_LEVEL_APPROVED]: await this.getHighLevelTable(borrowerId, true),
264
+ [BorrowerSummary_model_1.ETableNames.COMPLIANCE_ITEMS]: {
265
+ title: 'Compliance Items',
266
+ data: await this.getComplianceItemsTable(borrowerId),
267
+ },
268
+ [BorrowerSummary_model_1.ETableNames.TOP_5_SKUS]: {
269
+ title: 'Top 5 SKUs',
270
+ data: await this.getTop5SKUs(borrowerId),
271
+ },
272
+ [BorrowerSummary_model_1.ETableNames.LAST_5_DAYS_TRANSACTIONS]: {
273
+ title: 'Last 5 days transactions',
274
+ data: await this.getLast5TransactionsTable(borrowerId),
275
+ },
276
+ [BorrowerSummary_model_1.ETableNames.INVENTORY_TURN]: {
277
+ title: 'Inventory turn (last 90 days)',
278
+ data: await this.getInventoryTurn(borrowerId),
279
+ },
280
+ [BorrowerSummary_model_1.ETableNames.TOP_5_CUSTOMERS_CONCENTRATION]: {
281
+ title: 'Top 5 Customers Concentration',
282
+ data: await this.getTop5CustomersConcentration(borrowerId),
283
+ },
284
+ [BorrowerSummary_model_1.ETableNames.AGED_OUT_CUSTOMERS]: {
285
+ title: 'Aged out customers',
286
+ data: await this.getAgedCustomers(borrowerId),
287
+ },
288
+ },
289
+ chartData: {
290
+ [BorrowerSummary_model_1.EChartNames.LAST_6_MONTH]: await this.getChartData(borrowerId),
291
+ },
292
+ };
293
+ await BorrowerSummary_model_1.BorrowerSummary.findOneAndUpdate({ borrowerId }, newSummary, { upsert: true });
294
+ console.log(`calculation finished - ${borrowerId}`);
295
+ }
296
+ async recalculateAllActive() {
297
+ const borrowers = await this.borrowerService.getActiveBorrowers();
298
+ let i = 1;
299
+ for (const borrower of borrowers) {
300
+ try {
301
+ await this.updateBorrowerSummary(borrower._id.toString());
302
+ }
303
+ catch (e) {
304
+ console.error(e);
305
+ }
306
+ i = i + 1;
307
+ }
308
+ }
309
+ }
310
+ exports.BorrowerSummaryService = BorrowerSummaryService;