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,481 @@
1
+ import mongoose from 'mongoose';
2
+ import dayjs from 'dayjs';
3
+
4
+ import { InventoryModel } from '../models/Inventory.model';
5
+ import { getOlderBBCDates } from './bbcDates.db';
6
+ import { getBBCSheetsByType } from './bbcSheets.db';
7
+ import { ECollaterals } from '../enums/collaterals.enum';
8
+ import { InventoryItemModel } from '../models/InventoryItem.model';
9
+ import { COLLATERALS_LOOKUP, getBBCSheetsForBorrowerAndType } from './collaterals.db';
10
+
11
+ export const getSKUUnitCostForAllDates = async (sheetsIds: mongoose.Types.ObjectId[]) => {
12
+ return InventoryItemModel.aggregate<{
13
+ _id: string;
14
+ currentCost: number;
15
+ minCost: { minCost: number, bbcDate: string };
16
+ qty: number;
17
+ }>([
18
+ {
19
+ $match: {
20
+ 'bbcSheetId': {
21
+ $in: sheetsIds
22
+ }
23
+ }
24
+ },
25
+ ...COLLATERALS_LOOKUP,
26
+ {
27
+ $sort: {
28
+ 'bbc.bbcDate': -1
29
+ }
30
+ },
31
+ {
32
+ $group: {
33
+ '_id': '$sku',
34
+ 'currentCost': {
35
+ $first: '$unitCost'
36
+ },
37
+ 'minCost': {
38
+ $min: {
39
+ 'minCost': '$unitCost',
40
+ 'bbcDate': '$bbc.bbcDate'
41
+ }
42
+ },
43
+ 'qty': {
44
+ $first: '$qty'
45
+ }
46
+ }
47
+ }
48
+ ]);
49
+ };
50
+
51
+ export const getInventoryItemsSKUAndValue = async (sheetIds: string[]) =>
52
+ await InventoryItemModel.aggregate<{
53
+ _id: string;
54
+ totalAmount: number;
55
+ }>([
56
+ {
57
+ $match: { bbcSheetId: { $in: sheetIds.map((sheetId) => new mongoose.Types.ObjectId(sheetId)) } },
58
+ },
59
+ {
60
+ $group: {
61
+ _id: '$sku',
62
+ totalAmount: {
63
+ $sum: '$value',
64
+ },
65
+ },
66
+ },
67
+ {
68
+ $sort: { totalAmount: -1 },
69
+ },
70
+ ]);
71
+
72
+ export const getInventoriesAndTheirQtyByBorrowerId = async (borrowerId: string, allBbcDates: { bbcDate: Date }[]) =>
73
+ await InventoryModel.aggregate<{ _id: string; qty: number }>([
74
+ {
75
+ $match: {
76
+ borrowerId,
77
+ bbcDate: {
78
+ $in: allBbcDates.map((i) => i.bbcDate)
79
+ }
80
+ }
81
+ },
82
+ { $unwind: '$items' },
83
+ {
84
+ $group: {
85
+ _id: '$bbcDate',
86
+ qty: { $sum: '$items.qty' },
87
+ },
88
+ },
89
+ {
90
+ $sort: {
91
+ _id: 1,
92
+ },
93
+ },
94
+ ]);
95
+
96
+ export const getMostRecentInventoryBBCDate = async (borrowerId: string) => {
97
+ const inventory = await InventoryModel.find({ borrower: borrowerId })
98
+ .sort([['bbcDate', -1]])
99
+ .limit(1);
100
+ return inventory[0].bbcDate;
101
+ };
102
+
103
+ export const getLastDigitFromAllValues = async (allBbcDates: { bbcDate: Date, ids: mongoose.Types.ObjectId[] }[]) => {
104
+ const allIds = allBbcDates.reduce((acc, bbcDate) => [...acc, ...bbcDate.ids], []);
105
+ return InventoryItemModel.aggregate([
106
+ {
107
+ $match: {
108
+ 'bbcSheetId': {
109
+ $in: allIds
110
+ }
111
+ }
112
+ },
113
+ ...COLLATERALS_LOOKUP,
114
+ {
115
+ $group: {
116
+ '_id': '$bbc.bbcDate',
117
+ 'borrowerId': {
118
+ $first: '$bbc.borrowerId',
119
+ },
120
+ 'items': {
121
+ $addToSet: {
122
+ 'value': '$value',
123
+ },
124
+ },
125
+ },
126
+ },
127
+ {
128
+ $project: {
129
+ '_id': '$borrowerId',
130
+ 'bbcDate': '$_id',
131
+ 'digitArray': {
132
+ $map: {
133
+ input: '$items',
134
+ as: 'item',
135
+ in: {
136
+ $substr: [
137
+ {
138
+ $toString: '$$item.value',
139
+ },
140
+ 0,
141
+ 1,
142
+ ],
143
+ },
144
+ },
145
+ },
146
+ },
147
+ },
148
+ {
149
+ $sort: {
150
+ 'bbcDate': 1
151
+ }
152
+ },
153
+ {
154
+ $group: {
155
+ '_id': 1,
156
+ 'bbcDates': {
157
+ $push: '$bbcDate'
158
+ },
159
+ 'digitArrays': {
160
+ $push: '$digitArray'
161
+ },
162
+ }
163
+ }
164
+ ]);
165
+ };
166
+
167
+ export const groupSKUsByDate = async (borrowerId: string) => {
168
+ const bbcDate = await getMostRecentInventoryBBCDate(borrowerId);
169
+ const date = new Date(bbcDate);
170
+ const oneMonthAgo = dayjs(date).subtract(1, 'month').toDate();
171
+ const threeMonthsAgo = dayjs(date).subtract(3, 'month').toDate();
172
+ const sixMonthsAgo = dayjs(date).subtract(6, 'month').toDate();
173
+
174
+ const items = await InventoryModel.aggregate<{
175
+ _id: string;
176
+ valuesAtTime: { bbcDate: string; count: number }[];
177
+ }>([
178
+ {
179
+ $match: {
180
+ bbcDate: { $in: [date, oneMonthAgo, threeMonthsAgo, sixMonthsAgo] },
181
+ },
182
+ },
183
+ {
184
+ $unwind: '$items',
185
+ },
186
+ {
187
+ $group: {
188
+ _id: '$items.sku',
189
+ valuesAtTime: { $push: { bbcDate: '$bbcDate', count: '$items.qty' } },
190
+ },
191
+ },
192
+ ]);
193
+
194
+ return {
195
+ items,
196
+ oneMonthAgo,
197
+ threeMonthsAgo,
198
+ sixMonthsAgo,
199
+ recent: date,
200
+ };
201
+ };
202
+
203
+ export const getAllTimeOldestSKUDateNew = async (borrowerId: string, bbcDate: Date) => {
204
+ const bbcDates = await getOlderBBCDates(borrowerId, bbcDate);
205
+ const sheets = await getBBCSheetsByType(bbcDates.map((bbcDate) => bbcDate._id.toString()), ECollaterals.INVENTORY);
206
+ return InventoryItemModel.aggregate<{ _id: string; oldestDate: string }>([
207
+ {
208
+ $match: {
209
+ bbcSheetId: {
210
+ '$in': sheets.map((sheet) => sheet._id)
211
+ }
212
+ }
213
+ },
214
+ {
215
+ $group: {
216
+ _id: '$sku',
217
+ oldestDate: {
218
+ $min: '$skuDate',
219
+ },
220
+ },
221
+ },
222
+ ]);
223
+ };
224
+
225
+ const todayDayjs = dayjs();
226
+ const today = todayDayjs.toDate();
227
+ const thirtyDaysAgo = todayDayjs.subtract(30, 'day').toDate();
228
+ const sixtyDaysAgo = todayDayjs.subtract(60, 'day').toDate();
229
+ const ninetyDaysAgo = todayDayjs.subtract(90, 'day').toDate();
230
+
231
+ export const aggregateSKUDateAgingPlot = async (bbcSheetIds: mongoose.Types.ObjectId[]) => {
232
+
233
+ const generateSumAggregation = (start: Date, end: Date) => ({
234
+ $sum: {
235
+ $add: {
236
+ $cond: [
237
+ {
238
+ $and: [
239
+ { $lte: ['$skuDate', start] },
240
+ { $gte: ['$skuDate', end] },
241
+ ],
242
+ },
243
+ '$value',
244
+ '$$REMOVE',
245
+ ],
246
+ },
247
+ },
248
+ });
249
+
250
+ const a = await InventoryItemModel.aggregate<{
251
+ '0-30': number;
252
+ '30-60': number;
253
+ '60-90': number;
254
+ '90+': number;
255
+ }>([
256
+ { $match: { 'bbcSheetId': { $in: bbcSheetIds } } },
257
+ ...COLLATERALS_LOOKUP,
258
+ {
259
+ $group: {
260
+ _id: '$bbc.bbcDate',
261
+ '0-30': generateSumAggregation(today, thirtyDaysAgo),
262
+ '30-60': generateSumAggregation(thirtyDaysAgo, sixtyDaysAgo),
263
+ '60-90': generateSumAggregation(sixtyDaysAgo, ninetyDaysAgo),
264
+ '90+': {
265
+ $sum: {
266
+ $add: {
267
+ $cond: [
268
+ {
269
+ $lte: ['$skuDate', ninetyDaysAgo],
270
+ },
271
+ '$value',
272
+ '$$REMOVE',
273
+ ],
274
+ },
275
+ },
276
+ },
277
+ },
278
+ },
279
+ ]);
280
+
281
+ return a[0];
282
+ };
283
+
284
+ interface ISkus {
285
+ category: string,
286
+ sku: string,
287
+ skuDescription: string,
288
+ value: number,
289
+ }
290
+
291
+ export const aggregateAllValuesForBbc = async (bbcSheetIds: mongoose.Types.ObjectId[]) => {
292
+ return InventoryItemModel.aggregate<ISkus>([
293
+ {
294
+ $match: {
295
+ bbcSheetId: { $in: bbcSheetIds },
296
+ },
297
+ },
298
+ {
299
+ $group: {
300
+ _id: '$sku',
301
+ value: { $first: '$value' },
302
+ skuDescription: { $first: '$skuDescription1' },
303
+ category: { $first: '$category' }
304
+ },
305
+ },
306
+ {
307
+ $project: {
308
+ _id: 0,
309
+ sku: '$_id',
310
+ value: 1,
311
+ skuDescription: 1,
312
+ category: 1,
313
+ },
314
+ },
315
+ { $sort: { value: -1 } },
316
+ { $limit: 500 },
317
+ ]);
318
+ }
319
+
320
+ export const aggregateBbcExposures = async (bbcSheetIds: mongoose.Types.ObjectId[]) => {
321
+ const getTotalBbcValue = await InventoryItemModel.aggregate([
322
+ {
323
+ $match: {
324
+ 'bbcSheetId': { $in: bbcSheetIds }
325
+ }
326
+ },
327
+ { $group: { _id: 0, total: { $sum: '$value' } } },
328
+ ]);
329
+
330
+ const inventoryTotal = getTotalBbcValue[0].total;
331
+
332
+ const topItemsForBbc = await InventoryItemModel.aggregate([
333
+ {
334
+ $match: {
335
+ 'bbcSheetId': { $in: bbcSheetIds }
336
+ }
337
+ },
338
+ {
339
+ $group: {
340
+ _id: '$category',
341
+ totalItemValue: { $sum: '$value' },
342
+ },
343
+ },
344
+ { $sort: { totalItemValue: -1 } },
345
+ { $limit: 10 },
346
+ { $project: { _id: 0, name: '$_id', totalItemValue: 1 } },
347
+ ]);
348
+ return { inventoryTotal, topItemsForBbc };
349
+ };
350
+
351
+ export const aggregateBbcExposuresGrouped = async (bbcSheetIds: mongoose.Types.ObjectId[]) => {
352
+
353
+ const commonAggregation = [
354
+ {
355
+ $match: {
356
+ 'bbcSheetId': { $in: bbcSheetIds }
357
+ }
358
+ },
359
+ ...COLLATERALS_LOOKUP,
360
+ {
361
+ $lookup: {
362
+ from: 'categorygroups',
363
+ let: {
364
+ 'res_cod_it': 'category',
365
+ 'borrowerId': '$borrowerId'
366
+ },
367
+ pipeline: [
368
+ {
369
+ $match: {
370
+ $expr: {
371
+ $eq: [
372
+ '$bbc.borrowerId', '$$borrowerId'
373
+ ]
374
+ }
375
+ }
376
+ },
377
+ {
378
+ $unwind: '$items'
379
+ }
380
+ ],
381
+ as: 'item'
382
+ }
383
+ },
384
+ {
385
+ $project: {
386
+ 'bbc': 1,
387
+ '_id': 1,
388
+ 'skuDate': 1,
389
+ 'category': 1,
390
+ 'value': 1,
391
+ 'group': {
392
+ '$filter': {
393
+ 'input': '$item',
394
+ 'as': 'groupEx',
395
+ 'cond': {
396
+ '$eq': [
397
+ '$$groupEx.items', '$category'
398
+ ]
399
+ }
400
+ }
401
+ }
402
+ }
403
+ },
404
+ {
405
+ $addFields: {
406
+ 'groupName': {
407
+ $first: '$group.groupName'
408
+ }
409
+ }
410
+ },
411
+ {
412
+ $project: {
413
+ 'borrowerId': 1,
414
+ 'bbc': 1,
415
+ 'skuDate': 1,
416
+ 'category': {
417
+ $ifNull: [
418
+ '$groupName', '$category'
419
+ ]
420
+ },
421
+ 'value': 1,
422
+ }
423
+ },
424
+ ];
425
+
426
+ const getTotalBbcValue = await InventoryItemModel.aggregate([
427
+ ...commonAggregation,
428
+ {
429
+ $group: {
430
+ '_id': 0,
431
+ 'total': {
432
+ $sum: '$value'
433
+ }
434
+ }
435
+ }
436
+ ]);
437
+
438
+ const inventoryTotal = getTotalBbcValue[0].total;
439
+
440
+ const topItemsForBbc = await InventoryItemModel.aggregate([
441
+ ...commonAggregation,
442
+ {
443
+ $group: {
444
+ '_id': '$category',
445
+ 'totalItemValue': {
446
+ $sum: '$value'
447
+ }
448
+ }
449
+ },
450
+ { $sort: { 'totalItemValue': -1 } },
451
+ { $limit: 5 },
452
+ { $project: { '_id': 0, 'name': '$_id', 'totalItemValue': 1 } },
453
+ ]);
454
+ return { inventoryTotal, topItemsForBbc };
455
+ };
456
+
457
+ export const getAllCategories = async (borrowerId: string) => {
458
+ const bbcSheets = await getBBCSheetsForBorrowerAndType(borrowerId, ECollaterals.INVENTORY);
459
+ return InventoryItemModel.aggregate<{ categories: string[] }>([
460
+ {
461
+ $match: {
462
+ 'bbcSheetId': {
463
+ $in: bbcSheets.map((bbcSheet) => new mongoose.Types.ObjectId(String(bbcSheet._id)))
464
+ }
465
+ }
466
+ },
467
+ {
468
+ $group: {
469
+ '_id': null,
470
+ 'categories': {
471
+ $addToSet: '$category'
472
+ }
473
+ }
474
+ },
475
+ {
476
+ $project: {
477
+ '_id': 0
478
+ }
479
+ },
480
+ ]);
481
+ };
@@ -0,0 +1,3 @@
1
+ import { IInventoryAvailability, IInventoryAvailabilityDocument, IInventoryAvailabilityResults, InventoryAvailabilityPaginators } from '../models/InventoryAvailability.model';
2
+ export declare const createInventoryAvailability: (inventoryAvailability: Partial<IInventoryAvailability>) => Promise<IInventoryAvailabilityDocument>;
3
+ export declare const getInventoryAvailabilityItems: (inventoryAvailabilityId: string, paginators: InventoryAvailabilityPaginators) => Promise<Partial<IInventoryAvailabilityResults>>;
@@ -0,0 +1,103 @@
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.getInventoryAvailabilityItems = exports.createInventoryAvailability = void 0;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const mongoose_1 = __importDefault(require("mongoose"));
9
+ const InventoryAvailability_model_1 = require("../models/InventoryAvailability.model");
10
+ const InventoryAvailabilityItem_model_1 = require("../models/InventoryAvailabilityItem.model");
11
+ const inventory_availability_results_enum_1 = require("../enums/inventory-availability-results.enum");
12
+ const collaterals_db_1 = require("./collaterals.db");
13
+ const createInventoryAvailability = async (inventoryAvailability) => {
14
+ const update = lodash_1.default.pick(inventoryAvailability, ['borrowerId', 'filters', 'options']);
15
+ return InventoryAvailability_model_1.InventoryAvailabilityModel
16
+ .findOneAndUpdate({ bbcDateId: inventoryAvailability.bbcDateId }, update, { upsert: true, new: true })
17
+ .lean();
18
+ };
19
+ exports.createInventoryAvailability = createInventoryAvailability;
20
+ const getInventoryAvailabilityItems = async (inventoryAvailabilityId, paginators) => {
21
+ const getMap = {
22
+ [inventory_availability_results_enum_1.EInventoryAvailabilityResults.UNIQ_ITEMS]: {
23
+ unique: true,
24
+ matched: true,
25
+ },
26
+ [inventory_availability_results_enum_1.EInventoryAvailabilityResults.NON_UNIQ_ITEMS]: {
27
+ unique: false,
28
+ matched: true,
29
+ },
30
+ [inventory_availability_results_enum_1.EInventoryAvailabilityResults.NOT_MATCHED_ITEMS]: {
31
+ unique: false,
32
+ matched: false,
33
+ },
34
+ };
35
+ const allItems = await Promise.all(Object.entries(getMap).map(async ([key, settings]) => {
36
+ const items = await InventoryAvailabilityItem_model_1.InventoryAvailabilityItemModel.aggregate([
37
+ {
38
+ $match: {
39
+ 'inventoryAvailabilityId': new mongoose_1.default.Types.ObjectId(inventoryAvailabilityId),
40
+ 'unique': settings.unique,
41
+ 'matched': settings.matched,
42
+ }
43
+ },
44
+ {
45
+ $sort: {
46
+ order: 1
47
+ }
48
+ },
49
+ ...(0, collaterals_db_1.ITEMS_PAGINATION)(paginators[key]),
50
+ {
51
+ $lookup: {
52
+ from: 'inventoryitems',
53
+ localField: 'inventoryId',
54
+ foreignField: '_id',
55
+ as: 'inventory',
56
+ },
57
+ },
58
+ {
59
+ $replaceRoot: {
60
+ newRoot: {
61
+ $mergeObjects: [
62
+ {
63
+ $arrayElemAt: ['$inventory', 0],
64
+ },
65
+ '$$ROOT',
66
+ ],
67
+ },
68
+ },
69
+ },
70
+ {
71
+ $unwind: {
72
+ path: '$inventory',
73
+ },
74
+ },
75
+ {
76
+ $lookup: {
77
+ from: 'bbcsheets',
78
+ localField: 'inventory.bbcSheetId',
79
+ foreignField: '_id',
80
+ as: 'bbcSheet',
81
+ },
82
+ },
83
+ {
84
+ $unwind: {
85
+ path: '$bbcSheet',
86
+ },
87
+ },
88
+ {
89
+ $project: {
90
+ inventory: 0,
91
+ },
92
+ },
93
+ ]);
94
+ const totalItems = await InventoryAvailabilityItem_model_1.InventoryAvailabilityItemModel.countDocuments({
95
+ 'inventoryAvailabilityId': new mongoose_1.default.Types.ObjectId(inventoryAvailabilityId),
96
+ 'unique': settings.unique,
97
+ 'matched': settings.matched,
98
+ });
99
+ return { [key]: { items, totalItems, paginatorOptions: paginators[key] } };
100
+ }, {}));
101
+ return allItems.reduce((acc, group) => ({ ...acc, ...group }), {});
102
+ };
103
+ exports.getInventoryAvailabilityItems = getInventoryAvailabilityItems;
@@ -0,0 +1,113 @@
1
+ import _ from 'lodash';
2
+ import mongoose from 'mongoose';
3
+
4
+ import {
5
+ IInventoryAvailability,
6
+ IInventoryAvailabilityDocument,
7
+ IInventoryAvailabilityResults,
8
+ InventoryAvailabilityModel,
9
+ InventoryAvailabilityPaginators,
10
+ } from '../models/InventoryAvailability.model';
11
+ import {
12
+ IInventoryAvailabilityItemDocWithInventory,
13
+ InventoryAvailabilityItemModel,
14
+ } from '../models/InventoryAvailabilityItem.model';
15
+ import { EInventoryAvailabilityResults } from '../enums/inventory-availability-results.enum';
16
+ import { ITEMS_PAGINATION } from './collaterals.db';
17
+
18
+ export const createInventoryAvailability = async (inventoryAvailability: Partial<IInventoryAvailability>): Promise<IInventoryAvailabilityDocument> => {
19
+ const update = _.pick(inventoryAvailability, ['borrowerId', 'filters', 'options']);
20
+ return InventoryAvailabilityModel
21
+ .findOneAndUpdate(
22
+ { bbcDateId: inventoryAvailability.bbcDateId },
23
+ update,
24
+ { upsert: true, new: true }
25
+ )
26
+ .lean();
27
+ }
28
+
29
+ export const getInventoryAvailabilityItems = async (inventoryAvailabilityId: string, paginators: InventoryAvailabilityPaginators): Promise<Partial<IInventoryAvailabilityResults>> => {
30
+ const getMap = {
31
+ [EInventoryAvailabilityResults.UNIQ_ITEMS]: {
32
+ unique: true,
33
+ matched: true,
34
+ },
35
+ [EInventoryAvailabilityResults.NON_UNIQ_ITEMS]: {
36
+ unique: false,
37
+ matched: true,
38
+ },
39
+ [EInventoryAvailabilityResults.NOT_MATCHED_ITEMS]: {
40
+ unique: false,
41
+ matched: false,
42
+ },
43
+ };
44
+ const allItems = await Promise.all(Object.entries(getMap).map(async ([key, settings]) => {
45
+ const items = await InventoryAvailabilityItemModel.aggregate<IInventoryAvailabilityItemDocWithInventory>([
46
+ {
47
+ $match: {
48
+ 'inventoryAvailabilityId': new mongoose.Types.ObjectId(inventoryAvailabilityId),
49
+ 'unique': settings.unique,
50
+ 'matched': settings.matched,
51
+ }
52
+ },
53
+ {
54
+ $sort: {
55
+ order: 1
56
+ }
57
+ },
58
+ ...ITEMS_PAGINATION(paginators[key]),
59
+ {
60
+ $lookup: {
61
+ from: 'inventoryitems',
62
+ localField: 'inventoryId',
63
+ foreignField: '_id',
64
+ as: 'inventory',
65
+ },
66
+ },
67
+ {
68
+ $replaceRoot: {
69
+ newRoot: {
70
+ $mergeObjects: [
71
+ {
72
+ $arrayElemAt: ['$inventory', 0],
73
+ },
74
+ '$$ROOT',
75
+ ],
76
+ },
77
+ },
78
+ },
79
+ {
80
+ $unwind: {
81
+ path: '$inventory',
82
+ },
83
+ },
84
+ {
85
+ $lookup: {
86
+ from: 'bbcsheets',
87
+ localField: 'inventory.bbcSheetId',
88
+ foreignField: '_id',
89
+ as: 'bbcSheet',
90
+ },
91
+ },
92
+ {
93
+ $unwind: {
94
+ path: '$bbcSheet',
95
+ },
96
+ },
97
+ {
98
+ $project: {
99
+ inventory: 0,
100
+ },
101
+ },
102
+ ]);
103
+ const totalItems = await InventoryAvailabilityItemModel.countDocuments(
104
+ {
105
+ 'inventoryAvailabilityId': new mongoose.Types.ObjectId(inventoryAvailabilityId),
106
+ 'unique': settings.unique,
107
+ 'matched': settings.matched,
108
+ },
109
+ );
110
+ return { [key]: { items, totalItems, paginatorOptions: paginators[key] } };
111
+ }, {}));
112
+ return allItems.reduce((acc, group) => ({ ...acc, ...group }), {});
113
+ }