@lyxa.ai/core 1.4.32 → 1.4.34
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.
- package/dist/libraries/cash-settlement/providers/bob.d.ts +10 -0
- package/dist/libraries/cash-settlement/providers/bob.js +37 -28
- package/dist/libraries/cash-settlement/providers/bob.js.map +1 -1
- package/dist/libraries/firebase/fcmService.js +5 -4
- package/dist/libraries/firebase/fcmService.js.map +1 -1
- package/dist/libraries/mongo/models/cart-participant.model.d.ts +2 -0
- package/dist/libraries/mongo/models/cart-participant.model.js +6 -0
- package/dist/libraries/mongo/models/cart-participant.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/order-finance.model.d.ts +2 -0
- package/dist/libraries/mongo/models/embedded/order-finance.model.js +6 -0
- package/dist/libraries/mongo/models/embedded/order-finance.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/payment-infromation.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/payment-record.model.d.ts +9 -0
- package/dist/libraries/mongo/models/embedded/payment-record.model.js +48 -0
- package/dist/libraries/mongo/models/embedded/payment-record.model.js.map +1 -0
- package/dist/types/README.md +1 -1
- package/dist/types/package.json +1 -1
- package/dist/types/utilities/enum.d.ts +4 -0
- package/dist/types/utilities/enum.js +8 -2
- package/dist/types/utilities/enum.js.map +1 -1
- package/dist/types/utilities/validation/common-validation.d.ts +24 -1
- package/dist/types/utilities/validation/common-validation.js +9 -1
- package/dist/types/utilities/validation/common-validation.js.map +1 -1
- package/dist/utilities/enum.d.ts +4 -0
- package/dist/utilities/enum.js +8 -2
- package/dist/utilities/enum.js.map +1 -1
- package/dist/utilities/validation/common-validation.d.ts +24 -1
- package/dist/utilities/validation/common-validation.js +9 -1
- package/dist/utilities/validation/common-validation.js.map +1 -1
- package/package.json +1 -1
- package/dist/libraries/mongo/models/embedded/payment-attempt.model.d.ts +0 -10
- package/dist/libraries/mongo/models/embedded/payment-attempt.model.js +0 -60
- package/dist/libraries/mongo/models/embedded/payment-attempt.model.js.map +0 -1
|
@@ -23,6 +23,16 @@ export declare class BOBService implements ICashSettlementService {
|
|
|
23
23
|
private createBullMQJobForStatusCheck;
|
|
24
24
|
markSettlementAsPaid(settlementId: mongoose.Types.ObjectId): Promise<boolean>;
|
|
25
25
|
private settlePayment;
|
|
26
|
+
calculateAmountsToDeduct(data: {
|
|
27
|
+
exchangeRate: number;
|
|
28
|
+
totalSettlement: number;
|
|
29
|
+
totalSecondarySettlement: number;
|
|
30
|
+
cashInHandAmount: number;
|
|
31
|
+
cashInHandSecondaryAmount: number;
|
|
32
|
+
}): {
|
|
33
|
+
deltaPrimary: number;
|
|
34
|
+
deltaSecondary: number;
|
|
35
|
+
};
|
|
26
36
|
revokeSettlement(reference: string): Promise<boolean>;
|
|
27
37
|
revokeRiderSettlements(rider: mongoose.Types.ObjectId): Promise<boolean>;
|
|
28
38
|
private removeTransfer;
|
|
@@ -237,32 +237,13 @@ let BOBService = class BOBService {
|
|
|
237
237
|
const exchangeRate = settings?.currencySetting?.exchangeRate || 1;
|
|
238
238
|
const totalSettlement = settlement.amount || 0;
|
|
239
239
|
const totalSecondarySettlement = settlement.secondaryAmount || 0;
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
if (primaryToDeduct > 0) {
|
|
248
|
-
const neededSecondary = (0, currency_1.roundSecondaryCurrency)(primaryToDeduct * exchangeRate);
|
|
249
|
-
const deductedSecondary = Math.min(availableSecondary, neededSecondary);
|
|
250
|
-
secondaryToDeduct += deductedSecondary;
|
|
251
|
-
availableSecondary -= deductedSecondary;
|
|
252
|
-
primaryToDeduct = 0;
|
|
253
|
-
}
|
|
254
|
-
let deductedSecondaryDirect = Math.min(availableSecondary, totalSecondarySettlement);
|
|
255
|
-
secondaryToDeduct = deductedSecondaryDirect;
|
|
256
|
-
availableSecondary -= deductedSecondaryDirect;
|
|
257
|
-
const remainingSecondary = totalSecondarySettlement - deductedSecondaryDirect;
|
|
258
|
-
if (remainingSecondary > 0) {
|
|
259
|
-
const neededPrimary = (0, currency_1.roundBaseCurrency)(remainingSecondary / exchangeRate);
|
|
260
|
-
const deductedPrimaryFallback = Math.min(availablePrimary, neededPrimary);
|
|
261
|
-
deductedPrimary += deductedPrimaryFallback;
|
|
262
|
-
availablePrimary -= deductedPrimaryFallback;
|
|
263
|
-
}
|
|
264
|
-
const deltaPrimary = -deductedPrimary;
|
|
265
|
-
const deltaSecondary = -secondaryToDeduct;
|
|
240
|
+
const { deltaPrimary, deltaSecondary } = this.calculateAmountsToDeduct({
|
|
241
|
+
exchangeRate,
|
|
242
|
+
totalSettlement,
|
|
243
|
+
totalSecondarySettlement,
|
|
244
|
+
cashInHandAmount: rider.cashInHand?.amount ?? 0,
|
|
245
|
+
cashInHandSecondaryAmount: rider.cashInHand?.secondaryAmount ?? 0,
|
|
246
|
+
});
|
|
266
247
|
const updatedRider = await this.riderModel.findByIdAndUpdate(rider._id, {
|
|
267
248
|
$inc: {
|
|
268
249
|
'cashInHand.secondaryAmount': deltaSecondary,
|
|
@@ -283,6 +264,35 @@ let BOBService = class BOBService {
|
|
|
283
264
|
},
|
|
284
265
|
});
|
|
285
266
|
}
|
|
267
|
+
calculateAmountsToDeduct(data) {
|
|
268
|
+
let primaryToDeduct = data.totalSettlement;
|
|
269
|
+
let secondaryToDeduct = data.totalSecondarySettlement;
|
|
270
|
+
let availablePrimary = data.cashInHandAmount;
|
|
271
|
+
let availableSecondary = data.cashInHandSecondaryAmount;
|
|
272
|
+
let deductedPrimary = Math.min(availablePrimary, primaryToDeduct);
|
|
273
|
+
primaryToDeduct -= deductedPrimary;
|
|
274
|
+
availablePrimary -= deductedPrimary;
|
|
275
|
+
if (primaryToDeduct > 0) {
|
|
276
|
+
const neededSecondary = (0, currency_1.roundSecondaryCurrency)(primaryToDeduct * data.exchangeRate);
|
|
277
|
+
const deductedSecondary = Math.min(availableSecondary, neededSecondary);
|
|
278
|
+
secondaryToDeduct += deductedSecondary;
|
|
279
|
+
availableSecondary -= deductedSecondary;
|
|
280
|
+
primaryToDeduct = 0;
|
|
281
|
+
}
|
|
282
|
+
let deductedSecondaryDirect = Math.min(availableSecondary, data.totalSecondarySettlement);
|
|
283
|
+
secondaryToDeduct += deductedSecondaryDirect;
|
|
284
|
+
availableSecondary -= deductedSecondaryDirect;
|
|
285
|
+
const remainingSecondary = data.totalSecondarySettlement - deductedSecondaryDirect;
|
|
286
|
+
if (remainingSecondary > 0) {
|
|
287
|
+
const neededPrimary = (0, currency_1.roundBaseCurrency)(remainingSecondary / data.exchangeRate);
|
|
288
|
+
const deductedPrimaryFallback = Math.min(availablePrimary, neededPrimary);
|
|
289
|
+
deductedPrimary += deductedPrimaryFallback;
|
|
290
|
+
availablePrimary -= deductedPrimaryFallback;
|
|
291
|
+
}
|
|
292
|
+
const deltaPrimary = -deductedPrimary;
|
|
293
|
+
const deltaSecondary = -secondaryToDeduct;
|
|
294
|
+
return { deltaPrimary, deltaSecondary };
|
|
295
|
+
}
|
|
286
296
|
async revokeSettlement(reference) {
|
|
287
297
|
const logger = (0, __1.getLibraries)().getLoggerKit();
|
|
288
298
|
logger.info('Revoking BOB settlement', {
|
|
@@ -586,8 +596,7 @@ let BOBService = class BOBService {
|
|
|
586
596
|
await Promise.all(notPaidSettlements.map(async (settlement) => {
|
|
587
597
|
try {
|
|
588
598
|
const status = transferStatusMap.get(settlement.crmNumber);
|
|
589
|
-
|
|
590
|
-
if (!isStillUnpaid) {
|
|
599
|
+
if (status == BOBTransferStatus.PAID) {
|
|
591
600
|
await this.settlePayment(settlement);
|
|
592
601
|
}
|
|
593
602
|
logger.info(`Settled payment for crmNumber ${settlement.crmNumber}`, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bob.js","sourceRoot":"/","sources":["libraries/cash-settlement/providers/bob.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport { ICashSettlementService, ISettlementInfo, ISettlementStatus } from '../interfaces/ICashSettlement';\nimport { SoftDeleteModel } from '../../mongo/plugins/soft-delete-plugin';\nimport {\n\tBOBFinance,\n\tBOBFinanceModel,\n\tCounter,\n\tCounterModel,\n\tFinanceSettlement,\n\tFinanceSettlementModel,\n\tRider,\n\tRiderModel,\n\tSetting,\n} from '../../mongo/models';\nimport { Service } from 'typedi';\nimport https from 'https';\nimport zlib from 'zlib';\nimport { TRPCError } from '@trpc/server';\nimport {\n\tAccountType,\n\tBobChannelType,\n\tBobModel,\n\tBobSettlementStatus,\n\tBobSettlementType,\n\tBobType,\n\tCounterType,\n\tLogTag,\n\tSettlementType,\n} from '../../../utilities/enum';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { getLibraries } from '../../..';\nimport { badRequestError, notFoundError } from '../../../utilities/error-common';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '../../../utilities/shared/currency';\nimport dayjs from 'dayjs';\n\nexport type BOBSecrets = {\n\tBOB_USER_NAME: string;\n\tBOB_PASSWORD: string;\n\tBOB_URL: string;\n};\n\nexport enum BOBTransferStatus {\n\tNOT_PAID = 'NOT PAID',\n\tPAID = 'PAID',\n}\n\n@Service()\nexport class BOBService implements ICashSettlementService {\n\tprivate model: typeof BOBFinanceModel & SoftDeleteModel<BOBFinance>;\n\tprivate riderModel: typeof RiderModel & SoftDeleteModel<Rider>;\n\tprivate financeSettlementModel: typeof FinanceSettlementModel & SoftDeleteModel<FinanceSettlement>;\n\n\tprivate BOB_USER_NAME: string;\n\tprivate BOB_PASSWORD: string;\n\tprivate BOB_URL: string;\n\n\tconstructor(secrets: BOBSecrets) {\n\t\tthis.BOB_USER_NAME = secrets.BOB_USER_NAME;\n\t\tthis.BOB_PASSWORD = secrets.BOB_PASSWORD;\n\t\tthis.BOB_URL = secrets.BOB_URL;\n\n\t\tthis.model = BOBFinanceModel as typeof BOBFinanceModel & SoftDeleteModel<BOBFinance>;\n\t\tthis.riderModel = RiderModel as typeof RiderModel & SoftDeleteModel<Rider>;\n\t\tthis.financeSettlementModel = FinanceSettlementModel as typeof FinanceSettlementModel &\n\t\t\tSoftDeleteModel<FinanceSettlement>;\n\t}\n\n\tprivate async autoIncrementCRMCounter(): Promise<DocumentType<Counter>> {\n\t\treturn await CounterModel.findOneAndUpdate(\n\t\t\t{ counterType: CounterType.CRM_NUMBER },\n\t\t\t{ $inc: { value: 1 } },\n\t\t\t{ new: true, upsert: true }\n\t\t);\n\t}\n\n\tprivate convertNumberToCode(num: number): string {\n\t\t// convert a number to a code (e.g. 0 -> aa00)\n\t\tconst letters = 'abcdefghijklmnopqrstuvwxyz';\n\t\tconst lettersLength = letters.length;\n\n\t\tconst firstCharIndex = Math.floor(num / lettersLength) % lettersLength;\n\t\tconst secondCharIndex = num % lettersLength;\n\n\t\tconst digits = num % 100; // Ensures two digits (00 to 99)\n\t\treturn digits.toString().padStart(2, '0') + letters[firstCharIndex] + letters[secondCharIndex];\n\t}\n\n\t/**\n\t * Initiates a cash settlement process\n\t *\n\t * @param amount - The amount to be settled\n\t * @param currency - The currency of the amount\n\t * @param reference - A unique reference for the settlement\n\t * @param firstName - The first name of the settler\n\t * @param lastName - The last name of the settler\n\t * @param riderId - The ID of the rider associated with the settlement\n\t * @param location - Optional location of the settler\n\t * @returns Confirmation of the settlement initiation\n\t */\n\tpublic async initiateSettlement(\n\t\tamount: number,\n\t\tcurrency: string,\n\t\treference: string,\n\t\tfirstName: string,\n\t\tlastName: string,\n\t\triderId: mongoose.Types.ObjectId,\n\t\tlocation?: string\n\t): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Initiating BOB settlement', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\tdata: {\n\t\t\t\tamount,\n\t\t\t\tcurrency,\n\t\t\t\treference,\n\t\t\t\tfirstName,\n\t\t\t\tlastName,\n\t\t\t\triderId: riderId.toString(),\n\t\t\t\tlocation,\n\t\t\t},\n\t\t});\n\n\t\t// BOB cannot handle amount > 20000000\n\t\tif (amount > 20000000) {\n\t\t\tbadRequestError('Please provide a value between 0 and 20000000');\n\t\t}\n\n\t\tconst crmCounter = await this.autoIncrementCRMCounter();\n\t\tconst crmNumber = this.convertNumberToCode(crmCounter.value);\n\t\tif (!crmNumber) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to generate CRM number for BOB settlement.',\n\t\t\t});\n\t\t}\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tFirstName: firstName,\n\t\t\tLastName: lastName,\n\t\t\tCRMNumber: crmNumber,\n\t\t\tAmount: String(amount),\n\t\t\tCurrency: currency,\n\t\t};\n\n\t\tconst { data } = await axios.post(`${this.BOB_URL}InsertTransferData`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB initiateSettlement: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tconsole.error('Failed to initiate settlement in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to initiate settlement in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tconst bobSettlement = await this.model.create({\n\t\t\tamount: currency === 'USD' ? amount : 0,\n\t\t\tsecondaryAmount: currency === 'USD' ? 0 : amount,\n\t\t\tcrmNumber: crmNumber,\n\t\t\trider: riderId,\n\t\t\tbobLocation: location,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\tsettlementType: BobSettlementType.SETTLE_CASH,\n\t\t\tbobModel: BobModel.C2B,\n\t\t\tbobType: BobType.INWARD,\n\t\t});\n\n\t\tlogger.info('Created BOB settlement in database', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\tdata: {\n\t\t\t\tbobSettlementId: bobSettlement._id.toString(),\n\t\t\t\tcrmNumber,\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async createBullMQJobForStatusCheck(crmNumber: string) {\n\t\tconst bullmq = getLibraries().getBullMQService();\n\t\tconst queueId = `bob-settlement-status-check-queue-crm-${crmNumber}`;\n\t\tconst queue = bullmq.createQueue(queueId);\n\t\tconst jobName = `bob-settlement-status-check-job-crm-${crmNumber}`;\n\t\tconst schedulerId = `bob-settlement-status-check-scheduler-crm-${crmNumber}`;\n\n\t\tawait queue.upsertJobScheduler(\n\t\t\tschedulerId,\n\t\t\t{ pattern: '* * * * *' },\n\t\t\t{ name: jobName, data: { crmNumber } }\n\t\t);\n\n\t\tconst worker = bullmq.createWorker(queueId, async (job: any) => {\n\t\t\tconsole.log(`🔥 [${new Date().toISOString()}] Job triggered:`, job.name, job.data);\n\n\t\t\tconst settlement = await this.model.findOne({\n\t\t\t\tcrmNumber: job.data.crmNumber,\n\t\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\t});\n\n\t\t\tif (!settlement) {\n\t\t\t\tconsole.log(`Settlement with CRM number ${job.data.crmNumber} not found.`);\n\t\t\t\tawait queue.removeJobScheduler(schedulerId);\n\t\t\t\tconsole.log(`Removed job scheduler: ${schedulerId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst hasUnpaidTransfer = await this.hasUnpaidTransfer(job.data.crmNumber);\n\n\t\t\tif (!hasUnpaidTransfer) {\n\t\t\t\tthis.settlePayment(settlement);\n\t\t\t}\n\n\t\t\tconsole.log(`🔥 [${new Date().toISOString()}] Checking settlement status for ${job.data.crmNumber}:`, {\n\t\t\t\tsettlement,\n\t\t\t\thasUnpaidTransfer,\n\t\t\t});\n\t\t});\n\n\t\tworker.on('completed', (job: any) => {\n\t\t\tconsole.log(`✅ Job completed: ${job.id}`);\n\t\t});\n\n\t\tworker.on('failed', (job: any, err: any) => {\n\t\t\tconsole.error(`❌ Job failed: ${job?.id} -`, err);\n\t\t});\n\t}\n\n\t/**\n\t * Mark a settlement as paid\n\t *\n\t * @param settlementId - The ID of the settlement to update\n\t * @returns Confirmation of the update\n\t */\n\tpublic async markSettlementAsPaid(settlementId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Marking BOB settlement as paid', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t},\n\t\t});\n\n\t\tconst settlement = await this.model.findById(settlementId);\n\n\t\tif (!settlement) {\n\t\t\tlogger.info('Settlement not found', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Settlement not found.',\n\t\t\t});\n\t\t}\n\n\t\tif (settlement.status === BobSettlementStatus.PAID) {\n\t\t\tlogger.info('Settlement is already marked as paid', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tbadRequestError('Settlement is already marked as paid.');\n\t\t}\n\n\t\tawait this.settlePayment(settlement);\n\n\t\tif (settlement.status === BobSettlementStatus.NOT_PAID) {\n\t\t\tawait this.removeTransfer(settlement.crmNumber); // Remove the transfer from BOB so future settlements with the same reference do not fail\n\t\t}\n\n\t\tlogger.info('BOB settlement marked as paid', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async settlePayment(settlement: DocumentType<BOBFinance>) {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Settling BOB payment', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tcrmNumber: settlement.crmNumber,\n\t\t\t},\n\t\t});\n\n\t\tconst updatedSettlement = await this.model.findByIdAndUpdate(\n\t\t\tsettlement._id,\n\t\t\t{ status: BobSettlementStatus.PAID },\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tconst financeSettlement = await this.financeSettlementModel.create({\n\t\t\tamount: settlement.amount,\n\t\t\tsecondaryAmount: settlement.secondaryAmount,\n\t\t\trider: settlement.rider,\n\t\t\tsettlementType: SettlementType.RIDER_SETTLE_CASH,\n\t\t\taccountType: AccountType.RIDER,\n\t\t});\n\n\t\tconst rider = await this.riderModel.findById(settlement.rider);\n\t\tif (!rider) {\n\t\t\tconsole.error(`Rider with ID ${settlement.rider} not found.`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Rider not found.',\n\t\t\t});\n\t\t}\n\n\t\tconst settings: Setting = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = settings?.currencySetting?.exchangeRate || 1;\n\n\t\tconst totalSettlement = settlement.amount || 0;\n\t\tconst totalSecondarySettlement = settlement.secondaryAmount || 0;\n\n\t\tlet primaryToDeduct = totalSettlement;\n\t\tlet secondaryToDeduct = totalSecondarySettlement;\n\n\t\tlet availablePrimary = rider.cashInHand?.amount || 0;\n\t\tlet availableSecondary = rider.cashInHand?.secondaryAmount || 0;\n\n\t\t// 1. Handle primary settlement\n\t\tlet deductedPrimary = Math.min(availablePrimary, primaryToDeduct);\n\t\tprimaryToDeduct -= deductedPrimary;\n\t\tavailablePrimary -= deductedPrimary;\n\n\t\t// fallback to secondary if needed\n\t\tif (primaryToDeduct > 0) {\n\t\t\tconst neededSecondary = roundSecondaryCurrency(primaryToDeduct * exchangeRate);\n\n\t\t\tconst deductedSecondary = Math.min(availableSecondary, neededSecondary);\n\n\t\t\tsecondaryToDeduct += deductedSecondary; // accumulate deduction\n\t\t\tavailableSecondary -= deductedSecondary;\n\n\t\t\tprimaryToDeduct = 0;\n\t\t}\n\n\t\t// 2. Handle secondary settlement\n\t\tlet deductedSecondaryDirect = Math.min(availableSecondary, totalSecondarySettlement);\n\t\tsecondaryToDeduct = deductedSecondaryDirect;\n\t\tavailableSecondary -= deductedSecondaryDirect;\n\n\t\tconst remainingSecondary = totalSecondarySettlement - deductedSecondaryDirect;\n\n\t\t// fallback to primary\n\t\tif (remainingSecondary > 0) {\n\t\t\tconst neededPrimary = roundBaseCurrency(remainingSecondary / exchangeRate);\n\n\t\t\tconst deductedPrimaryFallback = Math.min(availablePrimary, neededPrimary);\n\n\t\t\tdeductedPrimary += deductedPrimaryFallback;\n\t\t\tavailablePrimary -= deductedPrimaryFallback;\n\t\t}\n\n\t\tconst deltaPrimary = -deductedPrimary;\n\t\tconst deltaSecondary = -secondaryToDeduct;\n\n\t\tconst updatedRider = await this.riderModel.findByIdAndUpdate(\n\t\t\trider._id,\n\t\t\t{\n\t\t\t\t$inc: {\n\t\t\t\t\t'cashInHand.secondaryAmount': deltaSecondary,\n\t\t\t\t\t'cashInHand.amount': deltaPrimary,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tlogger.info('Settled BOB payment and updated rider cash in hand', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tcrmNumber: settlement.crmNumber,\n\t\t\t\tdeltaSecondary,\n\t\t\t\tdeltaPrimary,\n\t\t\t\triderId: rider._id.toString(),\n\t\t\t\tpreviousRiderCashInHand: rider.cashInHand,\n\t\t\t\tupdatedRiderCashInHand: updatedRider?.cashInHand,\n\t\t\t\tfinanceSettlementId: financeSettlement._id.toString(),\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Revokes a cash settlement\n\t *\n\t * @param reference - The reference ID of the settlement to revoke\n\t * @returns Confirmation of the revocation\n\t */\n\tpublic async revokeSettlement(reference: string): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Revoking BOB settlement', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\treference,\n\t\t\t},\n\t\t});\n\n\t\tconst settlement = await this.model.findOne({\n\t\t\tcrmNumber: reference,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!settlement) {\n\t\t\tconsole.error(`Settlement with reference ${reference} not found.`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Settlement not found.',\n\t\t\t});\n\t\t}\n\n\t\tawait this.removeTransfer(reference);\n\n\t\tconst result = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\tcrmNumber: reference,\n\t\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\t},\n\t\t\t{\n\t\t\t\tstatus: BobSettlementStatus.REVOKED,\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tlogger.info('BOB settlement revoked', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\treference,\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tresult,\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Revokes a cash settlement\n\t *\n\t * @param reference - The reference ID of the settlement to revoke\n\t * @returns Confirmation of the revocation\n\t */\n\tpublic async revokeRiderSettlements(rider: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Revoking BOB settlements for rider', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\triderId: rider.toString(),\n\t\t\t},\n\t\t});\n\n\t\tconst settlements = await this.model.find({\n\t\t\trider: rider,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!settlements.length) {\n\t\t\tlogger.info('No unpaid BOB settlements found for rider', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\t\tdata: {\n\t\t\t\t\triderId: rider.toString(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tnotFoundError('No unpaid settlements found.');\n\t\t}\n\n\t\tfor (const settlement of settlements) {\n\t\t\tawait this.removeTransfer(settlement.crmNumber);\n\t\t\tawait this.model.findByIdAndUpdate(settlement._id, {\n\t\t\t\tstatus: BobSettlementStatus.REVOKED,\n\t\t\t});\n\t\t}\n\n\t\tlogger.info('BOB settlements revoked for rider', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\triderId: rider.toString(),\n\t\t\t\tsettlementIds: settlements.map(s => s._id.toString()),\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async removeTransfer(crmNumber: string) {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Removing transfer from BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\tdata: {\n\t\t\t\tcrmNumber,\n\t\t\t},\n\t\t});\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tCRMNumber: crmNumber,\n\t\t};\n\n\t\tconst { data } = await axios.post(`${this.BOB_URL}RemoveTransfer`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode == 213) {\n\t\t\t// Record does not exist\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB removeTransfer: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tconsole.error('Failed to remove transfer in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to remove transfer in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tlogger.info('Removed transfer from BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\tdata: {\n\t\t\t\tcrmNumber,\n\t\t\t\tresponseObject,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Check if there are pending settlements\n\t *\n\t * @param reference - The reference ID of the settlement to check\n\t * @returns true if there are pending settlements, false otherwise\n\t */\n\tpublic async hasPendingSettlements(reference: string): Promise<boolean> {\n\t\tconst pendingSettlements = await this.model.find({\n\t\t\tcrmNumber: reference,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\t\treturn pendingSettlements.length > 0;\n\t}\n\n\t/**\n\t * Check if there are pending settlements\n\t *\n\t * @param riderId - The ID of the rider to check\n\t * @returns true if there are pending settlements, false otherwise\n\t */\n\tpublic async hasPendingRiderSettlements(riderId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst pendingSettlements = await this.model.find({\n\t\t\trider: riderId,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\t\treturn pendingSettlements.length > 0;\n\t}\n\n\t/**\n\t * Get latest settlement info\n\t *\n\t * @param reference - The reference ID of the settlement to check\n\t * @returns the latest settlement if it exists, null otherwise\n\t */\n\tpublic async getLastSettlement(reference: string): Promise<ISettlementInfo | null> {\n\t\tconst pendingSettlements = await this.model\n\t\t\t.findOne({\n\t\t\t\tcrmNumber: reference,\n\t\t\t})\n\t\t\t.sort({ createdAt: -1 });\n\n\t\tif (!pendingSettlements) return null;\n\n\t\treturn {\n\t\t\tamount: pendingSettlements.amount || pendingSettlements.secondaryAmount || 0,\n\t\t\tcurrency: pendingSettlements.amount ? 'USD' : 'LBP',\n\t\t\treferenceNumber: pendingSettlements.crmNumber,\n\t\t\tstatus: (pendingSettlements.status ?? BobSettlementStatus.NOT_PAID) as unknown as ISettlementStatus,\n\t\t\tcreatedAt: pendingSettlements.createdAt ?? new Date(),\n\t\t\tupdatedAt: pendingSettlements.createdAt ?? new Date(),\n\t\t};\n\t}\n\n\t/**\n\t * Get latest settlement info\n\t *\n\t * @param riderId - The ID of the rider to check\n\t * @returns the latest settlement if it exists, null otherwise\n\t */\n\tpublic async getLastRiderSettlement(rider: mongoose.Types.ObjectId): Promise<ISettlementInfo | null> {\n\t\tconst lastSettlement = await this.model\n\t\t\t.findOne({\n\t\t\t\trider: rider,\n\t\t\t})\n\t\t\t.sort({ createdAt: -1 });\n\n\t\tif (!lastSettlement) return null;\n\n\t\treturn {\n\t\t\tamount: lastSettlement.amount || lastSettlement.secondaryAmount || 0,\n\t\t\tcurrency: lastSettlement.amount ? 'USD' : 'LBP',\n\t\t\treferenceNumber: lastSettlement.crmNumber,\n\t\t\tstatus: (lastSettlement.status ?? BobSettlementStatus.NOT_PAID) as unknown as ISettlementStatus,\n\t\t\tcreatedAt: lastSettlement.createdAt ?? new Date(),\n\t\t\tupdatedAt: lastSettlement.updatedAt ?? new Date(),\n\t\t};\n\t}\n\n\tprivate async getTransfers(timeframe: { startDate: Date; endDate: Date }) {\n\t\tconst DateTimeFrom = new Date(timeframe.startDate).toISOString().split('.')[0] + 'Z';\n\t\tconst DateTimeTo = new Date(timeframe.endDate).toISOString().split('.')[0] + 'Z';\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tDateTimeFrom,\n\t\t\tDateTimeTo,\n\t\t};\n\t\tconst { data } = await axios.post(`${this.BOB_URL}GetTransfers`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB getTransfers: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tconsole.error('Failed to get transfers in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to get transfers in BOB.',\n\t\t\t});\n\t\t}\n\n\t\treturn responseObject;\n\t}\n\n\tprivate async decompressResponse(response: string): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// Step 1: Decode Base64\n\t\t\tconst decodedBuffer = Buffer.from(response, 'base64');\n\n\t\t\t// Step 2: Decompress GZIP\n\t\t\tzlib.gunzip(decodedBuffer, (err, decompressedBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tconsole.error('Error decompressing GZIP:', err);\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\t\tmessage: 'Failed to decompress data from BOB API.',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Step 3: Convert decompressed buffer to string\n\t\t\t\t\tconst decodedString = decompressedBuffer.toString('utf-8');\n\n\t\t\t\t\t// Step 4: Parse the JSON string to a JavaScript object\n\t\t\t\t\tconst responseObject = JSON.parse(decodedString);\n\n\t\t\t\t\tresolve(responseObject);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async hasUnpaidTransfer(crmNumber: string): Promise<Boolean> {\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tCRMNumber: crmNumber,\n\t\t};\n\t\tconst { data } = await axios.post(`${this.BOB_URL}GetTransferStatus`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB getTransferStatus: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tconsole.error('Failed to get settlement status in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to get settlement status in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tconst hasUnpaidTransfer = responseObject.some(\n\t\t\t(item: any) => item.CRMNumber == crmNumber && item.Status == BOBTransferStatus.NOT_PAID\n\t\t);\n\n\t\treturn hasUnpaidTransfer;\n\t}\n\n\tpublic async checkAllPendingTransfers() {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Checking pending BOB settlements', { tag: LogTag.BOB_TRANSACTION_CHECK });\n\n\t\tconst notPaidSettlements = await this.model.find({\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!notPaidSettlements.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.info('Checking pending settlements', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\tcount: notPaidSettlements.length,\n\t\t\t\tsettlementIds: notPaidSettlements.map(s => s._id.toString()),\n\t\t\t},\n\t\t});\n\n\t\tlet maxDate = dayjs();\n\t\tlet minDate = dayjs();\n\n\t\tconst createdAtDates = notPaidSettlements.map(item => dayjs(item.createdAt!));\n\n\t\tif (createdAtDates.length > 0) {\n\t\t\tmaxDate = dayjs.max(...createdAtDates)!;\n\t\t\tminDate = dayjs.min(...createdAtDates)!;\n\t\t}\n\n\t\tconst maxDatePlusOneDay = maxDate.add(1, 'day').toDate();\n\t\tconst minDateMinusOneDay = minDate.add(1, 'day').toDate();\n\n\t\tconst transfers = await this.getTransfers({\n\t\t\tstartDate: minDateMinusOneDay,\n\t\t\tendDate: maxDatePlusOneDay,\n\t\t});\n\n\t\tlogger.info('Transactions on BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\tcount: transfers.length,\n\t\t\t\ttransfers,\n\t\t\t\tstartDate: minDateMinusOneDay,\n\t\t\t\tendDate: maxDatePlusOneDay,\n\t\t\t},\n\t\t});\n\n\t\tif (!transfers || transfers.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transferStatusMap = new Map<string, string>();\n\n\t\tfor (const trx of transfers) {\n\t\t\ttransferStatusMap.set(trx.ReferenceNumber, trx.Status);\n\t\t}\n\n\t\tlogger.info('Mapped transfer statuses', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\ttransferStatusMap,\n\t\t\t},\n\t\t});\n\n\t\tawait Promise.all(\n\t\t\tnotPaidSettlements.map(async settlement => {\n\t\t\t\ttry {\n\t\t\t\t\tconst status = transferStatusMap.get(settlement.crmNumber);\n\n\t\t\t\t\tconst isStillUnpaid = status === BOBTransferStatus.NOT_PAID;\n\n\t\t\t\t\tif (!isStillUnpaid) {\n\t\t\t\t\t\tawait this.settlePayment(settlement);\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger.info(`Settled payment for crmNumber ${settlement.crmNumber}`, {\n\t\t\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\t\t\tdata: { status },\n\t\t\t\t\t});\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t`Failed settlement with crmNumber ${settlement.crmNumber}, id: ${settlement._id}`,\n\t\t\t\t\t\terr,\n\t\t\t\t\t\t{ tag: LogTag.BOB_TRANSACTION_CHECK }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"bob.js","sourceRoot":"/","sources":["libraries/cash-settlement/providers/bob.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport { ICashSettlementService, ISettlementInfo, ISettlementStatus } from '../interfaces/ICashSettlement';\nimport { SoftDeleteModel } from '../../mongo/plugins/soft-delete-plugin';\nimport {\n\tBOBFinance,\n\tBOBFinanceModel,\n\tCounter,\n\tCounterModel,\n\tFinanceSettlement,\n\tFinanceSettlementModel,\n\tRider,\n\tRiderModel,\n\tSetting,\n} from '../../mongo/models';\nimport { Service } from 'typedi';\nimport https from 'https';\nimport zlib from 'zlib';\nimport { TRPCError } from '@trpc/server';\nimport {\n\tAccountType,\n\tBobChannelType,\n\tBobModel,\n\tBobSettlementStatus,\n\tBobSettlementType,\n\tBobType,\n\tCounterType,\n\tLogTag,\n\tSettlementType,\n} from '../../../utilities/enum';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { getLibraries } from '../../..';\nimport { badRequestError, notFoundError } from '../../../utilities/error-common';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '../../../utilities/shared/currency';\nimport dayjs from 'dayjs';\n\nexport type BOBSecrets = {\n\tBOB_USER_NAME: string;\n\tBOB_PASSWORD: string;\n\tBOB_URL: string;\n};\n\nexport enum BOBTransferStatus {\n\tNOT_PAID = 'NOT PAID',\n\tPAID = 'PAID',\n}\n\n@Service()\nexport class BOBService implements ICashSettlementService {\n\tprivate model: typeof BOBFinanceModel & SoftDeleteModel<BOBFinance>;\n\tprivate riderModel: typeof RiderModel & SoftDeleteModel<Rider>;\n\tprivate financeSettlementModel: typeof FinanceSettlementModel & SoftDeleteModel<FinanceSettlement>;\n\n\tprivate BOB_USER_NAME: string;\n\tprivate BOB_PASSWORD: string;\n\tprivate BOB_URL: string;\n\n\tconstructor(secrets: BOBSecrets) {\n\t\tthis.BOB_USER_NAME = secrets.BOB_USER_NAME;\n\t\tthis.BOB_PASSWORD = secrets.BOB_PASSWORD;\n\t\tthis.BOB_URL = secrets.BOB_URL;\n\n\t\tthis.model = BOBFinanceModel as typeof BOBFinanceModel & SoftDeleteModel<BOBFinance>;\n\t\tthis.riderModel = RiderModel as typeof RiderModel & SoftDeleteModel<Rider>;\n\t\tthis.financeSettlementModel = FinanceSettlementModel as typeof FinanceSettlementModel &\n\t\t\tSoftDeleteModel<FinanceSettlement>;\n\t}\n\n\tprivate async autoIncrementCRMCounter(): Promise<DocumentType<Counter>> {\n\t\treturn await CounterModel.findOneAndUpdate(\n\t\t\t{ counterType: CounterType.CRM_NUMBER },\n\t\t\t{ $inc: { value: 1 } },\n\t\t\t{ new: true, upsert: true }\n\t\t);\n\t}\n\n\tprivate convertNumberToCode(num: number): string {\n\t\t// convert a number to a code (e.g. 0 -> aa00)\n\t\tconst letters = 'abcdefghijklmnopqrstuvwxyz';\n\t\tconst lettersLength = letters.length;\n\n\t\tconst firstCharIndex = Math.floor(num / lettersLength) % lettersLength;\n\t\tconst secondCharIndex = num % lettersLength;\n\n\t\tconst digits = num % 100; // Ensures two digits (00 to 99)\n\t\treturn digits.toString().padStart(2, '0') + letters[firstCharIndex] + letters[secondCharIndex];\n\t}\n\n\t/**\n\t * Initiates a cash settlement process\n\t *\n\t * @param amount - The amount to be settled\n\t * @param currency - The currency of the amount\n\t * @param reference - A unique reference for the settlement\n\t * @param firstName - The first name of the settler\n\t * @param lastName - The last name of the settler\n\t * @param riderId - The ID of the rider associated with the settlement\n\t * @param location - Optional location of the settler\n\t * @returns Confirmation of the settlement initiation\n\t */\n\tpublic async initiateSettlement(\n\t\tamount: number,\n\t\tcurrency: string,\n\t\treference: string,\n\t\tfirstName: string,\n\t\tlastName: string,\n\t\triderId: mongoose.Types.ObjectId,\n\t\tlocation?: string\n\t): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Initiating BOB settlement', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\tdata: {\n\t\t\t\tamount,\n\t\t\t\tcurrency,\n\t\t\t\treference,\n\t\t\t\tfirstName,\n\t\t\t\tlastName,\n\t\t\t\triderId: riderId.toString(),\n\t\t\t\tlocation,\n\t\t\t},\n\t\t});\n\n\t\t// BOB cannot handle amount > 20000000\n\t\tif (amount > 20000000) {\n\t\t\tbadRequestError('Please provide a value between 0 and 20000000');\n\t\t}\n\n\t\tconst crmCounter = await this.autoIncrementCRMCounter();\n\t\tconst crmNumber = this.convertNumberToCode(crmCounter.value);\n\t\tif (!crmNumber) {\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to generate CRM number for BOB settlement.',\n\t\t\t});\n\t\t}\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tFirstName: firstName,\n\t\t\tLastName: lastName,\n\t\t\tCRMNumber: crmNumber,\n\t\t\tAmount: String(amount),\n\t\t\tCurrency: currency,\n\t\t};\n\n\t\tconst { data } = await axios.post(`${this.BOB_URL}InsertTransferData`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB initiateSettlement: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tconsole.error('Failed to initiate settlement in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to initiate settlement in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tconst bobSettlement = await this.model.create({\n\t\t\tamount: currency === 'USD' ? amount : 0,\n\t\t\tsecondaryAmount: currency === 'USD' ? 0 : amount,\n\t\t\tcrmNumber: crmNumber,\n\t\t\trider: riderId,\n\t\t\tbobLocation: location,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\tsettlementType: BobSettlementType.SETTLE_CASH,\n\t\t\tbobModel: BobModel.C2B,\n\t\t\tbobType: BobType.INWARD,\n\t\t});\n\n\t\tlogger.info('Created BOB settlement in database', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\tdata: {\n\t\t\t\tbobSettlementId: bobSettlement._id.toString(),\n\t\t\t\tcrmNumber,\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async createBullMQJobForStatusCheck(crmNumber: string) {\n\t\tconst bullmq = getLibraries().getBullMQService();\n\t\tconst queueId = `bob-settlement-status-check-queue-crm-${crmNumber}`;\n\t\tconst queue = bullmq.createQueue(queueId);\n\t\tconst jobName = `bob-settlement-status-check-job-crm-${crmNumber}`;\n\t\tconst schedulerId = `bob-settlement-status-check-scheduler-crm-${crmNumber}`;\n\n\t\tawait queue.upsertJobScheduler(\n\t\t\tschedulerId,\n\t\t\t{ pattern: '* * * * *' },\n\t\t\t{ name: jobName, data: { crmNumber } }\n\t\t);\n\n\t\tconst worker = bullmq.createWorker(queueId, async (job: any) => {\n\t\t\tconsole.log(`🔥 [${new Date().toISOString()}] Job triggered:`, job.name, job.data);\n\n\t\t\tconst settlement = await this.model.findOne({\n\t\t\t\tcrmNumber: job.data.crmNumber,\n\t\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\t});\n\n\t\t\tif (!settlement) {\n\t\t\t\tconsole.log(`Settlement with CRM number ${job.data.crmNumber} not found.`);\n\t\t\t\tawait queue.removeJobScheduler(schedulerId);\n\t\t\t\tconsole.log(`Removed job scheduler: ${schedulerId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst hasUnpaidTransfer = await this.hasUnpaidTransfer(job.data.crmNumber);\n\n\t\t\tif (!hasUnpaidTransfer) {\n\t\t\t\tthis.settlePayment(settlement);\n\t\t\t}\n\n\t\t\tconsole.log(`🔥 [${new Date().toISOString()}] Checking settlement status for ${job.data.crmNumber}:`, {\n\t\t\t\tsettlement,\n\t\t\t\thasUnpaidTransfer,\n\t\t\t});\n\t\t});\n\n\t\tworker.on('completed', (job: any) => {\n\t\t\tconsole.log(`✅ Job completed: ${job.id}`);\n\t\t});\n\n\t\tworker.on('failed', (job: any, err: any) => {\n\t\t\tconsole.error(`❌ Job failed: ${job?.id} -`, err);\n\t\t});\n\t}\n\n\t/**\n\t * Mark a settlement as paid\n\t *\n\t * @param settlementId - The ID of the settlement to update\n\t * @returns Confirmation of the update\n\t */\n\tpublic async markSettlementAsPaid(settlementId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Marking BOB settlement as paid', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t},\n\t\t});\n\n\t\tconst settlement = await this.model.findById(settlementId);\n\n\t\tif (!settlement) {\n\t\t\tlogger.info('Settlement not found', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Settlement not found.',\n\t\t\t});\n\t\t}\n\n\t\tif (settlement.status === BobSettlementStatus.PAID) {\n\t\t\tlogger.info('Settlement is already marked as paid', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tbadRequestError('Settlement is already marked as paid.');\n\t\t}\n\n\t\tawait this.settlePayment(settlement);\n\n\t\tif (settlement.status === BobSettlementStatus.NOT_PAID) {\n\t\t\tawait this.removeTransfer(settlement.crmNumber); // Remove the transfer from BOB so future settlements with the same reference do not fail\n\t\t}\n\n\t\tlogger.info('BOB settlement marked as paid', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlementId.toString(),\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async settlePayment(settlement: DocumentType<BOBFinance>) {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Settling BOB payment', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tcrmNumber: settlement.crmNumber,\n\t\t\t},\n\t\t});\n\n\t\tconst updatedSettlement = await this.model.findByIdAndUpdate(\n\t\t\tsettlement._id,\n\t\t\t{ status: BobSettlementStatus.PAID },\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tconst financeSettlement = await this.financeSettlementModel.create({\n\t\t\tamount: settlement.amount,\n\t\t\tsecondaryAmount: settlement.secondaryAmount,\n\t\t\trider: settlement.rider,\n\t\t\tsettlementType: SettlementType.RIDER_SETTLE_CASH,\n\t\t\taccountType: AccountType.RIDER,\n\t\t});\n\n\t\tconst rider = await this.riderModel.findById(settlement.rider);\n\t\tif (!rider) {\n\t\t\tconsole.error(`Rider with ID ${settlement.rider} not found.`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Rider not found.',\n\t\t\t});\n\t\t}\n\n\t\tconst settings: Setting = (await getLibraries().getCachedSettingsService().getSettings()) as Setting;\n\t\tconst exchangeRate = settings?.currencySetting?.exchangeRate || 1;\n\n\t\tconst totalSettlement = settlement.amount || 0;\n\t\tconst totalSecondarySettlement = settlement.secondaryAmount || 0;\n\n\t\tconst { deltaPrimary, deltaSecondary } = this.calculateAmountsToDeduct({\n\t\t\texchangeRate,\n\t\t\ttotalSettlement,\n\t\t\ttotalSecondarySettlement,\n\t\t\tcashInHandAmount: rider.cashInHand?.amount ?? 0,\n\t\t\tcashInHandSecondaryAmount: rider.cashInHand?.secondaryAmount ?? 0,\n\t\t});\n\n\t\tconst updatedRider = await this.riderModel.findByIdAndUpdate(\n\t\t\trider._id,\n\t\t\t{\n\t\t\t\t$inc: {\n\t\t\t\t\t'cashInHand.secondaryAmount': deltaSecondary,\n\t\t\t\t\t'cashInHand.amount': deltaPrimary,\n\t\t\t\t},\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tlogger.info('Settled BOB payment and updated rider cash in hand', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\tdata: {\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tcrmNumber: settlement.crmNumber,\n\t\t\t\tdeltaSecondary,\n\t\t\t\tdeltaPrimary,\n\t\t\t\triderId: rider._id.toString(),\n\t\t\t\tpreviousRiderCashInHand: rider.cashInHand,\n\t\t\t\tupdatedRiderCashInHand: updatedRider?.cashInHand,\n\t\t\t\tfinanceSettlementId: financeSettlement._id.toString(),\n\t\t\t},\n\t\t});\n\t}\n\n\tpublic calculateAmountsToDeduct(data: {\n\t\texchangeRate: number;\n\t\ttotalSettlement: number;\n\t\ttotalSecondarySettlement: number;\n\t\tcashInHandAmount: number;\n\t\tcashInHandSecondaryAmount: number;\n\t}) {\n\t\tlet primaryToDeduct = data.totalSettlement;\n\t\tlet secondaryToDeduct = data.totalSecondarySettlement;\n\n\t\tlet availablePrimary = data.cashInHandAmount;\n\t\tlet availableSecondary = data.cashInHandSecondaryAmount;\n\n\t\t// 1. Handle primary settlement\n\t\tlet deductedPrimary = Math.min(availablePrimary, primaryToDeduct);\n\t\tprimaryToDeduct -= deductedPrimary;\n\t\tavailablePrimary -= deductedPrimary;\n\n\t\t// fallback to secondary if needed\n\t\tif (primaryToDeduct > 0) {\n\t\t\tconst neededSecondary = roundSecondaryCurrency(primaryToDeduct * data.exchangeRate);\n\n\t\t\tconst deductedSecondary = Math.min(availableSecondary, neededSecondary);\n\n\t\t\tsecondaryToDeduct += deductedSecondary; // accumulate deduction\n\t\t\tavailableSecondary -= deductedSecondary;\n\n\t\t\tprimaryToDeduct = 0;\n\t\t}\n\n\t\t// 2. Handle secondary settlement\n\t\tlet deductedSecondaryDirect = Math.min(availableSecondary, data.totalSecondarySettlement);\n\t\tsecondaryToDeduct += deductedSecondaryDirect;\n\t\tavailableSecondary -= deductedSecondaryDirect;\n\n\t\tconst remainingSecondary = data.totalSecondarySettlement - deductedSecondaryDirect;\n\n\t\t// fallback to primary\n\t\tif (remainingSecondary > 0) {\n\t\t\tconst neededPrimary = roundBaseCurrency(remainingSecondary / data.exchangeRate);\n\n\t\t\tconst deductedPrimaryFallback = Math.min(availablePrimary, neededPrimary);\n\n\t\t\tdeductedPrimary += deductedPrimaryFallback;\n\t\t\tavailablePrimary -= deductedPrimaryFallback;\n\t\t}\n\n\t\tconst deltaPrimary = -deductedPrimary;\n\t\tconst deltaSecondary = -secondaryToDeduct;\n\n\t\treturn { deltaPrimary, deltaSecondary };\n\t}\n\n\t/**\n\t * Revokes a cash settlement\n\t *\n\t * @param reference - The reference ID of the settlement to revoke\n\t * @returns Confirmation of the revocation\n\t */\n\tpublic async revokeSettlement(reference: string): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Revoking BOB settlement', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\treference,\n\t\t\t},\n\t\t});\n\n\t\tconst settlement = await this.model.findOne({\n\t\t\tcrmNumber: reference,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!settlement) {\n\t\t\tconsole.error(`Settlement with reference ${reference} not found.`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'NOT_FOUND',\n\t\t\t\tmessage: 'Settlement not found.',\n\t\t\t});\n\t\t}\n\n\t\tawait this.removeTransfer(reference);\n\n\t\tconst result = await this.model.findOneAndUpdate(\n\t\t\t{\n\t\t\t\tcrmNumber: reference,\n\t\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t\t},\n\t\t\t{\n\t\t\t\tstatus: BobSettlementStatus.REVOKED,\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tlogger.info('BOB settlement revoked', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\treference,\n\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\tresult,\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Revokes a cash settlement\n\t *\n\t * @param reference - The reference ID of the settlement to revoke\n\t * @returns Confirmation of the revocation\n\t */\n\tpublic async revokeRiderSettlements(rider: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Revoking BOB settlements for rider', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\triderId: rider.toString(),\n\t\t\t},\n\t\t});\n\n\t\tconst settlements = await this.model.find({\n\t\t\trider: rider,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!settlements.length) {\n\t\t\tlogger.info('No unpaid BOB settlements found for rider', {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\t\tdata: {\n\t\t\t\t\triderId: rider.toString(),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tnotFoundError('No unpaid settlements found.');\n\t\t}\n\n\t\tfor (const settlement of settlements) {\n\t\t\tawait this.removeTransfer(settlement.crmNumber);\n\t\t\tawait this.model.findByIdAndUpdate(settlement._id, {\n\t\t\t\tstatus: BobSettlementStatus.REVOKED,\n\t\t\t});\n\t\t}\n\n\t\tlogger.info('BOB settlements revoked for rider', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\tdata: {\n\t\t\t\triderId: rider.toString(),\n\t\t\t\tsettlementIds: settlements.map(s => s._id.toString()),\n\t\t\t},\n\t\t});\n\n\t\treturn true;\n\t}\n\n\tprivate async removeTransfer(crmNumber: string) {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Removing transfer from BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\tdata: {\n\t\t\t\tcrmNumber,\n\t\t\t},\n\t\t});\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tCRMNumber: crmNumber,\n\t\t};\n\n\t\tconst { data } = await axios.post(`${this.BOB_URL}RemoveTransfer`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode == 213) {\n\t\t\t// Record does not exist\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB removeTransfer: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tconsole.error('Failed to remove transfer in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to remove transfer in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tlogger.info('Removed transfer from BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\tdata: {\n\t\t\t\tcrmNumber,\n\t\t\t\tresponseObject,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Check if there are pending settlements\n\t *\n\t * @param reference - The reference ID of the settlement to check\n\t * @returns true if there are pending settlements, false otherwise\n\t */\n\tpublic async hasPendingSettlements(reference: string): Promise<boolean> {\n\t\tconst pendingSettlements = await this.model.find({\n\t\t\tcrmNumber: reference,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\t\treturn pendingSettlements.length > 0;\n\t}\n\n\t/**\n\t * Check if there are pending settlements\n\t *\n\t * @param riderId - The ID of the rider to check\n\t * @returns true if there are pending settlements, false otherwise\n\t */\n\tpublic async hasPendingRiderSettlements(riderId: mongoose.Types.ObjectId): Promise<boolean> {\n\t\tconst pendingSettlements = await this.model.find({\n\t\t\trider: riderId,\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\t\treturn pendingSettlements.length > 0;\n\t}\n\n\t/**\n\t * Get latest settlement info\n\t *\n\t * @param reference - The reference ID of the settlement to check\n\t * @returns the latest settlement if it exists, null otherwise\n\t */\n\tpublic async getLastSettlement(reference: string): Promise<ISettlementInfo | null> {\n\t\tconst pendingSettlements = await this.model\n\t\t\t.findOne({\n\t\t\t\tcrmNumber: reference,\n\t\t\t})\n\t\t\t.sort({ createdAt: -1 });\n\n\t\tif (!pendingSettlements) return null;\n\n\t\treturn {\n\t\t\tamount: pendingSettlements.amount || pendingSettlements.secondaryAmount || 0,\n\t\t\tcurrency: pendingSettlements.amount ? 'USD' : 'LBP',\n\t\t\treferenceNumber: pendingSettlements.crmNumber,\n\t\t\tstatus: (pendingSettlements.status ?? BobSettlementStatus.NOT_PAID) as unknown as ISettlementStatus,\n\t\t\tcreatedAt: pendingSettlements.createdAt ?? new Date(),\n\t\t\tupdatedAt: pendingSettlements.createdAt ?? new Date(),\n\t\t};\n\t}\n\n\t/**\n\t * Get latest settlement info\n\t *\n\t * @param riderId - The ID of the rider to check\n\t * @returns the latest settlement if it exists, null otherwise\n\t */\n\tpublic async getLastRiderSettlement(rider: mongoose.Types.ObjectId): Promise<ISettlementInfo | null> {\n\t\tconst lastSettlement = await this.model\n\t\t\t.findOne({\n\t\t\t\trider: rider,\n\t\t\t})\n\t\t\t.sort({ createdAt: -1 });\n\n\t\tif (!lastSettlement) return null;\n\n\t\treturn {\n\t\t\tamount: lastSettlement.amount || lastSettlement.secondaryAmount || 0,\n\t\t\tcurrency: lastSettlement.amount ? 'USD' : 'LBP',\n\t\t\treferenceNumber: lastSettlement.crmNumber,\n\t\t\tstatus: (lastSettlement.status ?? BobSettlementStatus.NOT_PAID) as unknown as ISettlementStatus,\n\t\t\tcreatedAt: lastSettlement.createdAt ?? new Date(),\n\t\t\tupdatedAt: lastSettlement.updatedAt ?? new Date(),\n\t\t};\n\t}\n\n\tprivate async getTransfers(timeframe: { startDate: Date; endDate: Date }) {\n\t\tconst DateTimeFrom = new Date(timeframe.startDate).toISOString().split('.')[0] + 'Z';\n\t\tconst DateTimeTo = new Date(timeframe.endDate).toISOString().split('.')[0] + 'Z';\n\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tDateTimeFrom,\n\t\t\tDateTimeTo,\n\t\t};\n\t\tconst { data } = await axios.post(`${this.BOB_URL}GetTransfers`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB getTransfers: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tconsole.error('Failed to get transfers in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to get transfers in BOB.',\n\t\t\t});\n\t\t}\n\n\t\treturn responseObject;\n\t}\n\n\tprivate async decompressResponse(response: string): Promise<any> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t// Step 1: Decode Base64\n\t\t\tconst decodedBuffer = Buffer.from(response, 'base64');\n\n\t\t\t// Step 2: Decompress GZIP\n\t\t\tzlib.gunzip(decodedBuffer, (err, decompressedBuffer) => {\n\t\t\t\tif (err) {\n\t\t\t\t\tconsole.error('Error decompressing GZIP:', err);\n\t\t\t\t\tthrow new TRPCError({\n\t\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\t\tmessage: 'Failed to decompress data from BOB API.',\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// Step 3: Convert decompressed buffer to string\n\t\t\t\t\tconst decodedString = decompressedBuffer.toString('utf-8');\n\n\t\t\t\t\t// Step 4: Parse the JSON string to a JavaScript object\n\t\t\t\t\tconst responseObject = JSON.parse(decodedString);\n\n\t\t\t\t\tresolve(responseObject);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tprivate async hasUnpaidTransfer(crmNumber: string): Promise<Boolean> {\n\t\tconst bobData = {\n\t\t\tChannelType: BobChannelType.CO,\n\t\t\tCredentials: {\n\t\t\t\tUser: this.BOB_USER_NAME,\n\t\t\t\tPassword: this.BOB_PASSWORD,\n\t\t\t},\n\t\t\tModel: BobModel.C2B,\n\t\t\tCRMNumber: crmNumber,\n\t\t};\n\t\tconst { data } = await axios.post(`${this.BOB_URL}GetTransferStatus`, bobData, {\n\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t});\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tconsole.error(`Error in BOB getTransferStatus: ${data.ErrorDescription}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to post data to BOB API.',\n\t\t\t});\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tconsole.error('Failed to get settlement status in BOB');\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to get settlement status in BOB.',\n\t\t\t});\n\t\t}\n\n\t\tconst hasUnpaidTransfer = responseObject.some(\n\t\t\t(item: any) => item.CRMNumber == crmNumber && item.Status == BOBTransferStatus.NOT_PAID\n\t\t);\n\n\t\treturn hasUnpaidTransfer;\n\t}\n\n\tpublic async checkAllPendingTransfers() {\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tlogger.info('Checking pending BOB settlements', { tag: LogTag.BOB_TRANSACTION_CHECK });\n\n\t\tconst notPaidSettlements = await this.model.find({\n\t\t\tstatus: BobSettlementStatus.NOT_PAID,\n\t\t});\n\n\t\tif (!notPaidSettlements.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.info('Checking pending settlements', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\tcount: notPaidSettlements.length,\n\t\t\t\tsettlementIds: notPaidSettlements.map(s => s._id.toString()),\n\t\t\t},\n\t\t});\n\n\t\tlet maxDate = dayjs();\n\t\tlet minDate = dayjs();\n\n\t\tconst createdAtDates = notPaidSettlements.map(item => dayjs(item.createdAt!));\n\n\t\tif (createdAtDates.length > 0) {\n\t\t\tmaxDate = dayjs.max(...createdAtDates)!;\n\t\t\tminDate = dayjs.min(...createdAtDates)!;\n\t\t}\n\n\t\tconst maxDatePlusOneDay = maxDate.add(1, 'day').toDate();\n\t\tconst minDateMinusOneDay = minDate.add(1, 'day').toDate();\n\n\t\tconst transfers = await this.getTransfers({\n\t\t\tstartDate: minDateMinusOneDay,\n\t\t\tendDate: maxDatePlusOneDay,\n\t\t});\n\n\t\tlogger.info('Transactions on BOB', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\tcount: transfers.length,\n\t\t\t\ttransfers,\n\t\t\t\tstartDate: minDateMinusOneDay,\n\t\t\t\tendDate: maxDatePlusOneDay,\n\t\t\t},\n\t\t});\n\n\t\tif (!transfers || transfers.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transferStatusMap = new Map<string, string>();\n\n\t\tfor (const trx of transfers) {\n\t\t\ttransferStatusMap.set(trx.ReferenceNumber, trx.Status);\n\t\t}\n\n\t\tlogger.info('Mapped transfer statuses', {\n\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\tdata: {\n\t\t\t\ttransferStatusMap,\n\t\t\t},\n\t\t});\n\n\t\tawait Promise.all(\n\t\t\tnotPaidSettlements.map(async settlement => {\n\t\t\t\ttry {\n\t\t\t\t\tconst status = transferStatusMap.get(settlement.crmNumber);\n\n\t\t\t\t\tif (status == BOBTransferStatus.PAID) {\n\t\t\t\t\t\tawait this.settlePayment(settlement);\n\t\t\t\t\t}\n\n\t\t\t\t\tlogger.info(`Settled payment for crmNumber ${settlement.crmNumber}`, {\n\t\t\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\t\t\tdata: { status },\n\t\t\t\t\t});\n\t\t\t\t} catch (err) {\n\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t`Failed settlement with crmNumber ${settlement.crmNumber}, id: ${settlement._id}`,\n\t\t\t\t\t\terr,\n\t\t\t\t\t\t{ tag: LogTag.BOB_TRANSACTION_CHECK }\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t}\n}\n"]}
|
|
@@ -80,10 +80,11 @@ let FCMService = class FCMService {
|
|
|
80
80
|
const isInvisible = payload.invisible === true;
|
|
81
81
|
const channelId = payload.sound ? 'order_alert' : 'default';
|
|
82
82
|
const message = {
|
|
83
|
-
data: {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
83
|
+
data: {
|
|
84
|
+
...payload.data,
|
|
85
|
+
channelId: isInvisible ? 'silent' : channelId,
|
|
86
|
+
notificationTitle: payload.title ?? '',
|
|
87
|
+
notificationBody: payload.body ?? '',
|
|
87
88
|
},
|
|
88
89
|
tokens: batchTokens,
|
|
89
90
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fcmService.js","sourceRoot":"/","sources":["libraries/firebase/fcmService.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,mDAA2C;AAC3C,6BAAqC;AACrC,mCAAiC;AAEjC,+CAAoF;AAwBpF,MAAM,wBAAwB,GAAuE;IACpG,CAAC,8BAAuB,CAAC,KAAK,CAAC,EAAE;QAChC,CAAC,kBAAW,CAAC,GAAG,CAAC,EAAE,OAAO;QAC1B,CAAC,kBAAW,CAAC,OAAO,CAAC,EAAE,OAAO;KAC9B;IAED,CAAC,8BAAuB,CAAC,IAAI,CAAC,EAAE;QAC/B,CAAC,kBAAW,CAAC,GAAG,CAAC,EAAE,OAAO;QAC1B,CAAC,kBAAW,CAAC,OAAO,CAAC,EAAE,OAAO;KAC9B;IAED,CAAC,8BAAuB,CAAC,IAAI,CAAC,EAAE;QAC/B,CAAC,kBAAW,CAAC,GAAG,CAAC,EAAE,OAAO;QAC1B,CAAC,kBAAW,CAAC,OAAO,CAAC,EAAE,OAAO;KAC9B;CACD,CAAC;AAEW,QAAA,iBAAiB,GAAG,kBAAkB,CAAC;AACvC,QAAA,kBAAkB,GAAG,mBAAmB,CAAC;AACzC,QAAA,iBAAiB,GAAG,kBAAkB,CAAC;AACvC,QAAA,mBAAmB,GAAG,oBAAoB,CAAC;AAGjD,IAAM,UAAU,GAAhB,MAAM,UAAU;;IACd,SAAS,CAAuB;IAChC,MAAM,CAAU,SAAS,GAAG,GAAG,CAAC;IAExC,YAAY,GAAS;QACpB,MAAM,WAAW,GAAG,GAAG,IAAI,IAAA,gBAAY,GAAE,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC;QACxE,IAAI,CAAC,SAAS,GAAG,IAAA,0BAAS,EAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAKO,UAAU,CAAI,GAAQ,EAAE,IAAY;QAC3C,MAAM,MAAM,GAAU,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAEO,eAAe,CAAC,EAAU,EAAE,EAAU;QAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,CAAC;IACV,CAAC;IAEO,sBAAsB,CAAC,IAA6B;QAC3D,OAAO,CACN,IAAI,KAAK,8BAAuB,CAAC,IAAI;YACrC,IAAI,KAAK,8BAAuB,CAAC,KAAK;YACtC,IAAI,KAAK,8BAAuB,CAAC,IAAI,CACrC,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,IAA6B;QACxD,OAAO,IAAI,KAAK,8BAAuB,CAAC,YAAY,CAAC;IACtD,CAAC;IAEO,qBAAqB,CAC5B,UAAmC,EACnC,QAAsB,EACtB,OAAgB;QAEhB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3D,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAExC,MAAM,UAAU,GAAG,wBAAwB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEtE,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9B,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAKO,mBAAmB,CAC1B,OAA+B,EAC/B,WAAqB;QAErB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,MAAM,OAAO,GAA+B;YAC3C,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;YACxE,YAAY,EAAE;gBACb,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aAClB;YACD,MAAM,EAAE,WAAW;SACnB,CAAC;QAEF,OAAO,OAAO,CAAC;IAChB,CAAC;IAKO,YAAY,CAAC,OAA+B,EAAE,WAAqB;QAC1E,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;QAE5D,MAAM,OAAO,GAA+B;YAC3C,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;YACxE,YAAY,EAAE;gBACb,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aAClB;YACD,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE;gBACR,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE;oBACb,SAAS,EAAE,QAAQ;iBACnB;aACD;YACD,IAAI,EAAE;gBACL,OAAO,EAAE;oBACR,GAAG,EAAE;wBACJ,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBACjC,gBAAgB,EAAE,IAAI;qBACtB;iBACD;gBACD,OAAO,EAAE;oBACR,gBAAgB,EAAE,YAAY;iBAC9B;aACD;SACD,CAAC;QAEF,OAAO,OAAO,CAAC;IAChB,CAAC;IAKO,eAAe,CACtB,OAA+B,EAC/B,WAAqB;QAErB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;QAE/C,MAAM,OAAO,GAA+B;YAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YACxB,YAAY,EAAE;gBACb,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aAClB;YACD,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;YAC7B,IAAI,EAAE;gBACL,OAAO,EAAE;oBACR,GAAG,EAAE;wBACJ,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;wBACjC,gBAAgB,EAAE,IAAI;qBACtB;iBACD;aACD;SACD,CAAC;QAEF,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,CAAC,YAAY,GAAG;gBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;aAClB,CAAC;YAEF,OAAO,CAAC,OAAO,GAAG;gBACjB,QAAQ,EAAE,MAAM;gBAChB,YAAY,EAAE;oBACb,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,SAAS;iBAC5E;aACD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAQD,KAAK,CAAC,gBAAgB,CACrB,OAA+B,EAC/B,OAAkC;QAElC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,gBAAY,GAAE,CAAC,YAAY,EAAE,CAAC;QAE7C,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC5B,SAAS;YACV,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;YAElF,IAAI,MAAM;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;;gBAC/B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,KAAK,EAAE,IAKxB,EAAE,EAAE;YACJ,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,YAAU,CAAC,SAAS,CAAC,CAAC;YAE5E,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAa,EAAE,CAAC;YAE5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAChC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;gBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB;oBACvC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;oBACpD,CAAC,CAAC,IAAI,CAAC,wBAAwB;wBAC9B,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;wBAChD,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;gBAEhD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAEpE,MAAM,QAAQ,GAAG;oBAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBACnC,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;oBACvD,mBAAmB,EAAE,IAAI,CAAC,mBAAmB;oBAC7C,OAAO;oBACP,QAAQ;iBACR,CAAC;gBAEF,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE;oBAC7D,GAAG,EAAE,aAAM,CAAC,sBAAsB;oBAClC,IAAI,EAAE,QAAQ;iBACd,CAAC,CAAC;gBAEH,MAAM,YAAY,GAAa,EAAE,CAAC;gBAClC,MAAM,WAAW,GAAa,EAAE,CAAC;gBAEjC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;oBACxC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;wBAClB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/B,CAAC;yBAAM,CAAC;wBACP,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;wBAEnC,IACC,SAAS,KAAK,4BAA4B;4BAC1C,SAAS,KAAK,6CAA6C,EAC1D,CAAC;4BACF,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;wBAC9B,CAAC;wBAED,OAAO,CAAC,IAAI,CAAC,uBAAuB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACzE,CAAC;gBACF,CAAC,CAAC,CAAC;gBAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;YACtC,CAAC,CAAC,CACF,CAAC;YAEF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;gBAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC;YAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,aAAa,GAAa,EAAE,CAAC;QACjC,IAAI,YAAY,GAAa,EAAE,CAAC;QAGhC,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;gBACzB,WAAW,EAAE,SAAS;gBACtB,YAAY,EAAE,OAAO;gBACrB,wBAAwB,EAAE,IAAI;aAC9B,CAAC,CAAC;YAEH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAGD,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;gBACzB,WAAW,EAAE,SAAS;gBACtB,YAAY,EAAE,OAAO;gBACrB,wBAAwB,EAAE,KAAK;aAC/B,CAAC,CAAC;YAEH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAGD,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC;gBACzB,WAAW,EAAE,aAAa;gBAC1B,YAAY,EAAE,OAAO;gBACrB,mBAAmB,EAAE,IAAI;aACzB,CAAC,CAAC;YAEH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;YACjC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACxC,CAAC;;AA9SW,gCAAU;qBAAV,UAAU;IADtB,IAAA,gBAAO,GAAE;;GACG,UAAU,CA+StB","sourcesContent":["import { messaging } from 'firebase-admin';\nimport { getLibraries } from '../..';\nimport { Service } from 'typedi';\nimport { App } from 'firebase-admin/app';\nimport { AppPlatform, LogTag, NotificationAccountType } from '../../utilities/enum';\n\nexport interface FCMNotificationPayload {\n\ttitle?: string;\n\tbody?: string;\n\tdata?: Record<string, string>;\n\tsound?: string;\n\tinvisible?: boolean;\n}\n\nexport interface NotificationTokenTarget {\n\ttoken: string;\n\tentityType: NotificationAccountType;\n\tdeviceId?: string;\n\tentityId?: string;\n\tplatform?: AppPlatform;\n\tappVersion?: string;\n}\n\ntype NotifiableEntityType =\n\t| NotificationAccountType.USER\n\t| NotificationAccountType.SHOP\n\t| NotificationAccountType.RIDER;\n\nconst NotificationVersionRules: Record<NotifiableEntityType, Partial<Record<AppPlatform, string>>> = {\n\t[NotificationAccountType.RIDER]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.4',\n\t},\n\n\t[NotificationAccountType.USER]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.3',\n\t},\n\n\t[NotificationAccountType.SHOP]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.3',\n\t},\n};\n\nexport const FCMServiceForUser = 'fcm.service.user';\nexport const FCMServiceForRider = 'fcm.service.rider';\nexport const FCMServiceForShop = 'fcm.service.shop';\nexport const FCMServiceForCpanel = 'fcm.service.cpanel';\n\n@Service()\nexport class FCMService {\n\tprivate messaging!: messaging.Messaging;\n\tprivate static readonly MAX_BATCH = 500;\n\n\tconstructor(app?: App) {\n\t\tconst firebaseApp = app ?? getLibraries().getFirebaseService().superApp;\n\t\tthis.messaging = messaging(firebaseApp);\n\t}\n\n\t/**\n\t * Split array into chunks of fixed size\n\t */\n\tprivate chunkArray<T>(arr: T[], size: number): T[][] {\n\t\tconst chunks: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) {\n\t\t\tchunks.push(arr.slice(i, i + size));\n\t\t}\n\t\treturn chunks;\n\t}\n\n\tprivate compareVersions(v1: string, v2: string): number {\n\t\tconst a = v1.split('.').map(Number);\n\t\tconst b = v2.split('.').map(Number);\n\n\t\tfor (let i = 0; i < Math.max(a.length, b.length); i++) {\n\t\t\tconst diff = (a[i] || 0) - (b[i] || 0);\n\t\t\tif (diff !== 0) return diff;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tprivate isNotifiableEntityType(type: NotificationAccountType): type is NotifiableEntityType {\n\t\treturn (\n\t\t\ttype === NotificationAccountType.USER ||\n\t\t\ttype === NotificationAccountType.RIDER ||\n\t\t\ttype === NotificationAccountType.SHOP\n\t\t);\n\t}\n\n\tprivate isConsoleEntityType(type: NotificationAccountType): type is NotifiableEntityType {\n\t\treturn type === NotificationAccountType.SHOP_CONSOLE;\n\t}\n\n\tprivate shouldUseNewStructure(\n\t\tentityType: NotificationAccountType,\n\t\tplatform?: AppPlatform,\n\t\tversion?: string\n\t): boolean {\n\t\tif (!this.isNotifiableEntityType(entityType)) return false;\n\n\t\tif (!platform || !version) return false;\n\n\t\tconst minVersion = NotificationVersionRules?.[entityType]?.[platform];\n\n\t\tif (!minVersion) return false;\n\n\t\treturn this.compareVersions(version, minVersion) >= 0;\n\t}\n\n\t/**\n\t * Build multicast message safely\n\t */\n\tprivate buildConsoleMessage(\n\t\tpayload: FCMNotificationPayload,\n\t\tbatchTokens: string[]\n\t): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\t\tconst channelId = payload.sound ? 'order_alert' : 'default';\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: { ...payload.data, channelId: isInvisible ? 'silent' : channelId },\n\t\t\tnotification: {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t};\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Build multicast message safely\n\t */\n\tprivate buildMessage(payload: FCMNotificationPayload, batchTokens: string[]): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\t\tconst channelId = payload.sound ? 'order_alert' : 'default';\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: { ...payload.data, channelId: isInvisible ? 'silent' : channelId },\n\t\t\tnotification: {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t\tandroid: {\n\t\t\t\tpriority: 'high',\n\t\t\t\tnotification: {\n\t\t\t\t\tchannelId: 'silent',\n\t\t\t\t},\n\t\t\t},\n\t\t\tapns: {\n\t\t\t\tpayload: {\n\t\t\t\t\taps: {\n\t\t\t\t\t\tsound: payload.sound || 'default',\n\t\t\t\t\t\tcontentAvailable: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\theaders: {\n\t\t\t\t\t'apns-push-type': 'background',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Build multicast message safely for old apps\n\t */\n\tprivate buildOldMessage(\n\t\tpayload: FCMNotificationPayload,\n\t\tbatchTokens: string[]\n\t): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: payload.data || {},\n\t\t\tnotification: {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t\tandroid: { priority: 'high' },\n\t\t\tapns: {\n\t\t\t\tpayload: {\n\t\t\t\t\taps: {\n\t\t\t\t\t\tsound: payload.sound || 'default',\n\t\t\t\t\t\tcontentAvailable: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tif (!isInvisible) {\n\t\t\tmessage.notification = {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t};\n\n\t\t\tmessage.android = {\n\t\t\t\tpriority: 'high',\n\t\t\t\tnotification: {\n\t\t\t\t\tchannelId: payload.sound ? 'android_Push_Notification_Channel_1' : 'default',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Sends a push notification (visible or invisible) to multiple device tokens\n\t * @param payload - Notification title, body, and optional data\n\t * @param tokens - FCM device tokens\n\t * @returns Object containing success and invalid tokens\n\t */\n\tasync sendNotification(\n\t\tpayload: FCMNotificationPayload,\n\t\ttargets: NotificationTokenTarget[]\n\t): Promise<{ successTokens: string[]; failedTokens: string[] }> {\n\t\tif (!targets.length) {\n\t\t\treturn { successTokens: [], failedTokens: [] };\n\t\t}\n\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tconst oldTokens: string[] = [];\n\t\tconst newTokens: string[] = [];\n\t\tconst consoleTokens: string[] = [];\n\n\t\tfor (const t of targets) {\n\t\t\tif (this.isConsoleEntityType(t.entityType)) {\n\t\t\t\tconsoleTokens.push(t.token);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst useNew = this.shouldUseNewStructure(t.entityType, t.platform, t.appVersion);\n\n\t\t\tif (useNew) newTokens.push(t.token);\n\t\t\telse oldTokens.push(t.token);\n\t\t}\n\n\t\tconst sendGroup = async (data: {\n\t\t\tgroupTokens: string[];\n\t\t\tgroupPayload: FCMNotificationPayload;\n\t\t\toldNotificationStructure?: boolean;\n\t\t\tconsoleNotification?: boolean;\n\t\t}) => {\n\t\t\tconst tokenChunks = this.chunkArray(data.groupTokens, FCMService.MAX_BATCH);\n\n\t\t\tconst success: string[] = [];\n\t\t\tconst failed: string[] = [];\n\n\t\t\tconst results = await Promise.all(\n\t\t\t\ttokenChunks.map(async chunk => {\n\t\t\t\t\tconst message = data.consoleNotification\n\t\t\t\t\t\t? this.buildConsoleMessage(data.groupPayload, chunk)\n\t\t\t\t\t\t: data.oldNotificationStructure\n\t\t\t\t\t\t\t? this.buildOldMessage(data.groupPayload, chunk)\n\t\t\t\t\t\t\t: this.buildMessage(data.groupPayload, chunk);\n\n\t\t\t\t\tconst response = await this.messaging.sendEachForMulticast(message);\n\n\t\t\t\t\tconst logEntry = {\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tgroupTokens: data.groupTokens,\n\t\t\t\t\t\tgroupPayload: data.groupPayload,\n\t\t\t\t\t\toldNotificationStructure: data.oldNotificationStructure,\n\t\t\t\t\t\tconsoleNotification: data.consoleNotification,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t};\n\n\t\t\t\t\tlogger.debug('Called Firebase function sendEachForMulticast', {\n\t\t\t\t\t\ttag: LogTag.NOTIFICATION_ATTEMPTED,\n\t\t\t\t\t\tdata: logEntry,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst batchSuccess: string[] = [];\n\t\t\t\t\tconst batchFailed: string[] = [];\n\n\t\t\t\t\tresponse.responses.forEach((resp, idx) => {\n\t\t\t\t\t\tif (resp.success) {\n\t\t\t\t\t\t\tbatchSuccess.push(chunk[idx]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst errorCode = resp.error?.code;\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\terrorCode === 'messaging/invalid-argument' ||\n\t\t\t\t\t\t\t\terrorCode === 'messaging/registration-token-not-registered'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tbatchFailed.push(chunk[idx]);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconsole.warn(`FCM Error for token ${chunk[idx]}:`, resp.error?.message);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn { batchSuccess, batchFailed };\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tfor (const r of results) {\n\t\t\t\tsuccess.push(...r.batchSuccess);\n\t\t\t\tfailed.push(...r.batchFailed);\n\t\t\t}\n\n\t\t\treturn { success, failed };\n\t\t};\n\n\t\tlet successTokens: string[] = [];\n\t\tlet failedTokens: string[] = [];\n\n\t\t// send old payload\n\t\tif (oldTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: oldTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\toldNotificationStructure: true,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\t// send new payload\n\t\tif (newTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: newTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\toldNotificationStructure: false,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\t// send console tokens\n\t\tif (consoleTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: consoleTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\tconsoleNotification: true,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\treturn { successTokens, failedTokens };\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fcmService.js","sourceRoot":"/","sources":["libraries/firebase/fcmService.ts"],"names":[],"mappings":"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","sourcesContent":["import { messaging } from 'firebase-admin';\nimport { getLibraries } from '../..';\nimport { Service } from 'typedi';\nimport { App } from 'firebase-admin/app';\nimport { AppPlatform, LogTag, NotificationAccountType } from '../../utilities/enum';\n\nexport interface FCMNotificationPayload {\n\ttitle?: string;\n\tbody?: string;\n\tdata?: Record<string, string>;\n\tsound?: string;\n\tinvisible?: boolean;\n}\n\nexport interface NotificationTokenTarget {\n\ttoken: string;\n\tentityType: NotificationAccountType;\n\tdeviceId?: string;\n\tentityId?: string;\n\tplatform?: AppPlatform;\n\tappVersion?: string;\n}\n\ntype NotifiableEntityType =\n\t| NotificationAccountType.USER\n\t| NotificationAccountType.SHOP\n\t| NotificationAccountType.RIDER;\n\nconst NotificationVersionRules: Record<NotifiableEntityType, Partial<Record<AppPlatform, string>>> = {\n\t[NotificationAccountType.RIDER]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.4',\n\t},\n\n\t[NotificationAccountType.USER]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.3',\n\t},\n\n\t[NotificationAccountType.SHOP]: {\n\t\t[AppPlatform.IOS]: '2.0.3',\n\t\t[AppPlatform.ANDROID]: '2.0.3',\n\t},\n};\n\nexport const FCMServiceForUser = 'fcm.service.user';\nexport const FCMServiceForRider = 'fcm.service.rider';\nexport const FCMServiceForShop = 'fcm.service.shop';\nexport const FCMServiceForCpanel = 'fcm.service.cpanel';\n\n@Service()\nexport class FCMService {\n\tprivate messaging!: messaging.Messaging;\n\tprivate static readonly MAX_BATCH = 500;\n\n\tconstructor(app?: App) {\n\t\tconst firebaseApp = app ?? getLibraries().getFirebaseService().superApp;\n\t\tthis.messaging = messaging(firebaseApp);\n\t}\n\n\t/**\n\t * Split array into chunks of fixed size\n\t */\n\tprivate chunkArray<T>(arr: T[], size: number): T[][] {\n\t\tconst chunks: T[][] = [];\n\t\tfor (let i = 0; i < arr.length; i += size) {\n\t\t\tchunks.push(arr.slice(i, i + size));\n\t\t}\n\t\treturn chunks;\n\t}\n\n\tprivate compareVersions(v1: string, v2: string): number {\n\t\tconst a = v1.split('.').map(Number);\n\t\tconst b = v2.split('.').map(Number);\n\n\t\tfor (let i = 0; i < Math.max(a.length, b.length); i++) {\n\t\t\tconst diff = (a[i] || 0) - (b[i] || 0);\n\t\t\tif (diff !== 0) return diff;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tprivate isNotifiableEntityType(type: NotificationAccountType): type is NotifiableEntityType {\n\t\treturn (\n\t\t\ttype === NotificationAccountType.USER ||\n\t\t\ttype === NotificationAccountType.RIDER ||\n\t\t\ttype === NotificationAccountType.SHOP\n\t\t);\n\t}\n\n\tprivate isConsoleEntityType(type: NotificationAccountType): type is NotifiableEntityType {\n\t\treturn type === NotificationAccountType.SHOP_CONSOLE;\n\t}\n\n\tprivate shouldUseNewStructure(\n\t\tentityType: NotificationAccountType,\n\t\tplatform?: AppPlatform,\n\t\tversion?: string\n\t): boolean {\n\t\tif (!this.isNotifiableEntityType(entityType)) return false;\n\n\t\tif (!platform || !version) return false;\n\n\t\tconst minVersion = NotificationVersionRules?.[entityType]?.[platform];\n\n\t\tif (!minVersion) return false;\n\n\t\treturn this.compareVersions(version, minVersion) >= 0;\n\t}\n\n\t/**\n\t * Build multicast message safely\n\t */\n\tprivate buildConsoleMessage(\n\t\tpayload: FCMNotificationPayload,\n\t\tbatchTokens: string[]\n\t): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\t\tconst channelId = payload.sound ? 'order_alert' : 'default';\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: {\n\t\t\t\t...payload.data,\n\t\t\t\tchannelId: isInvisible ? 'silent' : channelId,\n\t\t\t\tnotificationTitle: payload.title ?? '',\n\t\t\t\tnotificationBody: payload.body ?? '',\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t};\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Build multicast message safely\n\t */\n\tprivate buildMessage(payload: FCMNotificationPayload, batchTokens: string[]): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\t\tconst channelId = payload.sound ? 'order_alert' : 'default';\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: { ...payload.data, channelId: isInvisible ? 'silent' : channelId },\n\t\t\tnotification: {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t\tandroid: {\n\t\t\t\tpriority: 'high',\n\t\t\t\tnotification: {\n\t\t\t\t\tchannelId: 'silent',\n\t\t\t\t},\n\t\t\t},\n\t\t\tapns: {\n\t\t\t\tpayload: {\n\t\t\t\t\taps: {\n\t\t\t\t\t\tsound: payload.sound || 'default',\n\t\t\t\t\t\tcontentAvailable: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\theaders: {\n\t\t\t\t\t'apns-push-type': 'background',\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Build multicast message safely for old apps\n\t */\n\tprivate buildOldMessage(\n\t\tpayload: FCMNotificationPayload,\n\t\tbatchTokens: string[]\n\t): messaging.MulticastMessage {\n\t\tconst isInvisible = payload.invisible === true;\n\n\t\tconst message: messaging.MulticastMessage = {\n\t\t\tdata: payload.data || {},\n\t\t\tnotification: {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t},\n\t\t\ttokens: batchTokens,\n\t\t\tandroid: { priority: 'high' },\n\t\t\tapns: {\n\t\t\t\tpayload: {\n\t\t\t\t\taps: {\n\t\t\t\t\t\tsound: payload.sound || 'default',\n\t\t\t\t\t\tcontentAvailable: true,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\n\t\tif (!isInvisible) {\n\t\t\tmessage.notification = {\n\t\t\t\ttitle: payload.title,\n\t\t\t\tbody: payload.body,\n\t\t\t};\n\n\t\t\tmessage.android = {\n\t\t\t\tpriority: 'high',\n\t\t\t\tnotification: {\n\t\t\t\t\tchannelId: payload.sound ? 'android_Push_Notification_Channel_1' : 'default',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn message;\n\t}\n\n\t/**\n\t * Sends a push notification (visible or invisible) to multiple device tokens\n\t * @param payload - Notification title, body, and optional data\n\t * @param tokens - FCM device tokens\n\t * @returns Object containing success and invalid tokens\n\t */\n\tasync sendNotification(\n\t\tpayload: FCMNotificationPayload,\n\t\ttargets: NotificationTokenTarget[]\n\t): Promise<{ successTokens: string[]; failedTokens: string[] }> {\n\t\tif (!targets.length) {\n\t\t\treturn { successTokens: [], failedTokens: [] };\n\t\t}\n\n\t\tconst logger = getLibraries().getLoggerKit();\n\n\t\tconst oldTokens: string[] = [];\n\t\tconst newTokens: string[] = [];\n\t\tconst consoleTokens: string[] = [];\n\n\t\tfor (const t of targets) {\n\t\t\tif (this.isConsoleEntityType(t.entityType)) {\n\t\t\t\tconsoleTokens.push(t.token);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst useNew = this.shouldUseNewStructure(t.entityType, t.platform, t.appVersion);\n\n\t\t\tif (useNew) newTokens.push(t.token);\n\t\t\telse oldTokens.push(t.token);\n\t\t}\n\n\t\tconst sendGroup = async (data: {\n\t\t\tgroupTokens: string[];\n\t\t\tgroupPayload: FCMNotificationPayload;\n\t\t\toldNotificationStructure?: boolean;\n\t\t\tconsoleNotification?: boolean;\n\t\t}) => {\n\t\t\tconst tokenChunks = this.chunkArray(data.groupTokens, FCMService.MAX_BATCH);\n\n\t\t\tconst success: string[] = [];\n\t\t\tconst failed: string[] = [];\n\n\t\t\tconst results = await Promise.all(\n\t\t\t\ttokenChunks.map(async chunk => {\n\t\t\t\t\tconst message = data.consoleNotification\n\t\t\t\t\t\t? this.buildConsoleMessage(data.groupPayload, chunk)\n\t\t\t\t\t\t: data.oldNotificationStructure\n\t\t\t\t\t\t\t? this.buildOldMessage(data.groupPayload, chunk)\n\t\t\t\t\t\t\t: this.buildMessage(data.groupPayload, chunk);\n\n\t\t\t\t\tconst response = await this.messaging.sendEachForMulticast(message);\n\n\t\t\t\t\tconst logEntry = {\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tgroupTokens: data.groupTokens,\n\t\t\t\t\t\tgroupPayload: data.groupPayload,\n\t\t\t\t\t\toldNotificationStructure: data.oldNotificationStructure,\n\t\t\t\t\t\tconsoleNotification: data.consoleNotification,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\tresponse,\n\t\t\t\t\t};\n\n\t\t\t\t\tlogger.debug('Called Firebase function sendEachForMulticast', {\n\t\t\t\t\t\ttag: LogTag.NOTIFICATION_ATTEMPTED,\n\t\t\t\t\t\tdata: logEntry,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst batchSuccess: string[] = [];\n\t\t\t\t\tconst batchFailed: string[] = [];\n\n\t\t\t\t\tresponse.responses.forEach((resp, idx) => {\n\t\t\t\t\t\tif (resp.success) {\n\t\t\t\t\t\t\tbatchSuccess.push(chunk[idx]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst errorCode = resp.error?.code;\n\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\terrorCode === 'messaging/invalid-argument' ||\n\t\t\t\t\t\t\t\terrorCode === 'messaging/registration-token-not-registered'\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tbatchFailed.push(chunk[idx]);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconsole.warn(`FCM Error for token ${chunk[idx]}:`, resp.error?.message);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\treturn { batchSuccess, batchFailed };\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tfor (const r of results) {\n\t\t\t\tsuccess.push(...r.batchSuccess);\n\t\t\t\tfailed.push(...r.batchFailed);\n\t\t\t}\n\n\t\t\treturn { success, failed };\n\t\t};\n\n\t\tlet successTokens: string[] = [];\n\t\tlet failedTokens: string[] = [];\n\n\t\t// send old payload\n\t\tif (oldTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: oldTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\toldNotificationStructure: true,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\t// send new payload\n\t\tif (newTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: newTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\toldNotificationStructure: false,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\t// send console tokens\n\t\tif (consoleTokens.length) {\n\t\t\tconst r = await sendGroup({\n\t\t\t\tgroupTokens: consoleTokens,\n\t\t\t\tgroupPayload: payload,\n\t\t\t\tconsoleNotification: true,\n\t\t\t});\n\n\t\t\tsuccessTokens.push(...r.success);\n\t\t\tfailedTokens.push(...r.failed);\n\t\t}\n\n\t\treturn { successTokens, failedTokens };\n\t}\n}\n"]}
|
|
@@ -6,6 +6,7 @@ import { User } from './user.model';
|
|
|
6
6
|
import { RegularOrderPricing } from './embedded/order-pricing.model';
|
|
7
7
|
import { CartStatus } from '../../../utilities/enum';
|
|
8
8
|
import { Shop } from './shop.model';
|
|
9
|
+
import { PaymentRecord } from './embedded/payment-record.model';
|
|
9
10
|
export declare class CartParticipant extends TimeStamps {
|
|
10
11
|
cart: Ref<Cart>;
|
|
11
12
|
user: Ref<User>;
|
|
@@ -15,6 +16,7 @@ export declare class CartParticipant extends TimeStamps {
|
|
|
15
16
|
spentAmount: number;
|
|
16
17
|
secondarySpentAmount: number;
|
|
17
18
|
paymentInformation?: PaymentInformation;
|
|
19
|
+
paymentRecords?: PaymentRecord[];
|
|
18
20
|
isCreator: boolean;
|
|
19
21
|
name: string;
|
|
20
22
|
profilePhoto?: string;
|
|
@@ -18,6 +18,7 @@ const user_model_1 = require("./user.model");
|
|
|
18
18
|
const order_pricing_model_1 = require("./embedded/order-pricing.model");
|
|
19
19
|
const enum_1 = require("../../../utilities/enum");
|
|
20
20
|
const shop_model_1 = require("./shop.model");
|
|
21
|
+
const payment_record_model_1 = require("./embedded/payment-record.model");
|
|
21
22
|
let CartParticipant = class CartParticipant extends defaultClasses_1.TimeStamps {
|
|
22
23
|
cart;
|
|
23
24
|
user;
|
|
@@ -27,6 +28,7 @@ let CartParticipant = class CartParticipant extends defaultClasses_1.TimeStamps
|
|
|
27
28
|
spentAmount;
|
|
28
29
|
secondarySpentAmount;
|
|
29
30
|
paymentInformation;
|
|
31
|
+
paymentRecords;
|
|
30
32
|
isCreator;
|
|
31
33
|
name;
|
|
32
34
|
profilePhoto;
|
|
@@ -68,6 +70,10 @@ __decorate([
|
|
|
68
70
|
(0, typegoose_1.prop)({ type: () => payment_infromation_model_1.PaymentInformation, _id: false }),
|
|
69
71
|
__metadata("design:type", payment_infromation_model_1.PaymentInformation)
|
|
70
72
|
], CartParticipant.prototype, "paymentInformation", void 0);
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, typegoose_1.prop)({ type: () => [payment_record_model_1.PaymentRecord], _id: false, default: [] }),
|
|
75
|
+
__metadata("design:type", Array)
|
|
76
|
+
], CartParticipant.prototype, "paymentRecords", void 0);
|
|
71
77
|
__decorate([
|
|
72
78
|
(0, typegoose_1.prop)({ type: Boolean, default: false }),
|
|
73
79
|
__metadata("design:type", Boolean)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cart-participant.model.js","sourceRoot":"/","sources":["libraries/mongo/models/cart-participant.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAgF;AAChF,4EAAqE;AACrE,6CAAoC;AACpC,oFAA0E;AAC1E,6CAAoC;AACpC,wEAAqE;AACrE,kDAAqD;AACrD,6CAAoC;
|
|
1
|
+
{"version":3,"file":"cart-participant.model.js","sourceRoot":"/","sources":["libraries/mongo/models/cart-participant.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { prop, Ref, index, modelOptions, Severity } from '@typegoose/typegoose';\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\nimport { Cart } from './cart.model';\nimport { PaymentInformation } from './embedded/payment-infromation.model';\nimport { User } from './user.model';\nimport { RegularOrderPricing } from './embedded/order-pricing.model';\nimport { CartStatus } from '../../../utilities/enum';\nimport { Shop } from './shop.model';\nimport { PaymentRecord } from './embedded/payment-record.model';\n\n/**\n * CartParticipant model - Tracks users participating in a group cart\n */\n@modelOptions({\n\tschemaOptions: {\n\t\tcollection: 'cartParticipants',\n\t\ttoJSON: { virtuals: true },\n\t\ttoObject: { virtuals: true },\n\t},\n\toptions: {\n\t\tallowMixed: Severity.ALLOW,\n\t},\n})\n@index({ cart: 1, user: 1 }, { unique: true })\n@index({ cart: 1 })\nexport class CartParticipant extends TimeStamps {\n\t@prop({ required: true, ref: () => Cart })\n\tpublic cart!: Ref<Cart>;\n\n\t@prop({ required: true, ref: () => User })\n\tpublic user!: Ref<User>;\n\n\t@prop({ type: Date, default: () => new Date() })\n\tpublic joinedAt!: Date;\n\n\t@prop({ type: Boolean, default: false })\n\tpublic isReady!: boolean;\n\n\t@prop({ type: Date })\n\tpublic readyAt?: Date;\n\n\t@prop({ type: Number, default: 0 })\n\tpublic spentAmount!: number;\n\n\t@prop({ type: Number, default: 0 })\n\tpublic secondarySpentAmount!: number;\n\n\t@prop({ type: () => PaymentInformation, _id: false }) // Todo: Remove this after paymentRecords is fully implemented\n\tpublic paymentInformation?: PaymentInformation;\n\n\t@prop({ type: () => [PaymentRecord], _id: false, default: [] })\n\tpublic paymentRecords?: PaymentRecord[];\n\n\t@prop({ type: Boolean, default: false })\n\tpublic isCreator!: boolean;\n\n\t@prop({ required: true, type: String })\n\tpublic name!: string;\n\n\t@prop({ type: String })\n\tpublic profilePhoto?: string;\n\n\t@prop({ type: String })\n\tpublic phoneNumber?: string;\n\n\t@prop({ type: () => RegularOrderPricing })\n\tpublic pricing?: RegularOrderPricing;\n\n\t@prop({\n\t\tenum: CartStatus,\n\t\ttype: String,\n\t\tdefault: CartStatus.ACTIVE,\n\t\trequired: true,\n\t})\n\tpublic cartStatus!: CartStatus;\n\n\t@prop({ required: true, ref: () => Shop })\n\tpublic shop!: Ref<Shop>;\n}\n"]}
|
|
@@ -3,10 +3,12 @@ import { PaymentInformation } from './payment-infromation.model';
|
|
|
3
3
|
import { PaymentMethod } from '../../../../utilities/enum';
|
|
4
4
|
import { RiderProfit } from './profit.model';
|
|
5
5
|
import { CashSettlement } from './cash-settlement.model';
|
|
6
|
+
import { PaymentRecord } from './payment-record.model';
|
|
6
7
|
export declare class OrderFinance extends TimeStamps {
|
|
7
8
|
exchangeRate?: number;
|
|
8
9
|
paymentMethod?: PaymentMethod;
|
|
9
10
|
paymentInformation?: PaymentInformation;
|
|
11
|
+
paymentRecords?: PaymentRecord[];
|
|
10
12
|
riderProfit?: RiderProfit;
|
|
11
13
|
cashSettlement?: CashSettlement;
|
|
12
14
|
}
|
|
@@ -16,10 +16,12 @@ const payment_infromation_model_1 = require("./payment-infromation.model");
|
|
|
16
16
|
const enum_1 = require("../../../../utilities/enum");
|
|
17
17
|
const profit_model_1 = require("./profit.model");
|
|
18
18
|
const cash_settlement_model_1 = require("./cash-settlement.model");
|
|
19
|
+
const payment_record_model_1 = require("./payment-record.model");
|
|
19
20
|
class OrderFinance extends defaultClasses_1.TimeStamps {
|
|
20
21
|
exchangeRate;
|
|
21
22
|
paymentMethod;
|
|
22
23
|
paymentInformation;
|
|
24
|
+
paymentRecords;
|
|
23
25
|
riderProfit;
|
|
24
26
|
cashSettlement;
|
|
25
27
|
}
|
|
@@ -36,6 +38,10 @@ __decorate([
|
|
|
36
38
|
(0, typegoose_1.prop)({ type: () => payment_infromation_model_1.PaymentInformation, _id: false }),
|
|
37
39
|
__metadata("design:type", payment_infromation_model_1.PaymentInformation)
|
|
38
40
|
], OrderFinance.prototype, "paymentInformation", void 0);
|
|
41
|
+
__decorate([
|
|
42
|
+
(0, typegoose_1.prop)({ type: () => [payment_record_model_1.PaymentRecord], _id: false, default: [] }),
|
|
43
|
+
__metadata("design:type", Array)
|
|
44
|
+
], OrderFinance.prototype, "paymentRecords", void 0);
|
|
39
45
|
__decorate([
|
|
40
46
|
(0, typegoose_1.prop)({ type: () => profit_model_1.RiderProfit }),
|
|
41
47
|
__metadata("design:type", profit_model_1.RiderProfit)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"order-finance.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/order-finance.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAC5C,4EAAqE;AACrE,2EAAiE;AACjE,qDAA2D;AAC3D,iDAA6C;AAC7C,mEAAyD;
|
|
1
|
+
{"version":3,"file":"order-finance.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/order-finance.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAC5C,4EAAqE;AACrE,2EAAiE;AACjE,qDAA2D;AAC3D,iDAA6C;AAC7C,mEAAyD;AACzD,iEAAuD;AAEvD,MAAa,YAAa,SAAQ,2BAAU;IAEpC,YAAY,CAAU;IAGtB,aAAa,CAAiB;IAG9B,kBAAkB,CAAsB;IAGxC,cAAc,CAAmB;IAGjC,WAAW,CAAe;IAG1B,cAAc,CAAkB;CACvC;AAlBD,oCAkBC;AAhBO;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;;kDACN;AAGtB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAa,EAAE,OAAO,EAAE,oBAAa,CAAC,IAAI,EAAE,CAAC;;mDACpC;AAG9B;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,8CAAkB,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;8BACzB,8CAAkB;wDAAC;AAGxC;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,oCAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;;oDACvB;AAGjC;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,0BAAW,EAAE,CAAC;8BACb,0BAAW;iDAAC;AAG1B;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,sCAAc,EAAE,CAAC;8BACb,sCAAc;oDAAC","sourcesContent":["import { prop } from '@typegoose/typegoose';\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\nimport { PaymentInformation } from './payment-infromation.model';\nimport { PaymentMethod } from '../../../../utilities/enum';\nimport { RiderProfit } from './profit.model';\nimport { CashSettlement } from './cash-settlement.model';\nimport { PaymentRecord } from './payment-record.model';\n\nexport class OrderFinance extends TimeStamps {\n\t@prop({ type: Number, default: 0 })\n\tpublic exchangeRate?: number;\n\n\t@prop({ type: String, enum: PaymentMethod, default: PaymentMethod.CASH })\n\tpublic paymentMethod?: PaymentMethod;\n\n\t@prop({ type: () => PaymentInformation, _id: false }) // Todo: Remove this after paymentRecords is fully implemented\n\tpublic paymentInformation?: PaymentInformation;\n\n\t@prop({ type: () => [PaymentRecord], _id: false, default: [] })\n\tpublic paymentRecords?: PaymentRecord[];\n\n\t@prop({ type: () => RiderProfit })\n\tpublic riderProfit?: RiderProfit;\n\n\t@prop({ type: () => CashSettlement })\n\tpublic cashSettlement?: CashSettlement;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment-infromation.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/payment-infromation.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAC5C,qDAAsD;AAEtD,MAAa,kBAAkB;
|
|
1
|
+
{"version":3,"file":"payment-infromation.model.js","sourceRoot":"/","sources":["libraries/mongo/models/embedded/payment-infromation.model.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA4C;AAC5C,qDAAsD;AAEtD,MAAa,kBAAkB;IAGvB,QAAQ,CAAY;IAGpB,eAAe,CAAU;IAGzB,OAAO,CAAU;IAGjB,aAAa,CAAU;CAC9B;AAbD,gDAaC;AAVO;IADN,IAAA,gBAAI,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,eAAQ,EAAE,OAAO,EAAE,eAAQ,CAAC,MAAM,EAAE,CAAC;;oDACtD;AAGpB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;2DACS;AAGzB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;mDACC;AAGjB;IADN,IAAA,gBAAI,EAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDACO","sourcesContent":["import { prop } from '@typegoose/typegoose';\nimport { CardType } from '../../../../utilities/enum';\n\nexport class PaymentInformation {\n\t// Todo: Remove this after paymentRecords is fully implemented\n\t@prop({ required: true, type: String, enum: CardType, default: CardType.AREEBA })\n\tpublic cardType!: CardType;\n\n\t@prop({ type: String })\n\tpublic paymentIntentId?: string;\n\n\t@prop({ type: String })\n\tpublic orderId?: string;\n\n\t@prop({ type: String })\n\tpublic transactionId?: string;\n}\n"]}
|