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,6 @@
1
+ import { CollateralsService } from './collaterals.service';
2
+ export declare class LockService {
3
+ private readonly collateralsService;
4
+ constructor(collateralsService: CollateralsService);
5
+ isDateLocked(checkDate: Date, borrowerId: string): Promise<boolean>;
6
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LockService = void 0;
4
+ const AvailabilitySigns_model_1 = require("../models/AvailabilitySigns.model");
5
+ class LockService {
6
+ collateralsService;
7
+ constructor(collateralsService) {
8
+ this.collateralsService = collateralsService;
9
+ }
10
+ async isDateLocked(checkDate, borrowerId) {
11
+ const bbcDocsAfter = await this.collateralsService.gebNextBBC(borrowerId, checkDate);
12
+ const activeSignsAfter = await AvailabilitySigns_model_1.AvailabilitySignsModel.aggregate([
13
+ {
14
+ $match: {
15
+ 'bbcDateId': { $in: bbcDocsAfter.map((bbc) => bbc._id) },
16
+ },
17
+ }, {
18
+ $unwind: {
19
+ path: '$signs',
20
+ preserveNullAndEmptyArrays: true,
21
+ },
22
+ }, {
23
+ $match: {
24
+ 'signs.revokedAt': {
25
+ $exists: false,
26
+ },
27
+ },
28
+ }, {
29
+ $group: {
30
+ '_id': '$_id',
31
+ 'requiredSigns': { $first: '$requiredSigns' },
32
+ 'signs': { $push: '$signs' },
33
+ },
34
+ }, {
35
+ $match: {
36
+ $expr: {
37
+ $gte: [{ '$size': '$signs' }, '$requiredSigns'],
38
+ },
39
+ },
40
+ },
41
+ ]);
42
+ return activeSignsAfter.length > 0;
43
+ }
44
+ }
45
+ exports.LockService = LockService;
@@ -0,0 +1,45 @@
1
+ import { AvailabilitySignsModel } from '../models/AvailabilitySigns.model';
2
+
3
+ import { CollateralsService } from './collaterals.service';
4
+
5
+ export class LockService {
6
+ constructor(
7
+ private readonly collateralsService: CollateralsService,
8
+ ) {
9
+ }
10
+
11
+ async isDateLocked(checkDate: Date, borrowerId: string) {
12
+ const bbcDocsAfter = await this.collateralsService.gebNextBBC(borrowerId, checkDate);
13
+ const activeSignsAfter = await AvailabilitySignsModel.aggregate([
14
+ {
15
+ $match: {
16
+ 'bbcDateId': { $in: bbcDocsAfter.map((bbc) => bbc._id) },
17
+ },
18
+ }, {
19
+ $unwind: {
20
+ path: '$signs',
21
+ preserveNullAndEmptyArrays: true,
22
+ },
23
+ }, {
24
+ $match: {
25
+ 'signs.revokedAt': {
26
+ $exists: false,
27
+ },
28
+ },
29
+ }, {
30
+ $group: {
31
+ '_id': '$_id',
32
+ 'requiredSigns': { $first: '$requiredSigns' },
33
+ 'signs': { $push: '$signs' },
34
+ },
35
+ }, {
36
+ $match: {
37
+ $expr: {
38
+ $gte: [{ '$size': '$signs' }, '$requiredSigns'],
39
+ },
40
+ },
41
+ },
42
+ ]);
43
+ return activeSignsAfter.length > 0;
44
+ }
45
+ }
@@ -0,0 +1,20 @@
1
+ import { IInventoryManualEntryDoc } from '../models/InventoryManualEntry.model';
2
+ import { IAvailabilitySummary, IReceivableManualSummary } from '../models/ReceivableAvailability.model';
3
+ import { SummaryMultipliers } from '../models/ReceivableAvailabilityManualSummary.model';
4
+ import { InventoryAvailabilityService } from './inventory-availability.service';
5
+ export declare const emptySummary: IAvailabilitySummary;
6
+ export declare class ManualEntryService {
7
+ private readonly getInventoryAvailabilityService;
8
+ constructor(getInventoryAvailabilityService: () => InventoryAvailabilityService);
9
+ private getPreviousInventoryEntries;
10
+ getInventoryManualEntry(bbcDateId: string): Promise<import("../models/InventoryManualEntry.model").IInventoryManualEntry>;
11
+ updateInventoryManualEntry(manualEntry: Partial<IInventoryManualEntryDoc>): Promise<void>;
12
+ getReceivableManualSummary(bbcDateId: string): Promise<{
13
+ summary: IAvailabilitySummary;
14
+ multipliers: SummaryMultipliers;
15
+ }>;
16
+ updateReceivableManualSummary(manualSummary: IReceivableManualSummary, update: {
17
+ [index: string]: number;
18
+ }, multiplier: boolean): Promise<IReceivableManualSummary>;
19
+ saveReceivableManualSummary(bbcDateId: string, summary: IReceivableManualSummary): Promise<void>;
20
+ }
@@ -0,0 +1,186 @@
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.ManualEntryService = exports.emptySummary = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const decimal_js_1 = __importDefault(require("decimal.js"));
9
+ const numbers_helper_1 = require("../helpers/numbers.helper");
10
+ const inventory_manual_entry_db_1 = require("../db/inventory-manual-entry.db");
11
+ const InventoryManualEntry_model_1 = require("../models/InventoryManualEntry.model");
12
+ const inventory_availability_db_1 = require("../db/inventory-availability.db");
13
+ const BBCDate_model_1 = require("../models/BBCDate.model");
14
+ const bbcDates_db_1 = require("../db/bbcDates.db");
15
+ const collaterals_enum_1 = require("../enums/collaterals.enum");
16
+ const ReceivableAvailabilityManualSummary_model_1 = require("../models/ReceivableAvailabilityManualSummary.model");
17
+ exports.emptySummary = {
18
+ invoiceAmount: 0,
19
+ creditNotes: 0,
20
+ excludedCustomerDeduction: 0,
21
+ grossAR: 0,
22
+ permittedOver: 0,
23
+ preliminaryEligibleBalance: 0,
24
+ creditNotesNegative: 0,
25
+ deduction: 0,
26
+ partiallyPaidDeduction: 0,
27
+ contraDeduction: 0,
28
+ crossAgeDeduction: 0,
29
+ waivedDeduction: 0,
30
+ balanceAfterCrossAge: 0,
31
+ finalResult: 0,
32
+ insuredComponent: 0,
33
+ uninsuredComponent: 0,
34
+ insuredAvailability: 0,
35
+ uninsuredAvailability: 0,
36
+ ARReserves: 0,
37
+ ARAvailability: 0,
38
+ };
39
+ const emptyMultipliers = {
40
+ insuredAvailability: 0,
41
+ uninsuredAvailability: 0,
42
+ };
43
+ const recalculateAvailabilitySummary = (summary, multiplier, update = null) => {
44
+ const updatedIndexes = (!update || multiplier) ? [] : Object.keys(update);
45
+ summary.summary.grossAR = new decimal_js_1.default(summary.summary.invoiceAmount)
46
+ .plus(summary.summary.excludedCustomerDeduction)
47
+ .plus(summary.summary.creditNotes)
48
+ .toNumber();
49
+ summary.summary.preliminaryEligibleBalance = new decimal_js_1.default(summary.summary.grossAR).plus(summary.summary.permittedOver).toNumber();
50
+ summary.summary.balanceAfterCrossAge = new decimal_js_1.default(summary.summary.preliminaryEligibleBalance)
51
+ .plus(summary.summary.deduction)
52
+ .plus(summary.summary.partiallyPaidDeduction)
53
+ .plus(summary.summary.contraDeduction)
54
+ .plus(summary.summary.crossAgeDeduction)
55
+ .plus(summary.summary.creditNotesNegative)
56
+ .toNumber();
57
+ summary.summary.finalResult = new decimal_js_1.default(summary.summary.balanceAfterCrossAge).plus(summary.summary.waivedDeduction).toNumber();
58
+ if (updatedIndexes.includes('insuredComponent')) {
59
+ summary.summary.uninsuredComponent = new decimal_js_1.default(summary.summary.finalResult).sub(summary.summary.insuredComponent).toNumber();
60
+ }
61
+ else if (updatedIndexes.includes('uninsuredComponent')) {
62
+ summary.summary.insuredComponent = new decimal_js_1.default(summary.summary.finalResult).sub(summary.summary.uninsuredComponent).toNumber();
63
+ }
64
+ else {
65
+ summary.summary.uninsuredComponent = new decimal_js_1.default(summary.summary.finalResult).sub(summary.summary.insuredComponent).toNumber();
66
+ }
67
+ summary.summary.insuredAvailability = new decimal_js_1.default(summary.summary.insuredComponent)
68
+ .mul(summary.multipliers.insuredAvailability || 0)
69
+ .div(100)
70
+ .toNumber();
71
+ summary.summary.uninsuredAvailability = new decimal_js_1.default(summary.summary.uninsuredComponent)
72
+ .mul(summary.multipliers.uninsuredAvailability || 0)
73
+ .div(100)
74
+ .toNumber();
75
+ summary.summary.ARAvailability = new decimal_js_1.default(summary.summary.insuredAvailability)
76
+ .plus(summary.summary.uninsuredAvailability)
77
+ .sub(summary.summary.ARReserves)
78
+ .toNumber();
79
+ return summary;
80
+ };
81
+ class ManualEntryService {
82
+ getInventoryAvailabilityService;
83
+ constructor(getInventoryAvailabilityService) {
84
+ this.getInventoryAvailabilityService = getInventoryAvailabilityService;
85
+ }
86
+ async getPreviousInventoryEntries(bbcDateId) {
87
+ const currentBBC = await BBCDate_model_1.BBCDateModel.findById(bbcDateId);
88
+ if (currentBBC) {
89
+ const allBBCs = await (0, bbcDates_db_1.getBBCDatesByType)(currentBBC.borrowerId.toString(), [collaterals_enum_1.ECollaterals.INVENTORY]);
90
+ const previousBBCs = allBBCs.filter((bbc) => bbc.bbcDate < currentBBC.bbcDate);
91
+ if (previousBBCs.length > 0) {
92
+ const lastBBC = previousBBCs[0];
93
+ const previousEntries = await (0, inventory_manual_entry_db_1.getInventoryManualEntryData)(lastBBC._id.toString());
94
+ return previousEntries.items;
95
+ }
96
+ else {
97
+ return [];
98
+ }
99
+ }
100
+ return [];
101
+ }
102
+ async getInventoryManualEntry(bbcDateId) {
103
+ const manualEntryData = await (0, inventory_manual_entry_db_1.getInventoryManualEntryData)(bbcDateId);
104
+ if (!manualEntryData.items.length) {
105
+ const previousEntries = await this.getPreviousInventoryEntries(bbcDateId);
106
+ const mappedItems = previousEntries.map((e) => {
107
+ const { _id, ...rest } = e;
108
+ return rest;
109
+ });
110
+ const newEntries = await InventoryManualEntry_model_1.InventoryManualEntryModel.findOneAndUpdate({ bbcDateId: bbcDateId }, { items: mappedItems }, {
111
+ upsert: true,
112
+ new: true,
113
+ }).lean();
114
+ manualEntryData.items = newEntries.items;
115
+ }
116
+ return manualEntryData;
117
+ }
118
+ async updateInventoryManualEntry(manualEntry) {
119
+ const foundEntry = await InventoryManualEntry_model_1.InventoryManualEntryModel.findOne({ bbcDateId: manualEntry.bbcDateId }).lean();
120
+ manualEntry.items = manualEntry.items.map((item) => {
121
+ item.availability = (0, numbers_helper_1.roundToXDigits)((0, numbers_helper_1.roundToXDigits)(item.totalValue - item.ineligible) * item.advanceRate / 100);
122
+ return item;
123
+ });
124
+ if (!foundEntry) {
125
+ const mappedItems = manualEntry.items.map((item) => {
126
+ const { _id, ...rest } = item;
127
+ return rest;
128
+ });
129
+ const newEntry = await InventoryManualEntry_model_1.InventoryManualEntryModel.create({
130
+ bbcDateId: new mongoose_1.default.Types.ObjectId(manualEntry.bbcDateId),
131
+ items: mappedItems,
132
+ });
133
+ await newEntry.save();
134
+ return;
135
+ }
136
+ const mappedItems = manualEntry.items.map((item) => {
137
+ if (String(item._id).includes('new_')) {
138
+ const { _id, ...rest } = item;
139
+ return rest;
140
+ }
141
+ return item;
142
+ });
143
+ await InventoryManualEntry_model_1.InventoryManualEntryModel.findOneAndUpdate({ bbcDateId: manualEntry.bbcDateId }, { items: mappedItems }).lean();
144
+ const inventoryAvailability = await (0, inventory_availability_db_1.getInventoryAvailabilityByBBCDateId)(manualEntry.bbcDateId);
145
+ if (inventoryAvailability && inventoryAvailability.useManualInputs) {
146
+ const inventoryAvailabilityService = this.getInventoryAvailabilityService();
147
+ await inventoryAvailabilityService.toggleManualInventoryAvailability(manualEntry.bbcDateId, true);
148
+ }
149
+ }
150
+ async getReceivableManualSummary(bbcDateId) {
151
+ const manualSummary = await ReceivableAvailabilityManualSummary_model_1.ReceivableAvailabilityManualSummary.findOne({ bbcDateId });
152
+ if (!manualSummary) {
153
+ return { summary: exports.emptySummary, multipliers: emptyMultipliers };
154
+ }
155
+ return {
156
+ summary: manualSummary.summary ? manualSummary.summary : exports.emptySummary,
157
+ multipliers: manualSummary.multipliers ? manualSummary.multipliers : emptyMultipliers,
158
+ };
159
+ }
160
+ async updateReceivableManualSummary(manualSummary, update, multiplier) {
161
+ const negativeKeys = ['permittedOver', 'deduction', 'partiallyPaidDeduction', 'contraDeduction', 'crossAgeDeduction', 'creditNotesNegative'];
162
+ Object.entries(update).forEach(([index, value]) => {
163
+ value = negativeKeys.includes(index) ? new decimal_js_1.default(value).abs().neg().toNumber() : new decimal_js_1.default(value).abs().toNumber();
164
+ if (multiplier) {
165
+ manualSummary.multipliers[index] = value;
166
+ }
167
+ else {
168
+ manualSummary.summary[index] = value;
169
+ }
170
+ });
171
+ return recalculateAvailabilitySummary(manualSummary, multiplier, multiplier ? null : update);
172
+ }
173
+ async saveReceivableManualSummary(bbcDateId, summary) {
174
+ const normalizedSummary = recalculateAvailabilitySummary(summary, false);
175
+ const existingSummary = await ReceivableAvailabilityManualSummary_model_1.ReceivableAvailabilityManualSummary.findOne({ bbcDateId });
176
+ if (existingSummary) {
177
+ existingSummary.summary = normalizedSummary.summary;
178
+ existingSummary.multipliers = summary.multipliers;
179
+ await existingSummary.save();
180
+ }
181
+ else {
182
+ await ReceivableAvailabilityManualSummary_model_1.ReceivableAvailabilityManualSummary.create({ bbcDateId, summary: normalizedSummary.summary, multipliers: summary.multipliers });
183
+ }
184
+ }
185
+ }
186
+ exports.ManualEntryService = ManualEntryService;
@@ -0,0 +1,201 @@
1
+ import mongoose from 'mongoose';
2
+ import Decimal from 'decimal.js';
3
+
4
+ import { roundToXDigits } from '../helpers/numbers.helper';
5
+ import { getInventoryManualEntryData } from '../db/inventory-manual-entry.db';
6
+ import {
7
+ IInventoryManualEntryDoc,
8
+ IInventoryManualEntryItem,
9
+ InventoryManualEntryModel,
10
+ } from '../models/InventoryManualEntry.model';
11
+ import { getInventoryAvailabilityByBBCDateId } from '../db/inventory-availability.db';
12
+ import { BBCDateModel } from '../models/BBCDate.model';
13
+ import { getBBCDatesByType } from '../db/bbcDates.db';
14
+ import { ECollaterals } from '../enums/collaterals.enum';
15
+ import {
16
+ IAvailabilitySummary, IReceivableManualSummary,
17
+ } from '../models/ReceivableAvailability.model';
18
+ import {
19
+ ReceivableAvailabilityManualSummary,
20
+ SummaryMultipliers,
21
+ } from '../models/ReceivableAvailabilityManualSummary.model';
22
+
23
+ import { InventoryAvailabilityService } from './inventory-availability.service';
24
+
25
+ export const emptySummary: IAvailabilitySummary = {
26
+ invoiceAmount: 0,
27
+ creditNotes: 0,
28
+ excludedCustomerDeduction: 0,
29
+ grossAR: 0,
30
+ permittedOver: 0,
31
+ preliminaryEligibleBalance: 0,
32
+ creditNotesNegative: 0,
33
+ deduction: 0,
34
+ partiallyPaidDeduction: 0,
35
+ contraDeduction: 0,
36
+ crossAgeDeduction: 0,
37
+ waivedDeduction: 0,
38
+ balanceAfterCrossAge: 0,
39
+ finalResult: 0,
40
+ insuredComponent: 0,
41
+ uninsuredComponent: 0,
42
+ insuredAvailability: 0,
43
+ uninsuredAvailability: 0,
44
+ ARReserves: 0,
45
+ ARAvailability: 0,
46
+ };
47
+
48
+ const emptyMultipliers: SummaryMultipliers = {
49
+ insuredAvailability: 0,
50
+ uninsuredAvailability: 0,
51
+ };
52
+
53
+ const recalculateAvailabilitySummary = (summary: IReceivableManualSummary, multiplier: boolean, update: { [index: string]: number } = null): IReceivableManualSummary => {
54
+ const updatedIndexes = (!update || multiplier) ? [] : Object.keys(update);
55
+
56
+ summary.summary.grossAR = new Decimal(summary.summary.invoiceAmount)
57
+ .plus(summary.summary.excludedCustomerDeduction)
58
+ .plus(summary.summary.creditNotes)
59
+ .toNumber();
60
+ summary.summary.preliminaryEligibleBalance = new Decimal(summary.summary.grossAR).plus(summary.summary.permittedOver).toNumber();
61
+ summary.summary.balanceAfterCrossAge = new Decimal(summary.summary.preliminaryEligibleBalance)
62
+ .plus(summary.summary.deduction)
63
+ .plus(summary.summary.partiallyPaidDeduction)
64
+ .plus(summary.summary.contraDeduction)
65
+ .plus(summary.summary.crossAgeDeduction)
66
+ .plus(summary.summary.creditNotesNegative)
67
+ .toNumber();
68
+ summary.summary.finalResult = new Decimal(summary.summary.balanceAfterCrossAge).plus(summary.summary.waivedDeduction).toNumber();
69
+
70
+ if(updatedIndexes.includes('insuredComponent')) {
71
+ summary.summary.uninsuredComponent = new Decimal(summary.summary.finalResult).sub(summary.summary.insuredComponent).toNumber()
72
+ } else if (updatedIndexes.includes('uninsuredComponent')) {
73
+ summary.summary.insuredComponent = new Decimal(summary.summary.finalResult).sub(summary.summary.uninsuredComponent).toNumber()
74
+ } else {
75
+ summary.summary.uninsuredComponent = new Decimal(summary.summary.finalResult).sub(summary.summary.insuredComponent).toNumber()
76
+ }
77
+ summary.summary.insuredAvailability = new Decimal(summary.summary.insuredComponent)
78
+ .mul(summary.multipliers.insuredAvailability || 0)
79
+ .div(100)
80
+ .toNumber();
81
+ summary.summary.uninsuredAvailability = new Decimal(summary.summary.uninsuredComponent)
82
+ .mul(summary.multipliers.uninsuredAvailability || 0)
83
+ .div(100)
84
+ .toNumber();
85
+ summary.summary.ARAvailability = new Decimal(summary.summary.insuredAvailability)
86
+ .plus(summary.summary.uninsuredAvailability)
87
+ .sub(summary.summary.ARReserves)
88
+ .toNumber();
89
+ return summary;
90
+ };
91
+
92
+ export class ManualEntryService {
93
+
94
+ constructor(
95
+ private readonly getInventoryAvailabilityService: () => InventoryAvailabilityService,
96
+ ) {
97
+ }
98
+
99
+ private async getPreviousInventoryEntries(bbcDateId: string) {
100
+ const currentBBC = await BBCDateModel.findById(bbcDateId);
101
+ if (currentBBC) {
102
+ const allBBCs = await getBBCDatesByType(currentBBC.borrowerId.toString(), [ECollaterals.INVENTORY]);
103
+ const previousBBCs = allBBCs.filter((bbc) => bbc.bbcDate < currentBBC.bbcDate);
104
+ if (previousBBCs.length > 0) {
105
+ const lastBBC = previousBBCs[0];
106
+ const previousEntries = await getInventoryManualEntryData(lastBBC._id.toString());
107
+ return previousEntries.items;
108
+ } else {
109
+ return [];
110
+ }
111
+ }
112
+ return [];
113
+ }
114
+
115
+ async getInventoryManualEntry(bbcDateId: string) {
116
+ const manualEntryData = await getInventoryManualEntryData(bbcDateId);
117
+ if (!manualEntryData.items.length) {
118
+ const previousEntries = await this.getPreviousInventoryEntries(bbcDateId);
119
+ const mappedItems = previousEntries.map((e: (IInventoryManualEntryItem & { _id: string })) => {
120
+ const { _id, ...rest } = e;
121
+ return rest;
122
+ });
123
+ const newEntries = await InventoryManualEntryModel.findOneAndUpdate({ bbcDateId: bbcDateId }, { items: mappedItems }, {
124
+ upsert: true,
125
+ new: true,
126
+ }).lean();
127
+ manualEntryData.items = newEntries.items;
128
+ }
129
+ return manualEntryData;
130
+ }
131
+
132
+ async updateInventoryManualEntry(manualEntry: Partial<IInventoryManualEntryDoc>) {
133
+ const foundEntry = await InventoryManualEntryModel.findOne({ bbcDateId: manualEntry.bbcDateId }).lean();
134
+ manualEntry.items = manualEntry.items.map((item) => {
135
+ item.availability = roundToXDigits(roundToXDigits(item.totalValue - item.ineligible) * item.advanceRate / 100);
136
+ return item;
137
+ });
138
+ if (!foundEntry) {
139
+ const mappedItems = manualEntry.items.map((item) => {
140
+ const { _id, ...rest } = item;
141
+ return rest;
142
+ });
143
+ const newEntry = await InventoryManualEntryModel.create({
144
+ bbcDateId: new mongoose.Types.ObjectId(manualEntry.bbcDateId),
145
+ items: mappedItems,
146
+ });
147
+ await newEntry.save();
148
+ return;
149
+ }
150
+ const mappedItems = manualEntry.items.map((item) => {
151
+ if (String(item._id).includes('new_')) {
152
+ const { _id, ...rest } = item;
153
+ return rest;
154
+ }
155
+ return item;
156
+ });
157
+ await InventoryManualEntryModel.findOneAndUpdate({ bbcDateId: manualEntry.bbcDateId }, { items: mappedItems }).lean();
158
+ const inventoryAvailability = await getInventoryAvailabilityByBBCDateId(manualEntry.bbcDateId);
159
+ if (inventoryAvailability && inventoryAvailability.useManualInputs) {
160
+ const inventoryAvailabilityService = this.getInventoryAvailabilityService();
161
+ await inventoryAvailabilityService.toggleManualInventoryAvailability(manualEntry.bbcDateId, true);
162
+ }
163
+ }
164
+
165
+ async getReceivableManualSummary(bbcDateId: string) {
166
+ const manualSummary = await ReceivableAvailabilityManualSummary.findOne({ bbcDateId });
167
+ if (!manualSummary) {
168
+ return { summary: emptySummary, multipliers: emptyMultipliers };
169
+ }
170
+
171
+ return {
172
+ summary: manualSummary.summary ? manualSummary.summary: emptySummary,
173
+ multipliers: manualSummary.multipliers ? manualSummary.multipliers: emptyMultipliers,
174
+ };
175
+ }
176
+
177
+ async updateReceivableManualSummary(manualSummary: IReceivableManualSummary, update: { [index: string]: number }, multiplier: boolean) {
178
+ const negativeKeys = ['permittedOver', 'deduction', 'partiallyPaidDeduction', 'contraDeduction', 'crossAgeDeduction', 'creditNotesNegative'];
179
+ Object.entries(update).forEach(([index, value]) => {
180
+ value = negativeKeys.includes(index) ? new Decimal(value).abs().neg().toNumber() : new Decimal(value).abs().toNumber();
181
+ if (multiplier) {
182
+ manualSummary.multipliers[index] = value;
183
+ } else {
184
+ manualSummary.summary[index] = value;
185
+ }
186
+ });
187
+ return recalculateAvailabilitySummary(manualSummary, multiplier, multiplier ? null : update);
188
+ }
189
+
190
+ async saveReceivableManualSummary(bbcDateId: string, summary: IReceivableManualSummary) {
191
+ const normalizedSummary = recalculateAvailabilitySummary(summary, false);
192
+ const existingSummary = await ReceivableAvailabilityManualSummary.findOne({ bbcDateId });
193
+ if (existingSummary) {
194
+ existingSummary.summary = normalizedSummary.summary;
195
+ existingSummary.multipliers = summary.multipliers;
196
+ await existingSummary.save();
197
+ } else {
198
+ await ReceivableAvailabilityManualSummary.create({ bbcDateId, summary: normalizedSummary.summary, multipliers: summary.multipliers });
199
+ }
200
+ }
201
+ }
@@ -0,0 +1,34 @@
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" />
25
+ /// <reference types="mongoose/types/inferschematype" />
26
+ import { IMonthEndData } from '../models/MonthEndData.Model';
27
+ export declare class MonthEndDataService {
28
+ upsertMonthEndData(input: IMonthEndData): Promise<import("mongoose").Document<unknown, {}, IMonthEndData> & IMonthEndData & Required<{
29
+ _id: import("mongoose").Types.ObjectId;
30
+ }>>;
31
+ getMonthEndData(productId: string, year: number, month: number): Promise<(import("mongoose").Document<unknown, {}, IMonthEndData> & IMonthEndData & Required<{
32
+ _id: import("mongoose").Types.ObjectId;
33
+ }>)[]>;
34
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MonthEndDataService = void 0;
4
+ const MonthEndData_Model_1 = require("../models/MonthEndData.Model");
5
+ class MonthEndDataService {
6
+ async upsertMonthEndData(input) {
7
+ const { productId, year, month, dataType, dataValue } = input;
8
+ if (!Object.values(MonthEndData_Model_1.EMonthEndDataType).includes(input.dataType)) {
9
+ throw new Error(`Invalid dataType: ${dataType}`);
10
+ }
11
+ return MonthEndData_Model_1.MonthEndData.findOneAndUpdate({
12
+ productId,
13
+ year,
14
+ month,
15
+ dataType,
16
+ }, {
17
+ $set: {
18
+ dataValue,
19
+ },
20
+ }, {
21
+ upsert: true,
22
+ new: true,
23
+ setDefaultsOnInsert: true,
24
+ });
25
+ }
26
+ async getMonthEndData(productId, year, month) {
27
+ return MonthEndData_Model_1.MonthEndData.find({ productId, year, month });
28
+ }
29
+ }
30
+ exports.MonthEndDataService = MonthEndDataService;
@@ -0,0 +1,35 @@
1
+ import { EMonthEndDataType, IMonthEndData, MonthEndData } from '../models/MonthEndData.Model';
2
+
3
+ export class MonthEndDataService {
4
+
5
+ async upsertMonthEndData(input: IMonthEndData) {
6
+ const { productId, year, month, dataType, dataValue } = input;
7
+
8
+ if (!Object.values(EMonthEndDataType).includes(input.dataType)) {
9
+ throw new Error(`Invalid dataType: ${dataType}`);
10
+ }
11
+
12
+ return MonthEndData.findOneAndUpdate(
13
+ {
14
+ productId,
15
+ year,
16
+ month,
17
+ dataType,
18
+ },
19
+ {
20
+ $set: {
21
+ dataValue,
22
+ },
23
+ },
24
+ {
25
+ upsert: true,
26
+ new: true,
27
+ setDefaultsOnInsert: true,
28
+ },
29
+ );
30
+ }
31
+
32
+ async getMonthEndData(productId: string, year: number, month: number) {
33
+ return MonthEndData.find({ productId, year, month });
34
+ }
35
+ }