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,239 @@
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.InventoryService = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const dayjs_1 = __importDefault(require("dayjs"));
9
+ const InventoryItem_model_1 = require("../models/InventoryItem.model");
10
+ const collaterals_enum_1 = require("../enums/collaterals.enum");
11
+ const bbcSheets_db_1 = require("../db/bbcSheets.db");
12
+ const bbcDates_db_1 = require("../db/bbcDates.db");
13
+ const collaterals_db_1 = require("../db/collaterals.db");
14
+ const numbers_helper_1 = require("../helpers/numbers.helper");
15
+ const unit_cost_difference_1 = require("../queries/inventory/unit-cost-difference");
16
+ const turn_1 = require("../queries/inventory/turn");
17
+ const inconsistent_data_1 = require("../queries/inventory/inconsistent-data");
18
+ const movement_1 = require("../queries/inventory/movement");
19
+ const extension_1 = require("../queries/inventory/extension");
20
+ const CustomerGroup_model_1 = require("../models/CustomerGroup.model");
21
+ const invoice_difference_1 = require("../queries/inventory/invoice-difference");
22
+ const inventories_1 = require("../db/inventories");
23
+ const payable_accounts_1 = require("../db/payable-accounts");
24
+ const groups_1 = require("../db/groups");
25
+ class InventoryService {
26
+ collateralsService;
27
+ constructor(collateralsService) {
28
+ this.collateralsService = collateralsService;
29
+ }
30
+ async updateInventorySKU({ bbcDate, borrowerId, items }) {
31
+ const skuDates = await (0, inventories_1.getAllTimeOldestSKUDateNew)(borrowerId, bbcDate);
32
+ return items.map((i) => {
33
+ const previousSKUDate = skuDates.find((d) => i.sku.toString().trim() === d._id);
34
+ if (!previousSKUDate) {
35
+ return { ...i, skuDate: bbcDate };
36
+ }
37
+ const isPreviousDateGreaterThanSubmittedDate = new Date(previousSKUDate.oldestDate).getTime() > new Date(bbcDate).getTime();
38
+ if (isPreviousDateGreaterThanSubmittedDate) {
39
+ return { ...i, skuDate: bbcDate };
40
+ }
41
+ return { ...i, skuDate: previousSKUDate.oldestDate };
42
+ });
43
+ }
44
+ async getBenford(borrowerId) {
45
+ const sheetIds = await (0, bbcSheets_db_1.getUniqueDates)(borrowerId, 3, collaterals_enum_1.ECollaterals.INVENTORY);
46
+ const inventory = await (0, inventories_1.getLastDigitFromAllValues)(sheetIds);
47
+ return this.collateralsService.getCollateralsBenford(inventory);
48
+ }
49
+ async getInventoryAgingPlot(borrowerId, rangeStart, rangeEnd) {
50
+ const latestFiveNew = await (0, bbcSheets_db_1.getUniqueDatesForPeriod)(borrowerId, collaterals_enum_1.ECollaterals.INVENTORY, new Date(rangeStart), new Date(rangeEnd));
51
+ const aggregationPromises = latestFiveNew.map((bbcGroup) => (0, inventories_1.aggregateSKUDateAgingPlot)(bbcGroup.ids));
52
+ const aggregations = await Promise.all(aggregationPromises);
53
+ return [
54
+ { name: '0-30', data: aggregations.map((i) => i['0-30']) },
55
+ { name: '30-60', data: aggregations.map((i) => i['30-60']) },
56
+ { name: '60-90', data: aggregations.map((i) => i['60-90']) },
57
+ { name: '90+', data: aggregations.map((i) => i['90+']) },
58
+ ];
59
+ }
60
+ async getAllSkuValues(borrowerId, startDate, endDate) {
61
+ const bbcDates = await (0, bbcDates_db_1.getBBCDatesForPeriod)(borrowerId, new Date(startDate), new Date(endDate));
62
+ const sheetGroups = await (0, bbcSheets_db_1.getBBCSheetsByTypeGroupedByBBC)(bbcDates.map((bbcDate) => bbcDate._id.toString()), collaterals_enum_1.ECollaterals.INVENTORY);
63
+ const aggregationPromises = sheetGroups.map((sheetGroup) => (0, inventories_1.aggregateAllValuesForBbc)(sheetGroup.sheets.map((sheet) => new mongoose_1.default.Types.ObjectId(String(sheet._id)))));
64
+ const aggregations = await Promise.all(aggregationPromises);
65
+ const chartData = [];
66
+ function toEntries(a) {
67
+ return a.map((value, index) => [index, value]);
68
+ }
69
+ const allSheets = await (0, collaterals_db_1.getBBCSheetsForBorrowerAndType)(borrowerId, collaterals_enum_1.ECollaterals.INVENTORY);
70
+ const allSheetsIds = allSheets.map((sheet) => sheet._id);
71
+ const uniqSkus = [...new Set(aggregations.reduce((acc, skuGroup) => {
72
+ return [...acc, ...skuGroup.map((skuObject) => skuObject.sku)];
73
+ }, []))];
74
+ const skusWithDates = uniqSkus.reduce((acc, sku) => ({ ...acc, [sku]: null }), {});
75
+ await Promise.all(uniqSkus.map(async (sku) => {
76
+ const firstSeen = (await this.getFirstSeenNew(allSheetsIds.map((id) => new mongoose_1.default.Types.ObjectId(String(id))), sku)).pop();
77
+ skusWithDates[sku] = firstSeen.bbcDate;
78
+ }));
79
+ for (const [bbcIndex, item] of toEntries(aggregations)) {
80
+ chartData.push({
81
+ name: (0, dayjs_1.default)(bbcDates[bbcIndex]?.bbcDate).format('YYYY/MM/DD'),
82
+ data: [],
83
+ });
84
+ for (const [itemIndex, skuAndValue] of toEntries(item)) {
85
+ chartData[bbcIndex].data.push([
86
+ itemIndex + 1,
87
+ skuAndValue.value,
88
+ null,
89
+ {
90
+ sku: skuAndValue.sku,
91
+ skuDescription: skuAndValue.skuDescription,
92
+ category: skuAndValue.category,
93
+ firstSeen: (0, dayjs_1.default)(skusWithDates[skuAndValue.sku]).format('YYYY/MM/DD'),
94
+ },
95
+ ]);
96
+ }
97
+ }
98
+ return chartData;
99
+ }
100
+ async getFirstSeenNew(sheetIds, sku) {
101
+ return InventoryItem_model_1.InventoryItemModel.aggregate([
102
+ {
103
+ $match: {
104
+ 'bbcSheetId': { $in: sheetIds },
105
+ 'sku': sku,
106
+ },
107
+ },
108
+ {
109
+ $lookup: {
110
+ from: 'bbcsheets',
111
+ localField: 'bbcSheetId',
112
+ foreignField: '_id',
113
+ as: 'bbcSheet',
114
+ },
115
+ },
116
+ {
117
+ $unwind: {
118
+ path: '$bbcSheet',
119
+ },
120
+ },
121
+ {
122
+ $lookup: {
123
+ from: 'bbcdates',
124
+ localField: 'bbcSheet.bbcDateId',
125
+ foreignField: '_id',
126
+ as: 'bbc',
127
+ },
128
+ },
129
+ {
130
+ $unwind: {
131
+ path: '$bbc',
132
+ },
133
+ },
134
+ {
135
+ $sort: {
136
+ 'bbc.bbcDate': 1,
137
+ },
138
+ },
139
+ {
140
+ $limit: 1,
141
+ },
142
+ {
143
+ $project: {
144
+ '_id': 0,
145
+ 'bbcDate': '$bbc.bbcDate',
146
+ },
147
+ },
148
+ ]);
149
+ }
150
+ async getInconsistentData(bbcDateId) {
151
+ return (0, inconsistent_data_1.getInconsistentData)({ bbcDateId: new mongoose_1.default.Types.ObjectId(bbcDateId) });
152
+ }
153
+ async getUnitCostDifference(borrowerId) {
154
+ return (0, unit_cost_difference_1.getUnitCostDifference)({ borrowerId: new mongoose_1.default.Types.ObjectId(borrowerId) });
155
+ }
156
+ async getExposures(borrowerId, useCustomerGroup) {
157
+ const latestThree = await (0, bbcSheets_db_1.getUniqueDates)(borrowerId, 3, collaterals_enum_1.ECollaterals.INVENTORY);
158
+ const aggregationPromises = latestThree.map((bbcDate) => useCustomerGroup
159
+ ? (0, inventories_1.aggregateBbcExposuresGrouped)(bbcDate.ids)
160
+ : (0, inventories_1.aggregateBbcExposures)(bbcDate.ids));
161
+ const aggregations = await Promise.all(aggregationPromises);
162
+ const allCategoryNames = [];
163
+ const formattedSeriesData = [
164
+ { name: latestThree[0]?.bbcDate, data: [] },
165
+ { name: latestThree[1]?.bbcDate, data: [] },
166
+ { name: latestThree[2]?.bbcDate, data: [] },
167
+ ];
168
+ aggregations.forEach((setOfBbcExposures) => {
169
+ setOfBbcExposures.topItemsForBbc.map((topItem) => {
170
+ if (!allCategoryNames.includes(topItem.name)) {
171
+ allCategoryNames.push(topItem.name);
172
+ }
173
+ });
174
+ });
175
+ aggregations.forEach((setOfBbcExposures, i) => {
176
+ allCategoryNames.map((categoryName) => {
177
+ const foundValue = setOfBbcExposures.topItemsForBbc.find((topItem) => topItem.name === categoryName);
178
+ const convertedValue = foundValue ? (0, numbers_helper_1.convertToPercentage)(foundValue.totalItemValue, setOfBbcExposures.inventoryTotal) : 0;
179
+ formattedSeriesData[i].data.push(convertedValue);
180
+ });
181
+ });
182
+ return { allCategoryNames, formattedSeriesData };
183
+ }
184
+ async getInventoryTurn(borrowerId, startDate, endDate) {
185
+ return (0, turn_1.getInventoryTurn)({
186
+ borrowerId: new mongoose_1.default.Types.ObjectId(borrowerId),
187
+ startDate: new Date(startDate),
188
+ endDate: new Date(endDate),
189
+ });
190
+ }
191
+ async getInvoiceMovement(borrowerId, bbcDateId) {
192
+ return (0, movement_1.getInvoiceMovement)({
193
+ borrowerId: new mongoose_1.default.Types.ObjectId(borrowerId),
194
+ bbcDateId: new mongoose_1.default.Types.ObjectId(bbcDateId),
195
+ });
196
+ }
197
+ async getContras(borrowerId, startDate, endDate) {
198
+ const bbcDates = await (0, bbcDates_db_1.getBBCDatesByBorrower)(borrowerId);
199
+ const bbcIds = bbcDates.map((bbc) => bbc._id.toString());
200
+ const bbcSheets = await (0, bbcSheets_db_1.getBBCSheetsByType)(bbcIds, collaterals_enum_1.ECollaterals.ACCOUNT_PAYABLE);
201
+ const aps = await (0, payable_accounts_1.getBBCAPByAPPeriod)(bbcSheets.map((bbcSheet) => new mongoose_1.default.Types.ObjectId(String(bbcSheet._id))), startDate, endDate);
202
+ const customerAPGroups = await (0, groups_1.getAPCustomerGroups)(borrowerId);
203
+ const contras = [];
204
+ await Promise.all(aps.map(async (ap) => {
205
+ const contra = {
206
+ invoiceDate: ap.apDate,
207
+ customer: ap.customerName,
208
+ invoiceNumber: ap.poNumber,
209
+ amount: ap.amount,
210
+ newAPName: ap.customerName,
211
+ contra: 0,
212
+ };
213
+ const customerAPGroup = customerAPGroups.find((group) => group.items === ap.customerName);
214
+ if (customerAPGroup) {
215
+ const mappedGroup = await (0, groups_1.getMappedGroups)({ group2: customerAPGroup._id.toString() });
216
+ if (mappedGroup && mappedGroup.length) {
217
+ const customerGroup = await CustomerGroup_model_1.CustomerGroupModel.findById(mappedGroup[0].group1);
218
+ if (customerGroup) {
219
+ contra.newAPName = customerAPGroup.groupName;
220
+ contra.contra = 1;
221
+ }
222
+ }
223
+ }
224
+ contras.push(contra);
225
+ }));
226
+ return contras.sort((a, b) => new Date(a.invoiceDate).valueOf() - new Date(b.invoiceDate).valueOf());
227
+ }
228
+ async getExtension(borrowerId, startDate, endDate) {
229
+ return (0, extension_1.getExtension)({
230
+ borrowerId: new mongoose_1.default.Types.ObjectId(borrowerId),
231
+ startDate: new Date(startDate),
232
+ endDate: new Date(endDate),
233
+ });
234
+ }
235
+ async compareInventories(bbcDateId) {
236
+ return await (0, invoice_difference_1.getInventoryDifference)({ bbcDateId: new mongoose_1.default.Types.ObjectId(bbcDateId) });
237
+ }
238
+ }
239
+ exports.InventoryService = InventoryService;
@@ -0,0 +1,276 @@
1
+ import mongoose from 'mongoose';
2
+ import dayjs from 'dayjs';
3
+
4
+ import { InventoryItemModel, IInventoryItem } from '../models/InventoryItem.model';
5
+ import { IUploadedItems } from '../interfaces/collaterals.interface';
6
+ import { ECollaterals } from '../enums/collaterals.enum';
7
+ import {
8
+ getBBCSheetsByType,
9
+ getBBCSheetsByTypeGroupedByBBC,
10
+ getUniqueDates,
11
+ getUniqueDatesForPeriod,
12
+ } from '../db/bbcSheets.db';
13
+ import { getBBCDatesByBorrower, getBBCDatesForPeriod } from '../db/bbcDates.db';
14
+ import { getBBCSheetsForBorrowerAndType } from '../db/collaterals.db';
15
+ import { convertToPercentage } from '../helpers/numbers.helper';
16
+ import { getUnitCostDifference } from '../queries/inventory/unit-cost-difference';
17
+ import { getInventoryTurn } from '../queries/inventory/turn';
18
+ import { getInconsistentData } from '../queries/inventory/inconsistent-data';
19
+ import { getInvoiceMovement } from '../queries/inventory/movement';
20
+ import { getExtension } from '../queries/inventory/extension';
21
+ import { CustomerGroupModel } from '../models/CustomerGroup.model';
22
+ import { getInventoryDifference } from '../queries/inventory/invoice-difference';
23
+
24
+ import {
25
+ aggregateAllValuesForBbc,
26
+ aggregateBbcExposures,
27
+ aggregateBbcExposuresGrouped,
28
+ aggregateSKUDateAgingPlot,
29
+ getAllTimeOldestSKUDateNew,
30
+ getLastDigitFromAllValues,
31
+ } from '../db/inventories';
32
+ import { getBBCAPByAPPeriod } from '../db/payable-accounts';
33
+ import { getAPCustomerGroups, getMappedGroups } from '../db/groups';
34
+ import { CollateralsService } from './collaterals.service';
35
+
36
+ export class InventoryService {
37
+
38
+ constructor(
39
+ private readonly collateralsService: CollateralsService,
40
+ ) {
41
+ }
42
+
43
+ async updateInventorySKU({ bbcDate, borrowerId, items }: IUploadedItems<IInventoryItem>) {
44
+ const skuDates = await getAllTimeOldestSKUDateNew(borrowerId, bbcDate);
45
+ return items.map((i) => {
46
+ const previousSKUDate = skuDates.find((d) => i.sku.toString().trim() === d._id);
47
+ if (!previousSKUDate) {
48
+ return { ...i, skuDate: bbcDate };
49
+ }
50
+ const isPreviousDateGreaterThanSubmittedDate = new Date(previousSKUDate.oldestDate).getTime() > new Date(bbcDate).getTime();
51
+ if (isPreviousDateGreaterThanSubmittedDate) {
52
+ return { ...i, skuDate: bbcDate };
53
+ }
54
+ return { ...i, skuDate: previousSKUDate.oldestDate };
55
+ });
56
+ }
57
+
58
+ async getBenford(borrowerId: string) {
59
+ const sheetIds = await getUniqueDates(borrowerId, 3, ECollaterals.INVENTORY);
60
+ const inventory = await getLastDigitFromAllValues(sheetIds);
61
+ return this.collateralsService.getCollateralsBenford(inventory);
62
+ }
63
+
64
+ async getInventoryAgingPlot(borrowerId: string, rangeStart, rangeEnd) {
65
+ const latestFiveNew = await getUniqueDatesForPeriod(borrowerId, ECollaterals.INVENTORY, new Date(rangeStart), new Date(rangeEnd));
66
+ const aggregationPromises = latestFiveNew.map((bbcGroup) =>
67
+ aggregateSKUDateAgingPlot(bbcGroup.ids),
68
+ );
69
+
70
+ const aggregations = await Promise.all(aggregationPromises);
71
+ return [
72
+ { name: '0-30', data: aggregations.map((i) => i['0-30']) },
73
+ { name: '30-60', data: aggregations.map((i) => i['30-60']) },
74
+ { name: '60-90', data: aggregations.map((i) => i['60-90']) },
75
+ { name: '90+', data: aggregations.map((i) => i['90+']) },
76
+ ];
77
+ }
78
+
79
+ async getAllSkuValues(borrowerId: string, startDate: string, endDate: string) {
80
+ const bbcDates = await getBBCDatesForPeriod(borrowerId, new Date(startDate), new Date(endDate));
81
+ const sheetGroups = await getBBCSheetsByTypeGroupedByBBC(bbcDates.map((bbcDate) => bbcDate._id.toString()), ECollaterals.INVENTORY);
82
+
83
+ const aggregationPromises = sheetGroups.map((sheetGroup) => aggregateAllValuesForBbc(sheetGroup.sheets.map((sheet) => new mongoose.Types.ObjectId(String(sheet._id)))));
84
+ const aggregations = await Promise.all(aggregationPromises);
85
+ const chartData = [];
86
+
87
+ function toEntries<T>(a: T[]) {
88
+ return a.map((value, index) => [index, value] as const);
89
+ }
90
+
91
+ const allSheets = await getBBCSheetsForBorrowerAndType(borrowerId, ECollaterals.INVENTORY);
92
+ const allSheetsIds = allSheets.map((sheet) => sheet._id);
93
+
94
+ const uniqSkus = [...new Set(aggregations.reduce((acc: string[], skuGroup) => {
95
+ return [...acc, ...skuGroup.map((skuObject) => skuObject.sku)];
96
+ }, []))];
97
+ const skusWithDates = uniqSkus.reduce((acc, sku) => ({ ...acc, [sku]: null }), {});
98
+ await Promise.all(uniqSkus.map(async (sku) => {
99
+ const firstSeen = (await this.getFirstSeenNew(allSheetsIds.map((id) => new mongoose.Types.ObjectId(String(id))), sku)).pop();
100
+ skusWithDates[sku] = firstSeen.bbcDate;
101
+ }));
102
+
103
+ for (const [bbcIndex, item] of toEntries(aggregations)) {
104
+ chartData.push({
105
+ name: dayjs(bbcDates[bbcIndex]?.bbcDate).format('YYYY/MM/DD'),
106
+ data: [],
107
+ });
108
+
109
+ for (const [itemIndex, skuAndValue] of toEntries(item)) {
110
+ chartData[bbcIndex].data.push([
111
+ itemIndex + 1,
112
+ skuAndValue.value,
113
+ null,
114
+ {
115
+ sku: skuAndValue.sku,
116
+ skuDescription: skuAndValue.skuDescription,
117
+ category: skuAndValue.category,
118
+ firstSeen: dayjs(skusWithDates[skuAndValue.sku]).format('YYYY/MM/DD'),
119
+ },
120
+ ]);
121
+ }
122
+ }
123
+ return chartData;
124
+ }
125
+
126
+ async getFirstSeenNew(sheetIds: mongoose.Types.ObjectId[], sku: string) {
127
+ return InventoryItemModel.aggregate<{ bbcDate: Date }>([
128
+ {
129
+ $match: {
130
+ 'bbcSheetId': { $in: sheetIds },
131
+ 'sku': sku,
132
+ },
133
+ },
134
+ {
135
+ $lookup: {
136
+ from: 'bbcsheets',
137
+ localField: 'bbcSheetId',
138
+ foreignField: '_id',
139
+ as: 'bbcSheet',
140
+ },
141
+ },
142
+ {
143
+ $unwind: {
144
+ path: '$bbcSheet',
145
+ },
146
+ },
147
+ {
148
+ $lookup: {
149
+ from: 'bbcdates',
150
+ localField: 'bbcSheet.bbcDateId',
151
+ foreignField: '_id',
152
+ as: 'bbc',
153
+ },
154
+ },
155
+ {
156
+ $unwind: {
157
+ path: '$bbc',
158
+ },
159
+ },
160
+ {
161
+ $sort: {
162
+ 'bbc.bbcDate': 1,
163
+ },
164
+ },
165
+ {
166
+ $limit: 1,
167
+ },
168
+ {
169
+ $project: {
170
+ '_id': 0,
171
+ 'bbcDate': '$bbc.bbcDate',
172
+ },
173
+ },
174
+ ]);
175
+ }
176
+
177
+ async getInconsistentData(bbcDateId: string) {
178
+ return getInconsistentData({ bbcDateId: new mongoose.Types.ObjectId(bbcDateId) });
179
+ }
180
+
181
+ async getUnitCostDifference(borrowerId: string) {
182
+ return getUnitCostDifference({ borrowerId: new mongoose.Types.ObjectId(borrowerId) });
183
+ }
184
+
185
+ async getExposures(borrowerId: string, useCustomerGroup: boolean) {
186
+ const latestThree = await getUniqueDates(borrowerId, 3, ECollaterals.INVENTORY);
187
+ const aggregationPromises = latestThree.map((bbcDate) =>
188
+ useCustomerGroup
189
+ ? aggregateBbcExposuresGrouped(bbcDate.ids)
190
+ : aggregateBbcExposures(bbcDate.ids),
191
+ );
192
+
193
+ const aggregations = await Promise.all(aggregationPromises);
194
+
195
+ const allCategoryNames = [];
196
+ const formattedSeriesData = [
197
+ { name: latestThree[0]?.bbcDate, data: [] },
198
+ { name: latestThree[1]?.bbcDate, data: [] },
199
+ { name: latestThree[2]?.bbcDate, data: [] },
200
+ ];
201
+ aggregations.forEach((setOfBbcExposures) => {
202
+ setOfBbcExposures.topItemsForBbc.map((topItem) => {
203
+ if (!allCategoryNames.includes(topItem.name)) {
204
+ allCategoryNames.push(topItem.name);
205
+ }
206
+ });
207
+ });
208
+ aggregations.forEach((setOfBbcExposures, i) => {
209
+ allCategoryNames.map((categoryName) => {
210
+ const foundValue = setOfBbcExposures.topItemsForBbc.find((topItem) => topItem.name === categoryName);
211
+ const convertedValue = foundValue ? convertToPercentage(foundValue.totalItemValue, setOfBbcExposures.inventoryTotal) : 0;
212
+ formattedSeriesData[i].data.push(convertedValue);
213
+ });
214
+ });
215
+ return { allCategoryNames, formattedSeriesData };
216
+ }
217
+
218
+ async getInventoryTurn(borrowerId: string, startDate: string, endDate: string) {
219
+ return getInventoryTurn({
220
+ borrowerId: new mongoose.Types.ObjectId(borrowerId),
221
+ startDate: new Date(startDate),
222
+ endDate: new Date(endDate),
223
+ });
224
+ }
225
+
226
+ async getInvoiceMovement(borrowerId: string, bbcDateId: string) {
227
+ return getInvoiceMovement({
228
+ borrowerId: new mongoose.Types.ObjectId(borrowerId),
229
+ bbcDateId: new mongoose.Types.ObjectId(bbcDateId),
230
+ });
231
+ }
232
+
233
+ async getContras(borrowerId: string, startDate: string, endDate: string) {
234
+ const bbcDates = await getBBCDatesByBorrower(borrowerId);
235
+ const bbcIds = bbcDates.map((bbc) => bbc._id.toString());
236
+ const bbcSheets = await getBBCSheetsByType(bbcIds, ECollaterals.ACCOUNT_PAYABLE);
237
+ const aps = await getBBCAPByAPPeriod(bbcSheets.map((bbcSheet) => new mongoose.Types.ObjectId(String(bbcSheet._id))), startDate, endDate);
238
+ const customerAPGroups = await getAPCustomerGroups(borrowerId);
239
+ const contras = [];
240
+ await Promise.all(aps.map(async (ap) => {
241
+ const contra = {
242
+ invoiceDate: ap.apDate,
243
+ customer: ap.customerName,
244
+ invoiceNumber: ap.poNumber,
245
+ amount: ap.amount,
246
+ newAPName: ap.customerName,
247
+ contra: 0,
248
+ };
249
+ const customerAPGroup = customerAPGroups.find((group) => group.items === ap.customerName);
250
+ if (customerAPGroup) {
251
+ const mappedGroup = await getMappedGroups({ group2: customerAPGroup._id.toString() });
252
+ if (mappedGroup && mappedGroup.length) {
253
+ const customerGroup = await CustomerGroupModel.findById(mappedGroup[0].group1);
254
+ if (customerGroup) {
255
+ contra.newAPName = customerAPGroup.groupName;
256
+ contra.contra = 1;
257
+ }
258
+ }
259
+ }
260
+ contras.push(contra);
261
+ }));
262
+ return contras.sort((a, b) => new Date(a.invoiceDate).valueOf() - new Date(b.invoiceDate).valueOf());
263
+ }
264
+
265
+ async getExtension(borrowerId: string, startDate: string, endDate: string) {
266
+ return getExtension({
267
+ borrowerId: new mongoose.Types.ObjectId(borrowerId),
268
+ startDate: new Date(startDate),
269
+ endDate: new Date(endDate),
270
+ });
271
+ }
272
+
273
+ async compareInventories(bbcDateId: string) {
274
+ return await getInventoryDifference({ bbcDateId: new mongoose.Types.ObjectId(bbcDateId) });
275
+ }
276
+ }
@@ -0,0 +1,83 @@
1
+ /// <reference types="mongoose/types/aggregate" />
2
+ /// <reference types="mongoose/types/callback" />
3
+ /// <reference types="mongoose/types/collection" />
4
+ /// <reference types="mongoose/types/connection" />
5
+ /// <reference types="mongoose/types/cursor" />
6
+ /// <reference types="mongoose/types/document" />
7
+ /// <reference types="mongoose/types/error" />
8
+ /// <reference types="mongoose/types/expressions" />
9
+ /// <reference types="mongoose/types/helpers" />
10
+ /// <reference types="mongoose/types/middlewares" />
11
+ /// <reference types="mongoose/types/indexes" />
12
+ /// <reference types="mongoose/types/models" />
13
+ /// <reference types="mongoose/types/mongooseoptions" />
14
+ /// <reference types="mongoose/types/pipelinestage" />
15
+ /// <reference types="mongoose/types/populate" />
16
+ /// <reference types="mongoose/types/query" />
17
+ /// <reference types="mongoose/types/schemaoptions" />
18
+ /// <reference types="mongoose/types/schematypes" />
19
+ /// <reference types="mongoose/types/session" />
20
+ /// <reference types="mongoose/types/types" />
21
+ /// <reference types="mongoose/types/utility" />
22
+ /// <reference types="mongoose/types/validation" />
23
+ /// <reference types="mongoose/types/virtuals" />
24
+ /// <reference types="mongoose/types/inferschematype" />
25
+ import mongoose from 'mongoose';
26
+ import { IPaginatorOptions } from '../interfaces/collaterals.interface';
27
+ import { ELoanChargeType } from '../enums/loan-charge-type.enum';
28
+ import { ILoanProductDoc, ILoanProductView } from '../models/LoanProducts.model';
29
+ import { ILoanChargeView } from '../models/LoanCharges.model';
30
+ import { ILoanStatementTransactionDoc, ILoanStatementTransactionDocWithCharge } from '../models/LoanStatementTransaction.model';
31
+ import { BorrowerService } from './borrowers.service';
32
+ export declare class LoanChargesService {
33
+ private readonly borrowerService;
34
+ constructor(borrowerService: BorrowerService);
35
+ private validateCharge;
36
+ getProductByChargeId(chargeId: string): Promise<mongoose.FlattenMaps<ILoanProductDoc> & {
37
+ _id: mongoose.Types.ObjectId;
38
+ }>;
39
+ getBorrowersLoanProducts(borrowerId: string): Promise<(mongoose.FlattenMaps<ILoanProductDoc> & {
40
+ _id: mongoose.Types.ObjectId;
41
+ })[]>;
42
+ getAllLoanProducts(): Promise<ILoanProductDoc[]>;
43
+ getLoanProducts(borrowerId: string): Promise<ILoanProductView[]>;
44
+ getLoanProductsByIds(productIds: string[]): Promise<ILoanProductView[]>;
45
+ getLoanProductBalance(productId: string, forDate?: Date): Promise<{
46
+ balance: number;
47
+ floatedBalance: number;
48
+ }>;
49
+ getParticipationBalance(code: string, end: Date): Promise<number>;
50
+ getLoanProductById(productId: string): Promise<mongoose.FlattenMaps<ILoanProductDoc> & {
51
+ _id: mongoose.Types.ObjectId;
52
+ }>;
53
+ getLoanProductIdByCode(code: string): Promise<string>;
54
+ getLoanChargeIdByCode(code: string): Promise<string>;
55
+ saveLoanProducts(borrowerId: string, loanProducts: ILoanProductView[]): Promise<void>;
56
+ getLoanCharges(borrowerId: string): Promise<ILoanChargeView[]>;
57
+ getLoanChargeForProduct(productId: string): Promise<ILoanChargeView[]>;
58
+ validateLoanCharge(loanCharge: ILoanChargeView): boolean;
59
+ saveLoanCharges(borrowerId: string, loanCharges: ILoanChargeView[], quickCreate?: boolean): Promise<void>;
60
+ private getChargeIds;
61
+ getLoanStatementsForProduct(filter: {
62
+ productIds: string[];
63
+ start: Date;
64
+ end: Date;
65
+ }, paginatorOptions?: IPaginatorOptions, chargeType?: ELoanChargeType): Promise<ILoanStatementTransactionDoc[]>;
66
+ getLoanStatementsForIdsAndCharge(filter: {
67
+ productIds: string[];
68
+ transactionIds: string[];
69
+ start: Date;
70
+ end: Date;
71
+ }, paginatorOptions?: IPaginatorOptions, chargeType?: ELoanChargeType): Promise<ILoanStatementTransactionDoc[]>;
72
+ getLoanStatementsForForProductWithCharges(filter: {
73
+ productIds: string[];
74
+ start: Date;
75
+ end: Date;
76
+ }, paginatorOptions?: IPaginatorOptions): Promise<ILoanStatementTransactionDocWithCharge[]>;
77
+ getTotalLoanStatementsForProduct(filter: {
78
+ productIds: string[];
79
+ start: Date;
80
+ end: Date;
81
+ }): Promise<number>;
82
+ updatedChargeCodes(productId: string): Promise<void>;
83
+ }