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,268 @@
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.BorrowerService = exports.borrowerDataModels = void 0;
7
+ const mongoose_1 = __importDefault(require("mongoose"));
8
+ const BorrowerSettings_model_1 = require("../models/BorrowerSettings.model");
9
+ const Borrower_model_1 = require("../models/Borrower.model");
10
+ const BorrowerData_model_1 = require("../models/BorrowerData.model");
11
+ const BorrowerDataContact_model_1 = require("../models/BorrowerDataContact.model");
12
+ const BorrowerDataGuarantee_model_1 = require("../models/BorrowerDataGuarantee.model");
13
+ const BorrowerDataLocation_model_1 = require("../models/BorrowerDataLocation.model");
14
+ const BorrowerDataBank_model_1 = require("../models/BorrowerDataBank.model");
15
+ const BorrowerDataInsurance_model_1 = require("../models/BorrowerDataInsurance.model");
16
+ const BorrowerDataReceivable_model_1 = require("../models/BorrowerDataReceivable.model");
17
+ const BorrowerDataInventory_model_1 = require("../models/BorrowerDataInventory.model");
18
+ const BorrowerDataTerm_model_1 = require("../models/BorrowerDataTerm.model");
19
+ const BorrowerDataBootCollateral_model_1 = require("../models/BorrowerDataBootCollateral.model");
20
+ exports.borrowerDataModels = {
21
+ receivables: BorrowerDataReceivable_model_1.BorrowerDataReceivableModel,
22
+ inventories: BorrowerDataInventory_model_1.BorrowerDataInventoryModel,
23
+ terms: BorrowerDataTerm_model_1.BorrowerDataTermModel,
24
+ bootCollaterals: BorrowerDataBootCollateral_model_1.BorrowerDataBootCollateralModel,
25
+ contacts: BorrowerDataContact_model_1.BorrowerDataContactModel,
26
+ guarantees: BorrowerDataGuarantee_model_1.BorrowerDataGuaranteeModel,
27
+ locations: BorrowerDataLocation_model_1.BorrowerDataLocationModel,
28
+ banks: BorrowerDataBank_model_1.BorrowerDataBankModel,
29
+ insurance: BorrowerDataInsurance_model_1.BorrowerDataInsuranceModel,
30
+ };
31
+ class BorrowerService {
32
+ collateralsService;
33
+ loanStatementStatusService;
34
+ loanTransactionsService;
35
+ signsService;
36
+ constructor(collateralsService, loanStatementStatusService, loanTransactionsService, signsService) {
37
+ this.collateralsService = collateralsService;
38
+ this.loanStatementStatusService = loanStatementStatusService;
39
+ this.loanTransactionsService = loanTransactionsService;
40
+ this.signsService = signsService;
41
+ }
42
+ isBorrowerAllowed(userAccess, requestedBorrowerId) {
43
+ if (userAccess.allBorrowers) {
44
+ return true;
45
+ }
46
+ return userAccess.borrowersAccess.some((b) => b.borrower === requestedBorrowerId);
47
+ }
48
+ checkBorrower(userAccess, requestedBorrowerId) {
49
+ const allowedBorrower = this.isBorrowerAllowed(userAccess, requestedBorrowerId);
50
+ if (!allowedBorrower) {
51
+ throw new Error('Non allowed borrower');
52
+ }
53
+ return true;
54
+ }
55
+ async getBorrowerById(borrowerId) {
56
+ return Borrower_model_1.BorrowerModel.findById(borrowerId).lean();
57
+ }
58
+ async isNameCodeAllowed(borrower) {
59
+ const existingUserName = await Borrower_model_1.BorrowerModel.findOne({ name: borrower.name });
60
+ const existingUserCode = await Borrower_model_1.BorrowerModel.findOne({ code: borrower.code });
61
+ if (existingUserName && existingUserName.id !== borrower._id) {
62
+ return { message: 'There already exists a borrower with this name' };
63
+ }
64
+ if (existingUserCode && existingUserCode.id !== borrower._id) {
65
+ return { message: 'There already exists a borrower with this code' };
66
+ }
67
+ return null;
68
+ }
69
+ async getDefaultSettings(borrowerId) {
70
+ const options = await BorrowerData_model_1.BorrowerDataOptionModel.find().lean();
71
+ const dataOptions = options.reduce((acc, option) => {
72
+ return [
73
+ ...acc,
74
+ { dataOption: option._id, dataValue: option.type === 'boolean' ? false : '' },
75
+ ];
76
+ }, []);
77
+ const defaultSettings = {
78
+ borrower: new mongoose_1.default.Types.ObjectId(borrowerId),
79
+ queries: {
80
+ inventory: {},
81
+ receivable: {},
82
+ 'account payable': {},
83
+ other: {},
84
+ cash: {},
85
+ },
86
+ dataTypes: {
87
+ upload: [],
88
+ },
89
+ data: {
90
+ options: dataOptions,
91
+ receivables: [],
92
+ inventories: [],
93
+ contacts: [],
94
+ guarantees: [],
95
+ banks: [],
96
+ insurance: [],
97
+ locations: [],
98
+ terms: [],
99
+ bootCollaterals: [],
100
+ },
101
+ dataAvailability: {
102
+ receivables: false,
103
+ inventories: false,
104
+ },
105
+ };
106
+ return defaultSettings;
107
+ }
108
+ async addOptionNames(unmappedSettings) {
109
+ const borrowerDataOptions = await BorrowerData_model_1.BorrowerDataOptionModel.find().lean();
110
+ const borrowerDataOptionsMap = new Map();
111
+ borrowerDataOptions.forEach((option) => borrowerDataOptionsMap.set(option._id.toString(), option.name));
112
+ unmappedSettings.data.options = unmappedSettings.data.options.map((item) => {
113
+ const dataName = borrowerDataOptionsMap.get(item.dataOption.toString());
114
+ return { ...item, dataName };
115
+ });
116
+ return unmappedSettings;
117
+ }
118
+ async getBorrowerOption(borrowerId, optionName) {
119
+ const borrowerSettings = await this.getBorrowerSettings(borrowerId);
120
+ if (!borrowerSettings) {
121
+ return null;
122
+ }
123
+ const foundOption = borrowerSettings.data.options.find((option) => option.dataName === optionName);
124
+ if (!foundOption) {
125
+ return null;
126
+ }
127
+ return foundOption;
128
+ }
129
+ async getBorrowerSettings(borrowerId) {
130
+ const borrowerSettings = await BorrowerSettings_model_1.BorrowerSettingsModel
131
+ .findOne({ borrower: borrowerId })
132
+ .populate('data.options')
133
+ .populate('data.receivables')
134
+ .populate('data.inventories')
135
+ .populate('data.terms')
136
+ .populate('data.bootCollaterals')
137
+ .populate('data.contacts')
138
+ .populate('data.guarantees')
139
+ .populate('data.locations')
140
+ .populate('data.banks')
141
+ .populate('data.insurance')
142
+ .lean();
143
+ const options = await BorrowerData_model_1.BorrowerDataOptionModel.find({}).lean();
144
+ if (borrowerSettings?.data?.options) {
145
+ borrowerSettings.data.options = borrowerSettings.data.options.sort((a, b) => {
146
+ const foundA = options.find((option) => option._id.toString() === a.dataOption.toString());
147
+ const foundB = options.find((option) => option._id.toString() === b.dataOption.toString());
148
+ if (!foundA || !foundB) {
149
+ return 0;
150
+ }
151
+ return foundA.order - foundB.order;
152
+ });
153
+ }
154
+ const unmappedSettings = borrowerSettings ? borrowerSettings : await this.getDefaultSettings(borrowerId);
155
+ return await this.addOptionNames(unmappedSettings);
156
+ }
157
+ async getBorrowerByCode(code) {
158
+ return Borrower_model_1.BorrowerModel.findOne({ code });
159
+ }
160
+ async getExtraInfo(borrowerId) {
161
+ const extraInfo = await this.loanTransactionsService.getLoanBalanceForBorrowerId(borrowerId);
162
+ const { lastBBCDate, lastBBCId } = await this.collateralsService.getLatestBBCDate(borrowerId);
163
+ const lastSignedBBCDate = await this.signsService.getLatestSignedBBCDate(borrowerId);
164
+ return {
165
+ extraInfo,
166
+ lastBBCDate,
167
+ lastBBCId,
168
+ lastSignedBBCDate: lastSignedBBCDate?.bbcDate || null,
169
+ lastSignedBBCId: lastSignedBBCDate?._id.toString() || null,
170
+ };
171
+ }
172
+ async updateBorrowerData(borrowerSettings) {
173
+ const results = await Promise.all(Object.entries(exports.borrowerDataModels).map(async ([modelName, model]) => {
174
+ const newIds = await Promise.all(borrowerSettings.data[modelName].map(async (contact) => {
175
+ if (!contact._id) {
176
+ delete contact._id;
177
+ const newContact = new model(contact);
178
+ const savedContact = await newContact.save();
179
+ return savedContact._id;
180
+ }
181
+ await model.findByIdAndUpdate(contact._id, contact);
182
+ return new mongoose_1.default.Types.ObjectId(contact._id);
183
+ }));
184
+ return { [modelName]: newIds };
185
+ }));
186
+ return results.reduce((acc, modelCollection) => {
187
+ const collections = Object.entries(modelCollection).reduce((innerAcc, [modelName, ids]) => {
188
+ return { ...innerAcc, [modelName]: ids };
189
+ }, {});
190
+ return { ...acc, ...collections };
191
+ }, {});
192
+ }
193
+ async updateBorrowerSettings(borrowerId, borrowerSettings) {
194
+ const newOptions = [];
195
+ await Promise.all(borrowerSettings.data.options.map(async (option) => {
196
+ if (option._id) {
197
+ await BorrowerData_model_1.BorrowerDataModel.findByIdAndUpdate(option._id, { dataValue: option.dataValue });
198
+ }
199
+ else {
200
+ const newOption = await BorrowerData_model_1.BorrowerDataModel.create(option);
201
+ await newOption.save();
202
+ newOptions.push(newOption._id);
203
+ }
204
+ }));
205
+ const oldSettings = await BorrowerSettings_model_1.BorrowerSettingsModel.findOne({ borrower: borrowerId }).lean();
206
+ const updatedData = await this.updateBorrowerData(borrowerSettings);
207
+ await Promise.all(Object.keys(exports.borrowerDataModels).map(async (modelName) => {
208
+ borrowerSettings.data[modelName] = updatedData[modelName];
209
+ if (oldSettings) {
210
+ const oldIds = oldSettings.data[modelName].map((id) => id.toString());
211
+ const updatedIds = updatedData[modelName].map((id) => id.toString());
212
+ const idsToRemoved = oldIds.reduce((acc, oldId) => {
213
+ if (updatedIds.find((id) => id === oldId)) {
214
+ return acc;
215
+ }
216
+ return [...acc, oldId];
217
+ }, []);
218
+ await Promise.all(idsToRemoved.map(async (id) => {
219
+ await exports.borrowerDataModels[modelName].findByIdAndDelete(id);
220
+ }));
221
+ }
222
+ }));
223
+ const foundSettings = await BorrowerSettings_model_1.BorrowerSettingsModel.findOne({ borrower: borrowerId });
224
+ if (foundSettings) {
225
+ await BorrowerSettings_model_1.BorrowerSettingsModel.findOneAndUpdate({ borrower: borrowerId }, { borrower: borrowerId, ...borrowerSettings }, { upsert: true });
226
+ }
227
+ else {
228
+ const newSettings = await BorrowerSettings_model_1.BorrowerSettingsModel.create({ borrower: borrowerId, ...borrowerSettings, data: { ...borrowerSettings.data, options: newOptions } });
229
+ await newSettings.save();
230
+ }
231
+ }
232
+ async getBorrowerCodesMap() {
233
+ const borrowers = await Borrower_model_1.BorrowerModel.find().lean();
234
+ const codesMap = new Map();
235
+ borrowers.forEach((borrower) => {
236
+ codesMap.set(borrower.code.toLowerCase(), borrower._id.toString());
237
+ });
238
+ return codesMap;
239
+ }
240
+ async getAllBorrowers() {
241
+ return Borrower_model_1.BorrowerModel.find().sort({ name: 1 }).lean();
242
+ }
243
+ async getActiveBorrowers() {
244
+ return Borrower_model_1.BorrowerModel.find({ active: true }).sort({ name: 1 }).lean();
245
+ }
246
+ async getAllowedBorrowers(user) {
247
+ return Borrower_model_1.BorrowerModel
248
+ .find(user.allBorrowers ? {} : { '_id': { $in: user.borrowersAccess.map((b) => b.borrower) } })
249
+ .collation({ locale: 'en' })
250
+ .sort({ code: 1 })
251
+ .lean();
252
+ }
253
+ async getBorrowerStatementDetails(borrowers) {
254
+ const allBorrowersWithExtraInfo = await Promise.all(borrowers.map(async (borrower) => {
255
+ const borrowerId = borrower._id.toString();
256
+ const statementStatuses = await this.loanStatementStatusService.getBorrowerStatement(borrowerId);
257
+ return { [borrowerId]: statementStatuses };
258
+ }));
259
+ return allBorrowersWithExtraInfo.reduce((acc, borrower) => {
260
+ const borrowerRes = Object.entries(borrower).reduce((innerAcc, [borrowerId, values]) => ({
261
+ ...innerAcc,
262
+ [borrowerId]: values,
263
+ }), {});
264
+ return { ...acc, ...borrowerRes };
265
+ }, {});
266
+ }
267
+ }
268
+ exports.BorrowerService = BorrowerService;
@@ -0,0 +1,302 @@
1
+ import mongoose from 'mongoose';
2
+
3
+ import {
4
+ BorrowerSettingsModel,
5
+ IBorrowerSettings,
6
+ IBorrowerSettingsDocPopulated,
7
+ } from '../models/BorrowerSettings.model';
8
+ import { BorrowerModel, IBorrowerDocument } from '../models/Borrower.model';
9
+ import {
10
+ BorrowerDataModel,
11
+ BorrowerDataOptionModel,
12
+ IBorrowerDataDocWithName,
13
+ } from '../models/BorrowerData.model';
14
+ import { BorrowerDataContactModel } from '../models/BorrowerDataContact.model';
15
+ import { BorrowerDataGuaranteeModel } from '../models/BorrowerDataGuarantee.model';
16
+ import { BorrowerDataLocationModel } from '../models/BorrowerDataLocation.model';
17
+ import { BorrowerDataBankModel } from '../models/BorrowerDataBank.model';
18
+ import { BorrowerDataInsuranceModel } from '../models/BorrowerDataInsurance.model';
19
+ import { BorrowerDataReceivableModel } from '../models/BorrowerDataReceivable.model';
20
+ import { BorrowerDataInventoryModel } from '../models/BorrowerDataInventory.model';
21
+ import { BorrowerDataTermModel } from '../models/BorrowerDataTerm.model';
22
+ import { BorrowerDataBootCollateralModel } from '../models/BorrowerDataBootCollateral.model';
23
+ import { IUser } from '../models/User.model';
24
+ import { CollateralsService } from './collaterals.service';
25
+ import { LoanStatementStatusService } from './loan-statement-status.service';
26
+ import { LoanTransactionsService } from './loan-transactions.service';
27
+ import { SignsService } from './signs.service';
28
+
29
+ export const borrowerDataModels: {
30
+ [modelName: string]: mongoose.Model<any>
31
+ } = {
32
+ receivables: BorrowerDataReceivableModel,
33
+ inventories: BorrowerDataInventoryModel,
34
+ terms: BorrowerDataTermModel,
35
+ bootCollaterals: BorrowerDataBootCollateralModel,
36
+ contacts: BorrowerDataContactModel,
37
+ guarantees: BorrowerDataGuaranteeModel,
38
+ locations: BorrowerDataLocationModel,
39
+ banks: BorrowerDataBankModel,
40
+ insurance: BorrowerDataInsuranceModel,
41
+ };
42
+
43
+ export class BorrowerService {
44
+
45
+ constructor(
46
+ private readonly collateralsService: CollateralsService,
47
+ private readonly loanStatementStatusService: LoanStatementStatusService,
48
+ private readonly loanTransactionsService: LoanTransactionsService,
49
+ private readonly signsService: SignsService,
50
+ ) {
51
+ }
52
+
53
+
54
+ isBorrowerAllowed(userAccess, requestedBorrowerId: string): boolean {
55
+ if (userAccess.allBorrowers) {
56
+ return true;
57
+ }
58
+ return userAccess.borrowersAccess.some((b) => b.borrower === requestedBorrowerId);
59
+ }
60
+
61
+ checkBorrower(userAccess, requestedBorrowerId: string): boolean {
62
+ const allowedBorrower = this.isBorrowerAllowed(userAccess, requestedBorrowerId);
63
+ if (!allowedBorrower) {
64
+ throw new Error('Non allowed borrower');
65
+ }
66
+ return true;
67
+ }
68
+
69
+ async getBorrowerById(borrowerId: string) {
70
+ return BorrowerModel.findById(borrowerId).lean();
71
+ }
72
+
73
+ async isNameCodeAllowed(borrower: IBorrowerDocument) {
74
+ const existingUserName = await BorrowerModel.findOne({ name: borrower.name });
75
+ const existingUserCode = await BorrowerModel.findOne({ code: borrower.code });
76
+ if (existingUserName && existingUserName.id !== borrower._id) {
77
+ return { message: 'There already exists a borrower with this name' };
78
+ }
79
+ if (existingUserCode && existingUserCode.id !== borrower._id) {
80
+ return { message: 'There already exists a borrower with this code' };
81
+ }
82
+ return null;
83
+ }
84
+
85
+ private async getDefaultSettings(borrowerId: string) {
86
+ const options = await BorrowerDataOptionModel.find().lean();
87
+ const dataOptions = options.reduce((acc, option) => {
88
+ return [
89
+ ...acc,
90
+ { dataOption: option._id, dataValue: option.type === 'boolean' ? false : '' },
91
+ ];
92
+ }, []);
93
+ const defaultSettings: IBorrowerSettings = {
94
+ borrower: new mongoose.Types.ObjectId(borrowerId),
95
+ queries: {
96
+ inventory: {},
97
+ receivable: {},
98
+ 'account payable': {},
99
+ other: {},
100
+ cash: {},
101
+ },
102
+ dataTypes: {
103
+ upload: [],
104
+ },
105
+ data: {
106
+ options: dataOptions,
107
+ receivables: [],
108
+ inventories: [],
109
+ contacts: [],
110
+ guarantees: [],
111
+ banks: [],
112
+ insurance: [],
113
+ locations: [],
114
+ terms: [],
115
+ bootCollaterals: [],
116
+ },
117
+ dataAvailability: {
118
+ receivables: false,
119
+ inventories: false,
120
+ },
121
+ };
122
+ return defaultSettings;
123
+ }
124
+
125
+ private async addOptionNames(unmappedSettings: IBorrowerSettingsDocPopulated) {
126
+ const borrowerDataOptions = await BorrowerDataOptionModel.find().lean();
127
+ const borrowerDataOptionsMap = new Map();
128
+ borrowerDataOptions.forEach((option) => borrowerDataOptionsMap.set(option._id.toString(), option.name));
129
+ unmappedSettings.data.options = unmappedSettings.data.options.map((item) => {
130
+ const dataName: string = borrowerDataOptionsMap.get(item.dataOption.toString());
131
+ return { ...item, dataName } as unknown as IBorrowerDataDocWithName;
132
+ });
133
+ return unmappedSettings;
134
+ }
135
+
136
+ async getBorrowerOption(borrowerId: string, optionName: string): Promise<IBorrowerDataDocWithName> {
137
+ const borrowerSettings = await this.getBorrowerSettings(borrowerId);
138
+ if (!borrowerSettings) {
139
+ return null;
140
+ }
141
+ const foundOption = borrowerSettings.data.options.find((option) => option.dataName === optionName);
142
+ if (!foundOption) {
143
+ return null;
144
+ }
145
+ return foundOption;
146
+ }
147
+
148
+ async getBorrowerSettings(borrowerId: string) {
149
+ const borrowerSettings = await BorrowerSettingsModel
150
+ .findOne({ borrower: borrowerId })
151
+ .populate('data.options')
152
+ .populate('data.receivables')
153
+ .populate('data.inventories')
154
+ .populate('data.terms')
155
+ .populate('data.bootCollaterals')
156
+ .populate('data.contacts')
157
+ .populate('data.guarantees')
158
+ .populate('data.locations')
159
+ .populate('data.banks')
160
+ .populate('data.insurance')
161
+ .lean() as unknown as IBorrowerSettingsDocPopulated;
162
+ const options = await BorrowerDataOptionModel.find({}).lean();
163
+ if (borrowerSettings?.data?.options) {
164
+ borrowerSettings.data.options = borrowerSettings.data.options.sort((a, b) => {
165
+ const foundA = options.find((option) => option._id.toString() === a.dataOption.toString());
166
+ const foundB = options.find((option) => option._id.toString() === b.dataOption.toString());
167
+ if (!foundA || !foundB) {
168
+ return 0;
169
+ }
170
+ return foundA.order - foundB.order;
171
+ });
172
+ }
173
+ const unmappedSettings = borrowerSettings ? borrowerSettings : await this.getDefaultSettings(borrowerId);
174
+ return await this.addOptionNames(unmappedSettings as IBorrowerSettingsDocPopulated);
175
+ }
176
+
177
+ async getBorrowerByCode(code: string): Promise<IBorrowerDocument> {
178
+ return BorrowerModel.findOne({ code });
179
+ }
180
+
181
+ async getExtraInfo(borrowerId: string) {
182
+ const extraInfo = await this.loanTransactionsService.getLoanBalanceForBorrowerId(borrowerId);
183
+ const { lastBBCDate, lastBBCId } = await this.collateralsService.getLatestBBCDate(borrowerId);
184
+ const lastSignedBBCDate = await this.signsService.getLatestSignedBBCDate(borrowerId);
185
+ return {
186
+ extraInfo,
187
+ lastBBCDate,
188
+ lastBBCId,
189
+ lastSignedBBCDate: lastSignedBBCDate?.bbcDate || null,
190
+ lastSignedBBCId: lastSignedBBCDate?._id.toString() || null,
191
+ };
192
+ }
193
+
194
+ async updateBorrowerData(borrowerSettings: IBorrowerSettingsDocPopulated) {
195
+ const results = await Promise.all(Object.entries(borrowerDataModels).map(async ([modelName, model]) => {
196
+ const newIds: mongoose.Types.ObjectId[] = await Promise.all(borrowerSettings.data[modelName].map(async (contact: any) => {
197
+ if (!contact._id) {
198
+ delete contact._id;
199
+ const newContact = new model(contact);
200
+ const savedContact = await newContact.save();
201
+ return savedContact._id;
202
+ }
203
+ await model.findByIdAndUpdate(contact._id, contact);
204
+ return new mongoose.Types.ObjectId(contact._id);
205
+ }));
206
+ return { [modelName]: newIds };
207
+ }));
208
+
209
+ return results.reduce((acc, modelCollection) => {
210
+ const collections = Object.entries(modelCollection).reduce((innerAcc, [modelName, ids]) => {
211
+ return { ...innerAcc, [modelName]: ids };
212
+ }, {});
213
+ return { ...acc, ...collections };
214
+ }, {});
215
+ }
216
+
217
+ async updateBorrowerSettings(borrowerId: string, borrowerSettings: IBorrowerSettingsDocPopulated) {
218
+ const newOptions = [];
219
+ await Promise.all(borrowerSettings.data.options.map(async (option) => {
220
+ if (option._id) {
221
+ await BorrowerDataModel.findByIdAndUpdate(option._id, { dataValue: option.dataValue });
222
+ } else {
223
+ const newOption = await BorrowerDataModel.create(option);
224
+ await newOption.save();
225
+ newOptions.push(newOption._id);
226
+ }
227
+ }));
228
+ const oldSettings = await BorrowerSettingsModel.findOne({ borrower: borrowerId }).lean();
229
+ const updatedData = await this.updateBorrowerData(borrowerSettings);
230
+ await Promise.all(Object.keys(borrowerDataModels).map(async (modelName) => {
231
+ borrowerSettings.data[modelName] = updatedData[modelName];
232
+ if (oldSettings) {
233
+ const oldIds: string[] = oldSettings.data[modelName].map((id) => id.toString());
234
+ const updatedIds = updatedData[modelName].map((id) => id.toString());
235
+ const idsToRemoved = oldIds.reduce((acc, oldId) => {
236
+ if (updatedIds.find((id) => id === oldId)) {
237
+ return acc;
238
+ }
239
+ return [...acc, oldId];
240
+ }, []);
241
+ await Promise.all(idsToRemoved.map(async (id) => {
242
+ await borrowerDataModels[modelName].findByIdAndDelete(id);
243
+ }));
244
+ }
245
+ }),
246
+ );
247
+ const foundSettings = await BorrowerSettingsModel.findOne({ borrower: borrowerId });
248
+ if (foundSettings) {
249
+ await BorrowerSettingsModel.findOneAndUpdate(
250
+ { borrower: borrowerId },
251
+ { borrower: borrowerId, ...borrowerSettings },
252
+ { upsert: true },
253
+ );
254
+ } else {
255
+ const newSettings = await BorrowerSettingsModel.create(
256
+ { borrower: borrowerId, ...borrowerSettings, data: { ...borrowerSettings.data, options: newOptions } },
257
+ );
258
+ await newSettings.save();
259
+ }
260
+ }
261
+
262
+ async getBorrowerCodesMap() {
263
+ const borrowers = await BorrowerModel.find().lean();
264
+ const codesMap = new Map<string, string>();
265
+ borrowers.forEach((borrower) => {
266
+ codesMap.set(borrower.code.toLowerCase(), borrower._id.toString());
267
+ });
268
+ return codesMap;
269
+ }
270
+
271
+ async getAllBorrowers() {
272
+ return BorrowerModel.find().sort({ name: 1 }).lean();
273
+ }
274
+
275
+ async getActiveBorrowers() {
276
+ return BorrowerModel.find({ active: true }).sort({ name: 1 }).lean();
277
+ }
278
+
279
+ async getAllowedBorrowers(user: IUser) {
280
+ return BorrowerModel
281
+ .find(user.allBorrowers ? {} : { '_id': { $in: user.borrowersAccess.map((b) => b.borrower) } })
282
+ .collation({ locale: 'en' })
283
+ .sort({ code: 1 })
284
+ .lean();
285
+ }
286
+
287
+ async getBorrowerStatementDetails(borrowers: IBorrowerDocument[]) {
288
+ const allBorrowersWithExtraInfo = await Promise.all(borrowers.map(async (borrower) => {
289
+ const borrowerId = borrower._id.toString();
290
+ const statementStatuses = await this.loanStatementStatusService.getBorrowerStatement(borrowerId);
291
+ return { [borrowerId]: statementStatuses };
292
+ }));
293
+ return allBorrowersWithExtraInfo.reduce((acc, borrower) => {
294
+ const borrowerRes = Object.entries(borrower).reduce((innerAcc, [borrowerId, values]) => ({
295
+ ...innerAcc,
296
+ [borrowerId]: values,
297
+ }), {});
298
+ return { ...acc, ...borrowerRes };
299
+ }, {});
300
+ }
301
+
302
+ }