@lyxa.ai/core 1.4.268 → 1.4.270
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.
|
@@ -84,12 +84,17 @@ let BOBService = class BOBService {
|
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
86
|
catch (error) {
|
|
87
|
+
const axiosError = error;
|
|
87
88
|
this.logger.error('Error posting to BOB API:', error, {
|
|
88
89
|
tag: enum_1.LogTag.BOB_TRANSACTION_INITIATE,
|
|
89
90
|
data: {
|
|
90
91
|
crmNumber,
|
|
91
|
-
|
|
92
|
-
|
|
92
|
+
url: axiosError.config?.url,
|
|
93
|
+
method: axiosError.config?.method,
|
|
94
|
+
requestBody: axiosError.config?.data,
|
|
95
|
+
responseStatus: axiosError.response?.status,
|
|
96
|
+
responseData: axiosError.response?.data,
|
|
97
|
+
message: axiosError.message,
|
|
93
98
|
},
|
|
94
99
|
});
|
|
95
100
|
throw (0, error_common_1.internalServerError)('Failed to post data to BOB API.');
|
|
@@ -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\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 {\n\tAccountType,\n\tBobChannelType,\n\tBobModel,\n\tBobSettlementStatus,\n\tBobSettlementType,\n\tBobType,\n\tLogTag,\n\tSettlementType,\n} from '../../../utilities/enum';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { getLibraries } from '../../..';\nimport { LyxaLoggerKit } from '../../logger-kit';\nimport { badRequestError, internalServerError, notFoundError } from '../../../utilities/error-common';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '../../../utilities/shared/currency';\nimport dayjs from 'dayjs';\nimport { publishEvent } from '../../event';\nimport { RiderCashSettledEvent } from '../../event/events';\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\tprivate logger: LyxaLoggerKit;\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\t\tthis.logger = getLibraries().getLoggerKit();\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\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\tthis.logger.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 crmNumber = reference;\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\tlet data: any;\n\n\t\ttry {\n\t\t\tdata = await axios.post(`${this.BOB_URL}InsertTransferData`, bobData, {\n\t\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.logger.error('Error posting to BOB API:', error, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terror,\n\t\t\t\t\tdata,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tthis.logger.error('Error in BOB initiateSettlement:', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorCode: data.ErrorCode,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tthis.logger.error('Failed to initiate settlement in BOB', responseObject, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tresponseObject,\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to initiate settlement in BOB.');\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\tthis.logger.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\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\tthis.logger.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\tthis.logger.error('Settlement not found', undefined, {\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 notFoundError('Settlement not found.');\n\t\t}\n\n\t\tif (settlement.status === BobSettlementStatus.PAID) {\n\t\t\tthis.logger.error('Settlement is already marked as paid', undefined, {\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 badRequestError('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\tthis.logger.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\tthis.logger.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\tthis.logger.error(`Rider with ID ${settlement.rider} not found.`, undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow notFoundError('Rider not found.');\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\t// if rider cash in hand will be below limit then remove limit reached flag\n\t\tconst bobCashSettlementLimit = settings?.riderSetting?.bobCashSettlementLimit || Infinity;\n\n\t\tconst limitForRider =\n\t\t\trider.useIndividualCashSettlementLimit && rider.cashSettlementLimit\n\t\t\t\t? rider.cashSettlementLimit\n\t\t\t\t: bobCashSettlementLimit;\n\n\t\tconst totalCashInHand =\n\t\t\t(rider.cashInHand?.amount || 0) +\n\t\t\tdeltaPrimary +\n\t\t\troundBaseCurrency(((rider.cashInHand?.secondaryAmount || 0) + deltaSecondary) / exchangeRate);\n\n\t\tconst isLimitReached = totalCashInHand >= limitForRider;\n\n\t\tconst unsetUpdate = !isLimitReached ? { cashLimitReason: 1, isCashSettlementLimitReached: 1 } : {};\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\t$unset: unsetUpdate,\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tthis.logger.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\n\t\tpublishEvent(new RiderCashSettledEvent(rider._id));\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 = 0;\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\tthis.logger.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\tthis.logger.error('Settlement with reference not found', undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\t\tdata: {\n\t\t\t\t\treference,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow notFoundError('Settlement not found.');\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\tthis.logger.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\tthis.logger.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\tthis.logger.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\tthis.logger.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\tthis.logger.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 transferExists = await this.hasUnpaidTransfer(crmNumber);\n\n\t\tif (!transferExists) {\n\t\t\tthis.logger.error('No transfer exists for this crm number in bob', undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn;\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\tthis.logger.error('Error in BOB removeTransfer', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tthis.logger.error('Failed to remove transfer in BOB', responseObject, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to remove transfer in BOB.');\n\t\t}\n\n\t\tthis.logger.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\tsettlementType: BobSettlementType.SETTLE_CASH,\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\tsettlementType: BobSettlementType.SETTLE_CASH,\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(\n\t\ttimeframe: { startDate: Date; endDate: Date },\n\t\tmodel: BobModel = BobModel.C2B\n\t): Promise<any[]> {\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: model,\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\tthis.logger.error('Error in BOB getTransfers', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\ttimeframe,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tthis.logger.error('Failed to get transfers in BOB', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\ttimeframe,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to get transfers in BOB.');\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\tthis.logger.error('Error decompressing GZIP', err, {\n\t\t\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tresponseLength: response?.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\treject(internalServerError('Failed to decompress data from BOB API.'));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\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 == 213) {\n\t\t\t// Record does not exist\n\t\t\treturn false;\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tthis.logger.error('Error in BOB getTransferStatus', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tthis.logger.error('Failed to get settlement status in BOB', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to get settlement status in BOB.');\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 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\tthis.logger.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.subtract(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\tthis.logger.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: transfers.map(t => ({ ReferenceNumber: t.ReferenceNumber, Status: t.Status })),\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\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\tthis.logger.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\tthis.logger.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\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 {\n\tAccountType,\n\tBobChannelType,\n\tBobModel,\n\tBobSettlementStatus,\n\tBobSettlementType,\n\tBobType,\n\tLogTag,\n\tSettlementType,\n} from '../../../utilities/enum';\nimport { DocumentType, mongoose } from '@typegoose/typegoose';\nimport { getLibraries } from '../../..';\nimport { LyxaLoggerKit } from '../../logger-kit';\nimport { badRequestError, internalServerError, notFoundError } from '../../../utilities/error-common';\nimport { roundBaseCurrency, roundSecondaryCurrency } from '../../../utilities/shared/currency';\nimport dayjs from 'dayjs';\nimport { publishEvent } from '../../event';\nimport { RiderCashSettledEvent } from '../../event/events';\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\tprivate logger: LyxaLoggerKit;\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\t\tthis.logger = getLibraries().getLoggerKit();\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\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\tthis.logger.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 crmNumber = reference;\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\tlet data: any;\n\n\t\ttry {\n\t\t\tdata = await axios.post(`${this.BOB_URL}InsertTransferData`, bobData, {\n\t\t\t\thttpsAgent: new https.Agent({ rejectUnauthorized: false }),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tconst axiosError = error as any;\n\t\t\tthis.logger.error('Error posting to BOB API:', error, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\turl: axiosError.config?.url,\n\t\t\t\t\tmethod: axiosError.config?.method,\n\t\t\t\t\trequestBody: axiosError.config?.data,\n\t\t\t\t\tresponseStatus: axiosError.response?.status,\n\t\t\t\t\tresponseData: axiosError.response?.data,\n\t\t\t\t\tmessage: axiosError.message,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tthis.logger.error('Error in BOB initiateSettlement:', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorCode: data.ErrorCode,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tthis.logger.error('Failed to initiate settlement in BOB', responseObject, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_INITIATE,\n\t\t\t\tdata: {\n\t\t\t\t\tresponseObject,\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to initiate settlement in BOB.');\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\tthis.logger.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\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\tthis.logger.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\tthis.logger.error('Settlement not found', undefined, {\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 notFoundError('Settlement not found.');\n\t\t}\n\n\t\tif (settlement.status === BobSettlementStatus.PAID) {\n\t\t\tthis.logger.error('Settlement is already marked as paid', undefined, {\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 badRequestError('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\tthis.logger.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\tthis.logger.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\tthis.logger.error(`Rider with ID ${settlement.rider} not found.`, undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_SETTLE,\n\t\t\t\tdata: {\n\t\t\t\t\tsettlementId: settlement._id.toString(),\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow notFoundError('Rider not found.');\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\t// if rider cash in hand will be below limit then remove limit reached flag\n\t\tconst bobCashSettlementLimit = settings?.riderSetting?.bobCashSettlementLimit || Infinity;\n\n\t\tconst limitForRider =\n\t\t\trider.useIndividualCashSettlementLimit && rider.cashSettlementLimit\n\t\t\t\t? rider.cashSettlementLimit\n\t\t\t\t: bobCashSettlementLimit;\n\n\t\tconst totalCashInHand =\n\t\t\t(rider.cashInHand?.amount || 0) +\n\t\t\tdeltaPrimary +\n\t\t\troundBaseCurrency(((rider.cashInHand?.secondaryAmount || 0) + deltaSecondary) / exchangeRate);\n\n\t\tconst isLimitReached = totalCashInHand >= limitForRider;\n\n\t\tconst unsetUpdate = !isLimitReached ? { cashLimitReason: 1, isCashSettlementLimitReached: 1 } : {};\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\t$unset: unsetUpdate,\n\t\t\t},\n\t\t\t{ new: true, runValidators: true }\n\t\t);\n\n\t\tthis.logger.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\n\t\tpublishEvent(new RiderCashSettledEvent(rider._id));\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 = 0;\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\tthis.logger.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\tthis.logger.error('Settlement with reference not found', undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REVOKE,\n\t\t\t\tdata: {\n\t\t\t\t\treference,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow notFoundError('Settlement not found.');\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\tthis.logger.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\tthis.logger.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\tthis.logger.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\tthis.logger.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\tthis.logger.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 transferExists = await this.hasUnpaidTransfer(crmNumber);\n\n\t\tif (!transferExists) {\n\t\t\tthis.logger.error('No transfer exists for this crm number in bob', undefined, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\treturn;\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\tthis.logger.error('Error in BOB removeTransfer', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject || !responseObject.isSuccess) {\n\t\t\tthis.logger.error('Failed to remove transfer in BOB', responseObject, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_REMOVE,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to remove transfer in BOB.');\n\t\t}\n\n\t\tthis.logger.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\tsettlementType: BobSettlementType.SETTLE_CASH,\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\tsettlementType: BobSettlementType.SETTLE_CASH,\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(\n\t\ttimeframe: { startDate: Date; endDate: Date },\n\t\tmodel: BobModel = BobModel.C2B\n\t): Promise<any[]> {\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: model,\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\tthis.logger.error('Error in BOB getTransfers', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\ttimeframe,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tthis.logger.error('Failed to get transfers in BOB', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\ttimeframe,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to get transfers in BOB.');\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\tthis.logger.error('Error decompressing GZIP', err, {\n\t\t\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tresponseLength: response?.length,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t\ttry {\n\t\t\t\t\t\treject(internalServerError('Failed to decompress data from BOB API.'));\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\treject(error);\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 == 213) {\n\t\t\t// Record does not exist\n\t\t\treturn false;\n\t\t}\n\n\t\tif (data.ErrorCode != 100) {\n\t\t\tthis.logger.error('Error in BOB getTransferStatus', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t\terrorDescription: data.ErrorDescription,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to post data to BOB API.');\n\t\t}\n\n\t\tconst responseObject = await this.decompressResponse(data.Response);\n\n\t\tif (!responseObject) {\n\t\t\tthis.logger.error('Failed to get settlement status in BOB', data, {\n\t\t\t\ttag: LogTag.BOB_TRANSACTION_CHECK,\n\t\t\t\tdata: {\n\t\t\t\t\tcrmNumber,\n\t\t\t\t},\n\t\t\t});\n\t\t\tthrow internalServerError('Failed to get settlement status in BOB.');\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 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\tthis.logger.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.subtract(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\tthis.logger.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: transfers.map(t => ({ ReferenceNumber: t.ReferenceNumber, Status: t.Status })),\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\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\tthis.logger.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\tthis.logger.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"]}
|
package/dist/types/README.md
CHANGED
package/dist/types/package.json
CHANGED