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,159 @@
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.LoanStatementStatusService = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const dayjs_1 = __importDefault(require("dayjs"));
9
+ const LoanStatementStatus_model_1 = require("../models/LoanStatementStatus.model");
10
+ class LoanStatementStatusService {
11
+ getLoanChargesService;
12
+ termLoanService;
13
+ constructor(getLoanChargesService, termLoanService) {
14
+ this.getLoanChargesService = getLoanChargesService;
15
+ this.termLoanService = termLoanService;
16
+ }
17
+ async initStatementStatuses() {
18
+ const allStatuses = await LoanStatementStatus_model_1.LoanStatementStatusModel.find().lean();
19
+ if (allStatuses.length === 0) {
20
+ const loanChargesService = this.getLoanChargesService();
21
+ const loanProducts = await loanChargesService.getAllLoanProducts();
22
+ const endDate = (0, dayjs_1.default)().utcOffset(0).startOf('month');
23
+ for (const product of loanProducts) {
24
+ let currentDate = (0, dayjs_1.default)(product.startDate).utcOffset(0).startOf('month');
25
+ while (currentDate.diff(endDate, 'month') <= 0) {
26
+ const statementDate = this.getStatementDateForDate(currentDate.toDate());
27
+ await this.getCreateStatementStatus(product._id.toString(), statementDate);
28
+ currentDate = currentDate.add(1, 'month');
29
+ }
30
+ }
31
+ }
32
+ }
33
+ getStatementDateFromStringPeriod(period) {
34
+ let startOf = null;
35
+ switch (period) {
36
+ case 'CURRENT_MONTH':
37
+ startOf = (0, dayjs_1.default)().utcOffset(0).startOf('month');
38
+ break;
39
+ case 'LAST_MONTH':
40
+ startOf = (0, dayjs_1.default)().utcOffset(0).startOf('month').subtract(1, 'second').startOf('month');
41
+ break;
42
+ }
43
+ if (!startOf) {
44
+ return startOf;
45
+ }
46
+ return { year: startOf.year(), month: startOf.month() + 1 };
47
+ }
48
+ getStatementDateForDate(date) {
49
+ const startOf = (0, dayjs_1.default)(date).utcOffset(0).startOf('month');
50
+ return { year: startOf.year(), month: startOf.month() + 1 };
51
+ }
52
+ getStatementDateFromPeriod(period) {
53
+ return { year: period.start.year(), month: period.start.month() + 1 };
54
+ }
55
+ getDateFromStatementDate(statementDate) {
56
+ return (0, dayjs_1.default)().utcOffset(0).set('year', statementDate.year).set('month', statementDate.month - 1).startOf('month').toDate();
57
+ }
58
+ getPeriodsFromStatementDate(statementDate) {
59
+ if (statementDate.month < 1 || statementDate.month > 12) {
60
+ throw new Error('Invalid month number. Month should be between 1 and 12.');
61
+ }
62
+ const startOfMonth = (0, dayjs_1.default)()
63
+ .set('year', statementDate.year)
64
+ .set('month', statementDate.month - 1)
65
+ .utcOffset(0)
66
+ .startOf('month');
67
+ const endOfMonth = startOfMonth.endOf('month');
68
+ return [{ start: startOfMonth, end: endOfMonth }];
69
+ }
70
+ async toggleStatementLock(productId, statementDate) {
71
+ const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
72
+ if (statementStatus) {
73
+ statementStatus.locked = !statementStatus.locked;
74
+ await statementStatus.save();
75
+ }
76
+ }
77
+ async updateStatementStatus(productId, statementDate, actual) {
78
+ const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
79
+ if (statementStatus && !statementStatus.locked) {
80
+ statementStatus.actual = actual;
81
+ if (actual) {
82
+ statementStatus.lastCalculated = new Date();
83
+ }
84
+ await statementStatus.save();
85
+ }
86
+ }
87
+ async getAllStatementsStatus(statementDate) {
88
+ await this.initStatementStatuses();
89
+ const loanChargesService = this.getLoanChargesService();
90
+ const products = await loanChargesService.getAllLoanProducts();
91
+ const results = await Promise.all(products.map(async (product) => {
92
+ const statementsStatus = await LoanStatementStatus_model_1.LoanStatementStatusModel.findOne({ productId: product._id, ...statementDate }).lean();
93
+ if (statementsStatus) {
94
+ return { ...statementsStatus, product };
95
+ }
96
+ return null;
97
+ }));
98
+ return results.filter((res) => !!res);
99
+ }
100
+ async getStatementStatus(productId, date) {
101
+ const statementDate = this.getStatementDateForDate(date);
102
+ return this.getCreateStatementStatus(productId, statementDate);
103
+ }
104
+ async getCreateStatementStatus(productId, statementDate) {
105
+ const statementStatus = await LoanStatementStatus_model_1.LoanStatementStatusModel.findOne({ productId, ...statementDate });
106
+ if (statementStatus) {
107
+ return statementStatus;
108
+ }
109
+ else {
110
+ const loanStatementStatus = {
111
+ productId: new mongoose_1.default.Types.ObjectId(productId),
112
+ year: statementDate.year,
113
+ month: statementDate.month,
114
+ actual: true,
115
+ locked: false,
116
+ lastCalculated: null,
117
+ };
118
+ const newStatementStatus = new LoanStatementStatus_model_1.LoanStatementStatusModel(loanStatementStatus);
119
+ await newStatementStatus.save();
120
+ return newStatementStatus;
121
+ }
122
+ }
123
+ async validateDate(productId, date) {
124
+ try {
125
+ const statementsStatus = await this.getStatementStatus(productId, date);
126
+ if (statementsStatus && statementsStatus.locked) {
127
+ return 'Statement is locked!';
128
+ }
129
+ return null;
130
+ }
131
+ catch (error) {
132
+ console.error(error);
133
+ return 'Internal Server Error';
134
+ }
135
+ }
136
+ async getBorrowerStatement(borrowerId) {
137
+ try {
138
+ const lastStatementDate = this.getStatementDateFromStringPeriod('LAST_MONTH');
139
+ const currentStatementDate = this.getStatementDateFromStringPeriod('CURRENT_MONTH');
140
+ const lastStatus = await this.getBorrowerMonthStatus(borrowerId, lastStatementDate);
141
+ const currentStatus = await this.getBorrowerMonthStatus(borrowerId, currentStatementDate);
142
+ const termLoanStatus = await this.termLoanService.isBorrowerTermLoanActual(borrowerId);
143
+ return { 'LAST_MONTH': lastStatus, 'CURRENT_MONTH': currentStatus, 'TERM_LOAN': termLoanStatus };
144
+ }
145
+ catch (e) {
146
+ console.error(e);
147
+ throw e;
148
+ }
149
+ }
150
+ async getBorrowerMonthStatus(borrowerId, statementDate) {
151
+ const loanChargesService = this.getLoanChargesService();
152
+ const products = await loanChargesService.getLoanProducts(borrowerId);
153
+ const lastResults = await Promise.all(products.map(async (product) => {
154
+ return await this.getCreateStatementStatus(product._id.toString(), statementDate);
155
+ }));
156
+ return lastResults.reduce((acc, res) => res.actual && acc, true);
157
+ }
158
+ }
159
+ exports.LoanStatementStatusService = LoanStatementStatusService;
@@ -0,0 +1,177 @@
1
+ import mongoose from 'mongoose';
2
+ import dayjs from 'dayjs';
3
+
4
+ import { ISelectedMonth } from '../helpers/date.helper';
5
+
6
+ import {
7
+ ILoanStatementStatus,
8
+ LoanStatementStatusModel,
9
+ } from '../models/LoanStatementStatus.model';
10
+ import { IStatementPeriod } from './loan-statement.service';
11
+ import { LoanChargesService } from './loan-charges.service';
12
+ import { TermLoanService } from './term-loan.service';
13
+
14
+ export type SelectablePeriod = 'LAST_MONTH' | 'CURRENT_MONTH' | 'ENTIRE_LOAN' | 'SELECTED_PERIOD';
15
+
16
+ export class LoanStatementStatusService {
17
+ constructor(
18
+ private readonly getLoanChargesService: () => LoanChargesService,
19
+ private readonly termLoanService: TermLoanService,
20
+ ) {
21
+ }
22
+
23
+ async initStatementStatuses() {
24
+ const allStatuses = await LoanStatementStatusModel.find().lean();
25
+ if (allStatuses.length === 0) {
26
+ const loanChargesService = this.getLoanChargesService();
27
+ const loanProducts = await loanChargesService.getAllLoanProducts();
28
+ const endDate = dayjs().utcOffset(0).startOf('month');
29
+ for (const product of loanProducts) {
30
+ let currentDate = dayjs(product.startDate).utcOffset(0).startOf('month');
31
+ while (currentDate.diff(endDate, 'month') <= 0) {
32
+ const statementDate = this.getStatementDateForDate(currentDate.toDate());
33
+ await this.getCreateStatementStatus(product._id.toString(), statementDate);
34
+ currentDate = currentDate.add(1, 'month');
35
+ }
36
+ }
37
+ }
38
+ }
39
+
40
+ getStatementDateFromStringPeriod(period: SelectablePeriod): ISelectedMonth {
41
+ let startOf = null;
42
+ switch (period) {
43
+ case 'CURRENT_MONTH':
44
+ startOf = dayjs().utcOffset(0).startOf('month');
45
+ break;
46
+ case 'LAST_MONTH':
47
+ startOf = dayjs().utcOffset(0).startOf('month').subtract(1, 'second').startOf('month');
48
+ break;
49
+ }
50
+ if (!startOf) {
51
+ return startOf;
52
+ }
53
+ return { year: startOf.year(), month: startOf.month() + 1 };
54
+ }
55
+
56
+ getStatementDateForDate(date: Date): ISelectedMonth {
57
+ const startOf = dayjs(date).utcOffset(0).startOf('month');
58
+ return { year: startOf.year(), month: startOf.month() + 1 };
59
+ }
60
+
61
+ getStatementDateFromPeriod(period: IStatementPeriod): ISelectedMonth {
62
+ return { year: period.start.year(), month: period.start.month() + 1 };
63
+ }
64
+
65
+ getDateFromStatementDate(statementDate: ISelectedMonth): Date {
66
+ return dayjs().utcOffset(0).set('year', statementDate.year).set('month', statementDate.month - 1).startOf('month').toDate();
67
+ }
68
+
69
+ getPeriodsFromStatementDate(statementDate: ISelectedMonth): IStatementPeriod[] {
70
+ if (statementDate.month < 1 || statementDate.month > 12) {
71
+ throw new Error('Invalid month number. Month should be between 1 and 12.');
72
+ }
73
+
74
+ const startOfMonth = dayjs()
75
+ .set('year', statementDate.year)
76
+ .set('month', statementDate.month - 1)
77
+ .utcOffset(0)
78
+ .startOf('month');
79
+ const endOfMonth = startOfMonth.endOf('month');
80
+
81
+ return [{ start: startOfMonth, end: endOfMonth }];
82
+ }
83
+
84
+ async toggleStatementLock(productId: string, statementDate: ISelectedMonth) {
85
+ const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
86
+ if (statementStatus) {
87
+ statementStatus.locked = !statementStatus.locked;
88
+ await statementStatus.save();
89
+ }
90
+ }
91
+
92
+ async updateStatementStatus(productId: string, statementDate: ISelectedMonth, actual: boolean) {
93
+ const statementStatus = await this.getCreateStatementStatus(productId, statementDate);
94
+ if (statementStatus && !statementStatus.locked) {
95
+ statementStatus.actual = actual;
96
+ if (actual) {
97
+ statementStatus.lastCalculated = new Date();
98
+ }
99
+ await statementStatus.save();
100
+ }
101
+ }
102
+
103
+ async getAllStatementsStatus(statementDate: ISelectedMonth) {
104
+ await this.initStatementStatuses();
105
+ const loanChargesService = this.getLoanChargesService();
106
+ const products = await loanChargesService.getAllLoanProducts();
107
+ const results = await Promise.all(products.map(async (product) => {
108
+ const statementsStatus = await LoanStatementStatusModel.findOne({ productId: product._id, ...statementDate }).lean();
109
+ if (statementsStatus) {
110
+ return { ...statementsStatus, product };
111
+ }
112
+ return null;
113
+ }));
114
+ return results.filter((res) => !!res);
115
+ }
116
+
117
+ async getStatementStatus(productId: string, date: Date) {
118
+ const statementDate = this.getStatementDateForDate(date);
119
+ return this.getCreateStatementStatus(productId, statementDate);
120
+ }
121
+
122
+ async getCreateStatementStatus(productId: string, statementDate: ISelectedMonth) {
123
+ const statementStatus = await LoanStatementStatusModel.findOne({ productId, ...statementDate });
124
+ if (statementStatus) {
125
+ return statementStatus;
126
+ } else {
127
+ const loanStatementStatus: ILoanStatementStatus = {
128
+ productId: new mongoose.Types.ObjectId(productId),
129
+ year: statementDate.year,
130
+ month: statementDate.month,
131
+ actual: true,
132
+ locked: false,
133
+ lastCalculated: null,
134
+ };
135
+ const newStatementStatus = new LoanStatementStatusModel(loanStatementStatus);
136
+ await newStatementStatus.save();
137
+ return newStatementStatus;
138
+ }
139
+
140
+ }
141
+
142
+ async validateDate(productId: string, date: Date) {
143
+ try {
144
+ const statementsStatus = await this.getStatementStatus(productId, date);
145
+ if (statementsStatus && statementsStatus.locked) {
146
+ return 'Statement is locked!';
147
+ }
148
+ return null;
149
+ } catch (error) {
150
+ console.error(error);
151
+ return 'Internal Server Error';
152
+ }
153
+ }
154
+
155
+ async getBorrowerStatement(borrowerId: string): Promise<{ [K in SelectablePeriod | 'TERM_LOAN']?: boolean }> {
156
+ try {
157
+ const lastStatementDate = this.getStatementDateFromStringPeriod('LAST_MONTH');
158
+ const currentStatementDate = this.getStatementDateFromStringPeriod('CURRENT_MONTH');
159
+ const lastStatus = await this.getBorrowerMonthStatus(borrowerId, lastStatementDate);
160
+ const currentStatus = await this.getBorrowerMonthStatus(borrowerId, currentStatementDate);
161
+ const termLoanStatus = await this.termLoanService.isBorrowerTermLoanActual(borrowerId);
162
+ return { 'LAST_MONTH': lastStatus, 'CURRENT_MONTH': currentStatus, 'TERM_LOAN': termLoanStatus };
163
+ } catch (e) {
164
+ console.error(e);
165
+ throw e;
166
+ }
167
+ }
168
+
169
+ async getBorrowerMonthStatus(borrowerId: string, statementDate: ISelectedMonth) {
170
+ const loanChargesService = this.getLoanChargesService();
171
+ const products = await loanChargesService.getLoanProducts(borrowerId);
172
+ const lastResults = await Promise.all(products.map(async (product) => {
173
+ return await this.getCreateStatementStatus(product._id.toString(), statementDate);
174
+ }));
175
+ return lastResults.reduce((acc, res) => res.actual && acc, true);
176
+ }
177
+ }
@@ -0,0 +1,186 @@
1
+ /// <reference types="lodash" />
2
+ /// <reference types="mongoose/types/aggregate" />
3
+ /// <reference types="mongoose/types/callback" />
4
+ /// <reference types="mongoose/types/collection" />
5
+ /// <reference types="mongoose/types/connection" />
6
+ /// <reference types="mongoose/types/cursor" />
7
+ /// <reference types="mongoose/types/document" />
8
+ /// <reference types="mongoose/types/error" />
9
+ /// <reference types="mongoose/types/expressions" />
10
+ /// <reference types="mongoose/types/helpers" />
11
+ /// <reference types="mongoose/types/middlewares" />
12
+ /// <reference types="mongoose/types/indexes" />
13
+ /// <reference types="mongoose/types/models" />
14
+ /// <reference types="mongoose/types/mongooseoptions" />
15
+ /// <reference types="mongoose/types/pipelinestage" />
16
+ /// <reference types="mongoose/types/populate" />
17
+ /// <reference types="mongoose/types/query" />
18
+ /// <reference types="mongoose/types/schemaoptions" />
19
+ /// <reference types="mongoose/types/schematypes" />
20
+ /// <reference types="mongoose/types/session" />
21
+ /// <reference types="mongoose/types/types" />
22
+ /// <reference types="mongoose/types/utility" />
23
+ /// <reference types="mongoose/types/validation" />
24
+ /// <reference types="mongoose/types/virtuals" />
25
+ /// <reference types="mongoose" />
26
+ /// <reference types="mongoose/types/inferschematype" />
27
+ import dayjs from 'dayjs';
28
+ import { ILoanStatementTransactionDoc, ILoanStatementTransactionWithId } from '../models/LoanStatementTransaction.model';
29
+ import { ELedgerReportType } from '../db/loan-statement.db';
30
+ import { FinancialIndexesService } from './financial-indexes.service';
31
+ import { LoanTransactionsService } from './loan-transactions.service';
32
+ import { LoanStatementStatusService, SelectablePeriod } from './loan-statement-status.service';
33
+ import { LoanChargesService } from './loan-charges.service';
34
+ import { LoanPaymentsService } from './loan-payments.service';
35
+ import { LoanStatementBalanceService } from './loan-statement-balance.service';
36
+ import { TermLoanService } from './term-loan.service';
37
+ import { UploadsService } from './uploads.service';
38
+ import { LoanStatementEffectsService } from './loan-statement-effects.service';
39
+ export interface IStatementPeriod {
40
+ start: dayjs.Dayjs;
41
+ end: dayjs.Dayjs;
42
+ }
43
+ export declare class LoanStatementService {
44
+ private readonly financialIndexesService;
45
+ private readonly loanChargesService;
46
+ private readonly loanPaymentsService;
47
+ private readonly loanStatementBalanceService;
48
+ private readonly loanStatementStatusService;
49
+ private readonly loanTransactionsService;
50
+ private readonly termLoanService;
51
+ private readonly uploadsService;
52
+ private readonly getLoanStatementEffectsService;
53
+ constructor(financialIndexesService: FinancialIndexesService, loanChargesService: LoanChargesService, loanPaymentsService: LoanPaymentsService, loanStatementBalanceService: LoanStatementBalanceService, loanStatementStatusService: LoanStatementStatusService, loanTransactionsService: LoanTransactionsService, termLoanService: TermLoanService, uploadsService: UploadsService, getLoanStatementEffectsService: () => LoanStatementEffectsService);
54
+ private getGroupedData;
55
+ getTransactionById(transactionId: string): Promise<import("mongoose").FlattenMaps<ILoanStatementTransactionDoc> & {
56
+ _id: import("mongoose").Types.ObjectId;
57
+ }>;
58
+ getFirstStatementTransaction(productId: string): Promise<ILoanStatementTransactionDoc>;
59
+ getBorrowerWithPeriods(borrowerId: string, period: {
60
+ selectedPeriod: string;
61
+ selectedStart: Date;
62
+ selectedEnd: Date;
63
+ }, splitPeriods?: boolean): Promise<any[]>;
64
+ getPeriods(selectedPeriod: string, productId: string): Promise<IStatementPeriod[]>;
65
+ getDays(period: {
66
+ start: dayjs.Dayjs;
67
+ end: dayjs.Dayjs;
68
+ }): string[];
69
+ calculateBorrowerStatement(borrowerId: string, selectedPeriod: SelectablePeriod): Promise<void>;
70
+ recalculateAllProducts(): Promise<void>;
71
+ calculateAllBorrowers(): Promise<void>;
72
+ calculateProductStatement(productId: string, periods: IStatementPeriod[]): Promise<void>;
73
+ useFloatingBalance(productId: string): Promise<boolean>;
74
+ calculateStatement(productId: string, period: IStatementPeriod, statementDate?: Date): Promise<void>;
75
+ reorderStatementForDate(productId: string, date: Date): Promise<void>;
76
+ getBalancesDaily(productId: string, period: {
77
+ start: Date;
78
+ end: Date;
79
+ }): Promise<{
80
+ balance: number;
81
+ floatedBalance: number;
82
+ day: string;
83
+ }[]>;
84
+ private calculateDisbursementFee;
85
+ cleanProductStatement(productId: string, statementDate: Date): Promise<void>;
86
+ cleanProductAllStatements(chargesId: string[]): Promise<void>;
87
+ getProductStatementPdfData(productId: string, start: string, end: string): Promise<{
88
+ groupedData: {
89
+ INTEREST_FEE: number;
90
+ ADMIN_FEE: number;
91
+ UNUSED_LINE_FEE: number;
92
+ WIRE_FEE: number;
93
+ ANNUAL_LINE_FEE: number;
94
+ };
95
+ otherStatements: any[];
96
+ totalAmount: number;
97
+ transactions: import("../models/LoanTransaction.model").ILoanTransactionViewWithBank[];
98
+ }>;
99
+ getProductShortStatementRepresentation(productId: string, start: string, end: string): Promise<any[][]>;
100
+ createStatementTransaction(transaction: Partial<ILoanStatementTransactionWithId>): Promise<void>;
101
+ updateStatementTransaction(transaction: Partial<ILoanStatementTransactionWithId>): Promise<void>;
102
+ saveLoanTransaction(transaction: Partial<ILoanStatementTransactionWithId>): Promise<void>;
103
+ deleteStatementTransaction(transactionId: string): Promise<void>;
104
+ addBalancesToStatements(transactionDocs: ILoanStatementTransactionDoc[]): Promise<{
105
+ floatedBalance: number;
106
+ order: number;
107
+ date: Date;
108
+ chargeId: import("mongoose").Types.ObjectId;
109
+ amount: number;
110
+ amountPaid?: number;
111
+ balance?: number;
112
+ isSystem: boolean;
113
+ memo: string;
114
+ settlementCode?: string;
115
+ userId?: import("mongoose").Types.ObjectId;
116
+ isEditable?: boolean;
117
+ _id?: any;
118
+ __v?: any;
119
+ $locals: Record<string, unknown>;
120
+ $op: "save" | "validate" | "remove";
121
+ $where: Record<string, unknown>;
122
+ baseModelName?: string;
123
+ collection: import("mongoose").Collection<import("bson").Document>;
124
+ db: import("mongoose").Connection;
125
+ errors?: import("mongoose").Error.ValidationError;
126
+ id?: any;
127
+ isNew: boolean;
128
+ schema: import("mongoose").Schema<any, import("mongoose").Model<any, any, any, any, any, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, {
129
+ [x: string]: unknown;
130
+ }, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<{
131
+ [x: string]: unknown;
132
+ }>> & import("mongoose").FlatRecord<{
133
+ [x: string]: unknown;
134
+ }> & Required<{
135
+ _id: unknown;
136
+ }>>;
137
+ }[]>;
138
+ getLastTransactionOrder(transaction: Partial<ILoanStatementTransactionDoc>, onlySystem?: boolean): Promise<number>;
139
+ getPreviousTransaction(transaction: ILoanStatementTransactionDoc): Promise<ILoanStatementTransactionDoc>;
140
+ getTransactionsFromDate(productId: string, startDate: Date): Promise<ILoanStatementTransactionDoc[]>;
141
+ getTransactionsForPeriod(productId: string, period: {
142
+ start: Date;
143
+ end: Date;
144
+ }): Promise<ILoanStatementTransactionDoc[]>;
145
+ recalculateAllBalances(borrowerIds: string[], userId: string): Promise<void>;
146
+ recalculateAllStatements(selectedPeriod: SelectablePeriod, borrowerIds: string[]): Promise<void>;
147
+ recalculateAllTermLoans(borrowerIds: string[]): Promise<void>;
148
+ getStatementBorrowersTransactions(start: string, end: string, selectedPeriod: string, selectedBorrowerIds: string[], ledgerType: ELedgerReportType): Promise<{
149
+ transactions: ({
150
+ borrowerCode: string;
151
+ type: string;
152
+ chargeCode: string;
153
+ PLCode: string;
154
+ productCode: string;
155
+ productName: string;
156
+ info: string;
157
+ title: string;
158
+ amount: string;
159
+ statementAmount: string;
160
+ } | import("lodash").Omit<import("../db/reports.db").ILedgerReportRow, "balance" | "floatedBalance">)[];
161
+ }[]>;
162
+ getBorrowerComplianceData(borrowerId: string, date: Date): Promise<{
163
+ productTotals: {
164
+ [productId: string]: number;
165
+ };
166
+ total: number;
167
+ totalPaid: number;
168
+ dueDate: any;
169
+ }>;
170
+ private getOutstandingStatements;
171
+ getOutstandingStatementsExcel(borrowerIds: string[], selectedDate: Date, fullMonth: boolean): Promise<any>;
172
+ getBorrowerProductTotals(borrowerId: string): Promise<{
173
+ productTotals: {
174
+ [productId: string]: number;
175
+ };
176
+ total: number;
177
+ totalPaid: number;
178
+ dueDate: any;
179
+ }>;
180
+ getProductsTotals(productIds: string[]): Promise<{
181
+ [productId: string]: number;
182
+ }>;
183
+ private getAccruedStatement;
184
+ calculateAccruedStatementForBBC(bbcDateId: string): Promise<number>;
185
+ calculateAccruedStatementForBorrower(borrowerId: string): Promise<number>;
186
+ }