multivendor-wallet 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/types.ts","../src/client.ts","../src/currency.ts","../src/hooks/order.ts","../src/hooks/refund.ts","../src/hooks/settlement.ts","../src/plugin-instance.ts","../src/typeorm/entities.ts","../src/hooks/reconciliation.ts","../src/hooks/index.ts","../src/http/routing-controllers/AdminWalletController.ts","../src/http/routing-controllers/CustomerWalletController.ts","../src/http/routing-controllers/VendorWalletController.ts","../src/http/express/router.ts","../src/http/plugin-http.ts","../src/payment/types.ts","../src/payment/WalletPaymentAdapter.ts","../src/typeorm/store.ts","../src/typeorm/migrations/CreateWalletTables.ts","../src/typeorm/metadata.ts","../src/plugin-types.ts","../src/plugin.ts"],"names":["WalletError","Error","message","name","WalletConfigError","InsufficientBalanceError","HoldNotFoundError","DuplicateOperationError","existingEntry","InvalidAmountError","WalletAccountType","LedgerEntryType","HoldStatus","WalletLedgerClient","store","config","getOrCreateAccount","type","ownerId","currency","ctx","runInTransaction","tx","defaultCurrency","getBalance","accountId","account","getAccountById","toBalance","credit","params","assertPositiveAmount","amount","creditInTx","debit","debitInTx","hold","holdInTx","release","releaseInTx","cancelHold","cancelHoldInTx","transfer","fromAccountId","idempotencyKey","reference","metadata","toAccountId","getTransactions","limit","offset","listLedgerEntries","existing","findLedgerByIdempotencyKey","entry","lockAccount","updated","updateBalances","availableDelta","appendLedgerEntry","entryType","CREDIT","balanceAfterAvailable","availableBalance","balanceAfterHeld","heldBalance","referenceType","referenceId","locked","DEBIT","findHoldByReference","undefined","existingHold","status","ACTIVE","source","sourceAccountId","targetUpdated","targetAccountId","heldDelta","upsertHold","sourceAfterHold","HOLD","requireActiveHold","releasedHold","RELEASED","RELEASE","sourceUpdated","cancelledHold","CANCELLED","CANCEL_HOLD","available","held","total","Number","isInteger","toMinorUnit","Math","round","fromMinorUnit","isWalletOnlyPayment","paymentMethod","String","trim","toLowerCase","createOrderHooks","runtime","client","platformOwnerId","flags","onOrderPaid","enabled","ledgerWrites","txCtx","nativeTx","platform","PLATFORM","orderTotalPaise","orderTotalRupees","shouldDebitCustomer","customerId","skipCustomerDebit","debitRupees","walletAmountRupees","customer","CUSTOMER","id","paymentNumber","orderId","line","lines","vendorNetRupees","commissionBaseRupees","commissionRupees","vendor","VENDOR","vendorId","vendorOrderId","onLineDelivered","isWalletPayment","walletCreditRupees","walletRefundRupees","lineTotalRupees","idempotencyPrefix","scope","idempotencyScope","orderProductId","refundReason","createRefundHooks","onRefund","processExternalRefund","keyPrefix","skipEscrow","refundPaise","balance","creditRupees","createSettlementHooks","onSettlementDebit","settlementDebit","amountPaise","amountRupees","vendorAccount","settlementId","activePlugin","activeConnection","bindWalletPlugin","plugin","bindWalletConnection","connection","resolveWalletPlugin","resolveWalletConnection","manager","nowTimestamp","Date","toISOString","slice","replace","WalletAccountEntity","ownerType","createdBy","createdDate","modifiedBy","modifiedDate","setCreated","setModified","length","default","nullable","WalletLedgerEntryEntity","unique","WalletHoldEntity","runWalletReconciliation","parityDeltas","findVendorPaymentHoldParityDeltas","cacheMismatches","findCacheLedgerMismatches","rows","query","deltas","row","vendorPaymentRupees","vendorPaymentAmount","holdPaise","holdAmount","holdRupees","delta","abs","holdStatus","push","deltaRupees","accounts","getRepository","find","mismatches","lastEntry","findOne","where","order","cachedAvailable","cachedHeld","ledgerAvailable","ledgerHeld","createLifecycleHooks","WalletCreditDebitRequest","reason","AdminWalletController","assertEnabled","response","isEnabled","send","listAccounts","take","skip","data","map","listTransactions","entries","e","body","request","result","now","user","userId","emitAdminMutation","event","actorId","actorRole","after","entryId","handler","onAdminMutation","validate","CustomerWalletController","createdAt","VendorWalletController","createExpressWalletRouter","_basePath","router","createRouter","disabled","_req","res","json","guard","req","next","use","get","buildWalletHttp","mode","controllers","basePath","app","expressRouter","PaymentProviderWallet","createWalletPaymentAdapter","provider","getPublicCredential","isCheckoutEnabled","createPayment","input","resolveCustomer","resolveOrderCustomerId","customerAccount","providerPaymentId","raw","customerAccountId","verifyPayment","fetchPaymentStatus","resolveProviderPaymentId","createRefund","_input","verifyWebhook","_payload","_signature","isValid","toNumber","value","toLedgerAccount","toLedgerHold","toLedgerEntry","isEntityManager","_a","TypeOrmWalletStoreTx","em","repo","create","save","createQueryBuilder","setLock","getOne","error","err","code","errno","dup","saved","ref","key","TypeOrmWalletStore","fn","transaction","indexExists","queryRunner","tableName","indexName","c","CreateWalletTables1790000000000","up","hasTable","down","getWalletOrmMetadata","entities","migrations","WALLET_PLUGIN_TOKEN","scheduleReconciliation","onRun","reconciliation","cronExpr","cron","intervalId","require","schedule","setInterval","stop","clearInterval","WalletPluginImpl","hooks","http","payment","cronTask","report","onMismatch","onLog","isLedgerWritesEnabled","isSettlementDebitEnabled","checkout","shutdown","registerWalletPlugin","dataSource"],"mappings":"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","file":"index.cjs","sourcesContent":["export class WalletError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WalletError';\n }\n}\n\nexport class WalletConfigError extends WalletError {\n constructor(message: string) {\n super(message);\n this.name = 'WalletConfigError';\n }\n}\n\nexport class InsufficientBalanceError extends WalletError {\n constructor(message: string = 'Insufficient available balance') {\n super(message);\n this.name = 'InsufficientBalanceError';\n }\n}\n\nexport class HoldNotFoundError extends WalletError {\n constructor(message: string = 'Active hold not found for reference') {\n super(message);\n this.name = 'HoldNotFoundError';\n }\n}\n\nexport class DuplicateOperationError extends WalletError {\n public readonly existingEntry: unknown;\n\n constructor(message: string, existingEntry: unknown) {\n super(message);\n this.name = 'DuplicateOperationError';\n this.existingEntry = existingEntry;\n }\n}\n\nexport class InvalidAmountError extends WalletError {\n constructor(message: string = 'Amount must be a positive integer in minor units') {\n super(message);\n this.name = 'InvalidAmountError';\n }\n}\n","export enum WalletAccountType {\n CUSTOMER = 'customer',\n VENDOR = 'vendor',\n PLATFORM = 'platform',\n}\n\nexport enum LedgerEntryType {\n CREDIT = 'credit',\n DEBIT = 'debit',\n HOLD = 'hold',\n RELEASE = 'release',\n CANCEL_HOLD = 'cancel_hold',\n TRANSFER = 'transfer',\n}\n\nexport enum HoldStatus {\n ACTIVE = 'active',\n RELEASED = 'released',\n CANCELLED = 'cancelled',\n}\n\nexport interface WalletReference {\n referenceType: string;\n referenceId: string;\n}\n\nexport interface WalletAccount {\n id: number;\n ownerType: WalletAccountType;\n ownerId: number;\n currency: string;\n availableBalance: number;\n heldBalance: number;\n}\n\nexport interface WalletBalance {\n available: number;\n held: number;\n total: number;\n}\n\nexport interface WalletLedgerEntry {\n id: number;\n accountId: number;\n entryType: LedgerEntryType;\n amount: number;\n balanceAfterAvailable: number;\n balanceAfterHeld: number;\n idempotencyKey: string;\n referenceType?: string;\n referenceId?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n}\n\nexport interface WalletHold {\n id: number;\n sourceAccountId: number;\n targetAccountId: number;\n amount: number;\n status: HoldStatus;\n referenceType: string;\n referenceId: string;\n idempotencyKey: string;\n createdAt: Date;\n}\n\nexport interface BalanceDeltas {\n availableDelta?: number;\n heldDelta?: number;\n}\n\nexport interface CreditParams {\n accountId: number;\n amount: number;\n idempotencyKey: string;\n reference?: WalletReference;\n metadata?: Record<string, unknown>;\n}\n\nexport interface DebitParams {\n accountId: number;\n amount: number;\n idempotencyKey: string;\n reference?: WalletReference;\n metadata?: Record<string, unknown>;\n}\n\nexport interface HoldParams {\n sourceAccountId: number;\n targetAccountId: number;\n amount: number;\n idempotencyKey: string;\n reference: WalletReference;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReleaseParams {\n reference: WalletReference;\n idempotencyKey: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CancelHoldParams {\n reference: WalletReference;\n idempotencyKey: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface TransferParams {\n fromAccountId: number;\n toAccountId: number;\n amount: number;\n idempotencyKey: string;\n reference?: WalletReference;\n metadata?: Record<string, unknown>;\n}\n\nexport interface GetTransactionsParams {\n accountId: number;\n limit?: number;\n offset?: number;\n}\n\nexport interface LedgerMutationResult {\n entry: WalletLedgerEntry;\n account: WalletAccount;\n hold?: WalletHold;\n}\n","import type { WalletConfig } from './config';\nimport {\n DuplicateOperationError,\n HoldNotFoundError,\n InsufficientBalanceError,\n InvalidAmountError,\n} from './errors';\nimport type { IWalletStore, IWalletStoreTx, WalletStoreContext } from './store';\nimport {\n HoldStatus,\n LedgerEntryType,\n type CancelHoldParams,\n type CreditParams,\n type DebitParams,\n type GetTransactionsParams,\n type HoldParams,\n type LedgerMutationResult,\n type ReleaseParams,\n type TransferParams,\n type WalletAccount,\n type WalletAccountType,\n type WalletBalance,\n type WalletHold,\n type WalletLedgerEntry,\n type WalletReference,\n} from './types';\n\nexport class WalletLedgerClient {\n private readonly store: IWalletStore;\n private readonly config: WalletConfig;\n\n constructor(store: IWalletStore, config: WalletConfig = {}) {\n this.store = store;\n this.config = config;\n }\n\n public async getOrCreateAccount(\n type: WalletAccountType,\n ownerId: number,\n currency?: string,\n ctx?: WalletStoreContext\n ): Promise<WalletAccount> {\n return this.store.runInTransaction(\n (tx) => tx.getOrCreateAccount(type, ownerId, currency ?? this.config.defaultCurrency ?? 'INR'),\n ctx\n );\n }\n\n public async getBalance(accountId: number, ctx?: WalletStoreContext): Promise<WalletBalance> {\n return this.store.runInTransaction(async (tx) => {\n const account = await tx.getAccountById(accountId);\n if (!account) {\n throw new Error(`Wallet account ${accountId} not found`);\n }\n return this.toBalance(account);\n }, ctx);\n }\n\n public async credit(\n params: CreditParams,\n ctx?: WalletStoreContext\n ): Promise<LedgerMutationResult> {\n this.assertPositiveAmount(params.amount);\n return this.store.runInTransaction((tx) => this.creditInTx(tx, params), ctx);\n }\n\n public async debit(\n params: DebitParams,\n ctx?: WalletStoreContext\n ): Promise<LedgerMutationResult> {\n this.assertPositiveAmount(params.amount);\n return this.store.runInTransaction((tx) => this.debitInTx(tx, params), ctx);\n }\n\n public async hold(params: HoldParams, ctx?: WalletStoreContext): Promise<LedgerMutationResult> {\n this.assertPositiveAmount(params.amount);\n return this.store.runInTransaction((tx) => this.holdInTx(tx, params), ctx);\n }\n\n public async release(\n params: ReleaseParams,\n ctx?: WalletStoreContext\n ): Promise<LedgerMutationResult> {\n return this.store.runInTransaction((tx) => this.releaseInTx(tx, params), ctx);\n }\n\n public async cancelHold(\n params: CancelHoldParams,\n ctx?: WalletStoreContext\n ): Promise<LedgerMutationResult> {\n return this.store.runInTransaction((tx) => this.cancelHoldInTx(tx, params), ctx);\n }\n\n public async transfer(\n params: TransferParams,\n ctx?: WalletStoreContext\n ): Promise<{ debit: LedgerMutationResult; credit: LedgerMutationResult }> {\n this.assertPositiveAmount(params.amount);\n return this.store.runInTransaction(async (tx) => {\n const debit = await this.debitInTx(tx, {\n accountId: params.fromAccountId,\n amount: params.amount,\n idempotencyKey: `${params.idempotencyKey}:debit`,\n reference: params.reference,\n metadata: params.metadata,\n });\n const credit = await this.creditInTx(tx, {\n accountId: params.toAccountId,\n amount: params.amount,\n idempotencyKey: `${params.idempotencyKey}:credit`,\n reference: params.reference,\n metadata: params.metadata,\n });\n return { debit, credit };\n }, ctx);\n }\n\n public async getTransactions(\n params: GetTransactionsParams,\n ctx?: WalletStoreContext\n ): Promise<WalletLedgerEntry[]> {\n const limit = params.limit ?? 50;\n const offset = params.offset ?? 0;\n return this.store.runInTransaction(\n (tx) => tx.listLedgerEntries(params.accountId, limit, offset),\n ctx\n );\n }\n\n private async creditInTx(tx: IWalletStoreTx, params: CreditParams): Promise<LedgerMutationResult> {\n const existing = await tx.findLedgerByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n const account = await tx.getAccountById(existing.accountId);\n if (!account) {\n throw new Error(`Wallet account ${existing.accountId} not found`);\n }\n return { entry: existing, account };\n }\n\n await tx.lockAccount(params.accountId);\n const updated = await tx.updateBalances(params.accountId, { availableDelta: params.amount });\n const entry = await tx.appendLedgerEntry({\n accountId: params.accountId,\n entryType: LedgerEntryType.CREDIT,\n amount: params.amount,\n balanceAfterAvailable: updated.availableBalance,\n balanceAfterHeld: updated.heldBalance,\n idempotencyKey: params.idempotencyKey,\n referenceType: params.reference?.referenceType,\n referenceId: params.reference?.referenceId,\n metadata: params.metadata,\n });\n return { entry, account: updated };\n }\n\n private async debitInTx(tx: IWalletStoreTx, params: DebitParams): Promise<LedgerMutationResult> {\n const existing = await tx.findLedgerByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n const account = await tx.getAccountById(existing.accountId);\n if (!account) {\n throw new Error(`Wallet account ${existing.accountId} not found`);\n }\n return { entry: existing, account };\n }\n\n const locked = await tx.lockAccount(params.accountId);\n if (locked.availableBalance < params.amount) {\n throw new InsufficientBalanceError();\n }\n const updated = await tx.updateBalances(params.accountId, { availableDelta: -params.amount });\n const entry = await tx.appendLedgerEntry({\n accountId: params.accountId,\n entryType: LedgerEntryType.DEBIT,\n amount: params.amount,\n balanceAfterAvailable: updated.availableBalance,\n balanceAfterHeld: updated.heldBalance,\n idempotencyKey: params.idempotencyKey,\n referenceType: params.reference?.referenceType,\n referenceId: params.reference?.referenceId,\n metadata: params.metadata,\n });\n return { entry, account: updated };\n }\n\n private async holdInTx(tx: IWalletStoreTx, params: HoldParams): Promise<LedgerMutationResult> {\n const existing = await tx.findLedgerByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n const account = await tx.getAccountById(existing.accountId);\n const hold = await tx.findHoldByReference(params.reference);\n if (!account) {\n throw new Error(`Wallet account ${existing.accountId} not found`);\n }\n return { entry: existing, account, hold: hold ?? undefined };\n }\n\n const existingHold = await tx.findHoldByReference(params.reference);\n if (existingHold?.status === HoldStatus.ACTIVE) {\n throw new DuplicateOperationError('Hold already exists for reference', existingHold);\n }\n\n const source = await tx.lockAccount(params.sourceAccountId);\n if (source.availableBalance < params.amount) {\n throw new InsufficientBalanceError('Insufficient platform balance for hold');\n }\n\n await tx.updateBalances(params.sourceAccountId, { availableDelta: -params.amount });\n const targetUpdated = await tx.updateBalances(params.targetAccountId, {\n heldDelta: params.amount,\n });\n\n const hold = await tx.upsertHold({\n sourceAccountId: params.sourceAccountId,\n targetAccountId: params.targetAccountId,\n amount: params.amount,\n status: HoldStatus.ACTIVE,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n idempotencyKey: params.idempotencyKey,\n });\n\n const sourceAfterHold = await tx.getAccountById(params.sourceAccountId);\n if (!sourceAfterHold) {\n throw new Error(`Wallet account ${params.sourceAccountId} not found`);\n }\n\n await tx.appendLedgerEntry({\n accountId: params.sourceAccountId,\n entryType: LedgerEntryType.HOLD,\n amount: params.amount,\n balanceAfterAvailable: sourceAfterHold.availableBalance,\n balanceAfterHeld: sourceAfterHold.heldBalance,\n idempotencyKey: `${params.idempotencyKey}:source`,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n metadata: params.metadata,\n });\n\n const entry = await tx.appendLedgerEntry({\n accountId: params.targetAccountId,\n entryType: LedgerEntryType.HOLD,\n amount: params.amount,\n balanceAfterAvailable: targetUpdated.availableBalance,\n balanceAfterHeld: targetUpdated.heldBalance,\n idempotencyKey: params.idempotencyKey,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n metadata: params.metadata,\n });\n\n return { entry, account: targetUpdated, hold };\n }\n\n private async releaseInTx(\n tx: IWalletStoreTx,\n params: ReleaseParams\n ): Promise<LedgerMutationResult> {\n const existing = await tx.findLedgerByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n const account = await tx.getAccountById(existing.accountId);\n const hold = await tx.findHoldByReference(params.reference);\n if (!account) {\n throw new Error(`Wallet account ${existing.accountId} not found`);\n }\n return { entry: existing, account, hold: hold ?? undefined };\n }\n\n const hold = await this.requireActiveHold(tx, params.reference);\n await tx.lockAccount(hold.targetAccountId);\n\n const targetUpdated = await tx.updateBalances(hold.targetAccountId, {\n heldDelta: -hold.amount,\n availableDelta: hold.amount,\n });\n\n const releasedHold = await tx.upsertHold({ ...hold, status: HoldStatus.RELEASED });\n\n const entry = await tx.appendLedgerEntry({\n accountId: hold.targetAccountId,\n entryType: LedgerEntryType.RELEASE,\n amount: hold.amount,\n balanceAfterAvailable: targetUpdated.availableBalance,\n balanceAfterHeld: targetUpdated.heldBalance,\n idempotencyKey: params.idempotencyKey,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n metadata: params.metadata,\n });\n\n return { entry, account: targetUpdated, hold: releasedHold };\n }\n\n private async cancelHoldInTx(\n tx: IWalletStoreTx,\n params: CancelHoldParams\n ): Promise<LedgerMutationResult> {\n const existing = await tx.findLedgerByIdempotencyKey(params.idempotencyKey);\n if (existing) {\n const account = await tx.getAccountById(existing.accountId);\n const hold = await tx.findHoldByReference(params.reference);\n if (!account) {\n throw new Error(`Wallet account ${existing.accountId} not found`);\n }\n return { entry: existing, account, hold: hold ?? undefined };\n }\n\n const hold = await this.requireActiveHold(tx, params.reference);\n await tx.lockAccount(hold.sourceAccountId);\n await tx.lockAccount(hold.targetAccountId);\n\n const sourceUpdated = await tx.updateBalances(hold.sourceAccountId, {\n availableDelta: hold.amount,\n });\n const targetUpdated = await tx.updateBalances(hold.targetAccountId, {\n heldDelta: -hold.amount,\n });\n\n const cancelledHold = await tx.upsertHold({ ...hold, status: HoldStatus.CANCELLED });\n\n await tx.appendLedgerEntry({\n accountId: hold.sourceAccountId,\n entryType: LedgerEntryType.CANCEL_HOLD,\n amount: hold.amount,\n balanceAfterAvailable: sourceUpdated.availableBalance,\n balanceAfterHeld: sourceUpdated.heldBalance,\n idempotencyKey: `${params.idempotencyKey}:source`,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n metadata: params.metadata,\n });\n\n const entry = await tx.appendLedgerEntry({\n accountId: hold.targetAccountId,\n entryType: LedgerEntryType.CANCEL_HOLD,\n amount: hold.amount,\n balanceAfterAvailable: targetUpdated.availableBalance,\n balanceAfterHeld: targetUpdated.heldBalance,\n idempotencyKey: params.idempotencyKey,\n referenceType: params.reference.referenceType,\n referenceId: params.reference.referenceId,\n metadata: params.metadata,\n });\n\n return { entry, account: targetUpdated, hold: cancelledHold };\n }\n\n private toBalance(account: WalletAccount): WalletBalance {\n return {\n available: account.availableBalance,\n held: account.heldBalance,\n total: account.availableBalance + account.heldBalance,\n };\n }\n\n private assertPositiveAmount(amount: number): void {\n if (!Number.isInteger(amount) || amount <= 0) {\n throw new InvalidAmountError();\n }\n }\n\n private async requireActiveHold(\n tx: IWalletStoreTx,\n reference: WalletReference\n ): Promise<WalletHold> {\n const hold = await tx.findHoldByReference(reference);\n if (!hold || hold.status !== HoldStatus.ACTIVE) {\n throw new HoldNotFoundError();\n }\n return hold;\n }\n}\n","/**\n * Convert decimal currency amount (e.g. rupees) to smallest unit (paise).\n */\nexport function toMinorUnit(amount: number): number {\n return Math.round(amount * 100);\n}\n\n/**\n * Convert smallest currency unit (paise) back to decimal amount (rupees).\n */\nexport function fromMinorUnit(amount: number): number {\n return amount / 100;\n}\n","import { toMinorUnit } from '../currency';\nimport { WalletAccountType } from '../types';\nimport type { DeliveredContext, HookRuntime, OrderPaidContext, WalletLifecycleHooks } from './types';\n\nfunction isWalletOnlyPayment(paymentMethod?: string): boolean {\n return String(paymentMethod ?? '').trim().toLowerCase() === 'wallet';\n}\n\nexport function createOrderHooks(runtime: HookRuntime): Pick<\n WalletLifecycleHooks,\n 'onOrderPaid' | 'onLineDelivered'\n> {\n const { client, platformOwnerId, flags } = runtime;\n\n return {\n async onOrderPaid(ctx: OrderPaidContext): Promise<void> {\n if (!flags.enabled || !flags.ledgerWrites) {\n return;\n }\n\n const txCtx = { nativeTx: ctx.nativeTx };\n const platform = await client.getOrCreateAccount(\n WalletAccountType.PLATFORM,\n platformOwnerId,\n ctx.currency,\n txCtx\n );\n\n const orderTotalPaise = toMinorUnit(ctx.orderTotalRupees);\n const shouldDebitCustomer =\n isWalletOnlyPayment(ctx.paymentMethod) &&\n ctx.customerId &&\n !ctx.skipCustomerDebit;\n\n if (shouldDebitCustomer) {\n const debitRupees = ctx.walletAmountRupees ?? ctx.orderTotalRupees;\n const customer = await client.getOrCreateAccount(\n WalletAccountType.CUSTOMER,\n ctx.customerId,\n ctx.currency,\n txCtx\n );\n await client.debit(\n {\n accountId: customer.id,\n amount: toMinorUnit(debitRupees),\n idempotencyKey: `wallet:payment:${ctx.paymentNumber}`,\n reference: { referenceType: 'order', referenceId: String(ctx.orderId) },\n },\n txCtx\n );\n }\n\n await client.credit(\n {\n accountId: platform.id,\n amount: orderTotalPaise,\n idempotencyKey: `payment:${ctx.paymentNumber}`,\n reference: { referenceType: 'order', referenceId: String(ctx.orderId) },\n },\n txCtx\n );\n\n for (const line of ctx.lines) {\n const vendorNetRupees = line.commissionBaseRupees - line.commissionRupees;\n if (vendorNetRupees <= 0) {\n continue;\n }\n\n const vendor = await client.getOrCreateAccount(\n WalletAccountType.VENDOR,\n line.vendorId,\n ctx.currency,\n txCtx\n );\n\n await client.hold(\n {\n sourceAccountId: platform.id,\n targetAccountId: vendor.id,\n amount: toMinorUnit(vendorNetRupees),\n idempotencyKey: `order:${ctx.orderId}:hold:vendorOrder:${line.vendorOrderId}`,\n reference: {\n referenceType: 'vendor_order',\n referenceId: String(line.vendorOrderId),\n },\n },\n txCtx\n );\n }\n },\n\n async onLineDelivered(ctx: DeliveredContext): Promise<void> {\n if (!flags.enabled || !flags.ledgerWrites) {\n return;\n }\n\n await client.release(\n {\n reference: { referenceType: 'vendor_order', referenceId: String(ctx.vendorOrderId) },\n idempotencyKey: `vendorOrder:${ctx.vendorOrderId}:release`,\n },\n ctx.nativeTx != null ? { nativeTx: ctx.nativeTx } : undefined\n );\n },\n };\n}\n","import { toMinorUnit } from '../currency';\nimport { WalletAccountType } from '../types';\nimport type { HookRuntime, RefundContext, WalletLifecycleHooks } from './types';\n\nfunction isWalletPayment(paymentMethod?: string): boolean {\n return String(paymentMethod ?? '').trim().toLowerCase() === 'wallet';\n}\n\nfunction walletCreditRupees(ctx: RefundContext): number {\n if (ctx.walletRefundRupees != null && ctx.walletRefundRupees > 0) {\n return ctx.walletRefundRupees;\n }\n return isWalletPayment(ctx.paymentMethod) ? ctx.lineTotalRupees : 0;\n}\n\nfunction idempotencyPrefix(ctx: RefundContext): string {\n const scope = ctx.idempotencyScope ?? String(ctx.orderProductId);\n return ctx.refundReason === 'return' ? `return:${scope}` : `refund:${ctx.orderProductId}`;\n}\n\nexport function createRefundHooks(runtime: HookRuntime): Pick<WalletLifecycleHooks, 'onRefund'> {\n const { client, platformOwnerId, flags } = runtime;\n\n return {\n async onRefund(ctx: RefundContext): Promise<void> {\n if (!flags.enabled || !flags.ledgerWrites) {\n await ctx.processExternalRefund();\n return;\n }\n\n const keyPrefix = idempotencyPrefix(ctx);\n\n if (!ctx.skipEscrow) {\n await client.cancelHold({\n reference: {\n referenceType: 'vendor_order',\n referenceId: String(ctx.vendorOrderId),\n },\n idempotencyKey: `${keyPrefix}:cancel_hold`,\n });\n }\n\n const refundPaise = toMinorUnit(ctx.lineTotalRupees);\n if (refundPaise > 0) {\n const platform = await client.getOrCreateAccount(\n WalletAccountType.PLATFORM,\n platformOwnerId,\n ctx.currency\n );\n const balance = await client.getBalance(platform.id);\n if (balance.available >= refundPaise) {\n await client.debit({\n accountId: platform.id,\n amount: refundPaise,\n idempotencyKey: `${keyPrefix}:platform_debit`,\n reference: {\n referenceType: 'order_product',\n referenceId: String(ctx.orderProductId),\n },\n });\n }\n\n const creditRupees = walletCreditRupees(ctx);\n if (creditRupees > 0 && ctx.customerId) {\n const customer = await client.getOrCreateAccount(\n WalletAccountType.CUSTOMER,\n ctx.customerId,\n ctx.currency\n );\n await client.credit({\n accountId: customer.id,\n amount: toMinorUnit(creditRupees),\n idempotencyKey: `${keyPrefix}:customer_credit`,\n reference: {\n referenceType: 'order',\n referenceId: String(ctx.orderId ?? ctx.orderProductId),\n },\n });\n }\n }\n\n await ctx.processExternalRefund();\n },\n };\n}\n","import { toMinorUnit } from '../currency';\nimport { WalletAccountType } from '../types';\nimport type { HookRuntime, SettlementDebitContext, WalletLifecycleHooks } from './types';\n\nexport function createSettlementHooks(\n runtime: HookRuntime\n): Pick<WalletLifecycleHooks, 'onSettlementDebit'> {\n const { client, flags } = runtime;\n\n return {\n async onSettlementDebit(ctx: SettlementDebitContext): Promise<void> {\n if (!flags.enabled || !flags.settlementDebit) {\n return;\n }\n\n const txCtx = { nativeTx: ctx.nativeTx };\n const amountPaise = toMinorUnit(ctx.amountRupees);\n\n const vendorAccount = await client.getOrCreateAccount(\n WalletAccountType.VENDOR,\n ctx.vendorId,\n ctx.currency,\n txCtx\n );\n\n const balance = await client.getBalance(vendorAccount.id, txCtx);\n if (balance.available < amountPaise) {\n throw new Error(\n `Insufficient vendor wallet balance for settlement (vendor ${ctx.vendorId})`\n );\n }\n\n await client.debit(\n {\n accountId: vendorAccount.id,\n amount: amountPaise,\n idempotencyKey: `settlement:${ctx.settlementId}:debit:${ctx.vendorId}`,\n reference: {\n referenceType: 'settlement',\n referenceId: String(ctx.settlementId),\n },\n },\n txCtx\n );\n },\n };\n}\n","import type { WalletPlugin } from './plugin-types';\n\nexport interface WalletHostConnection {\n manager: {\n transaction<T>(fn: (em: unknown) => Promise<T>): Promise<T>;\n };\n query(query: string, parameters?: unknown[]): Promise<unknown>;\n getRepository(entity: unknown): {\n find(options?: unknown): Promise<unknown[]>;\n findOne(options?: unknown): Promise<unknown | null>;\n };\n}\n\nlet activePlugin: WalletPlugin | undefined;\nlet activeConnection: WalletHostConnection | undefined;\n\nexport function bindWalletPlugin(plugin: WalletPlugin): void {\n activePlugin = plugin;\n}\n\nexport function bindWalletConnection(connection: unknown): void {\n activeConnection = connection as WalletHostConnection;\n}\n\nexport function resolveWalletPlugin(): WalletPlugin {\n if (!activePlugin) {\n throw new Error('Wallet plugin is not registered. Call registerWalletPlugin() during app bootstrap.');\n }\n return activePlugin;\n}\n\nexport function resolveWalletConnection(): WalletHostConnection {\n if (!activeConnection?.manager) {\n throw new Error('Wallet database connection is not registered. Pass host TypeORM Connection as dataSource.');\n }\n return activeConnection;\n}\n\nexport function clearWalletPluginForTests(): void {\n activePlugin = undefined;\n activeConnection = undefined;\n}\n","import { BeforeInsert, BeforeUpdate, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';\n\nfunction nowTimestamp(): string {\n return new Date().toISOString().slice(0, 19).replace('T', ' ');\n}\n\n@Entity('wallet_account')\nexport class WalletAccountEntity {\n @PrimaryGeneratedColumn({ name: 'id' })\n public id!: number;\n\n @Column({ name: 'owner_type', length: 32 })\n public ownerType!: string;\n\n @Column({ name: 'owner_id' })\n public ownerId!: number;\n\n @Column({ name: 'currency', length: 8, default: 'INR' })\n public currency!: string;\n\n @Column({ name: 'available_balance', type: 'bigint', default: 0 })\n public availableBalance!: string;\n\n @Column({ name: 'held_balance', type: 'bigint', default: 0 })\n public heldBalance!: string;\n\n @Column({ name: 'created_by', nullable: true })\n public createdBy?: number;\n\n @Column({ name: 'created_date', nullable: true })\n public createdDate!: string;\n\n @Column({ name: 'modified_by', nullable: true })\n public modifiedBy?: number;\n\n @Column({ name: 'modified_date', nullable: true })\n public modifiedDate!: string;\n\n @BeforeInsert()\n public setCreated(): void {\n this.createdDate = nowTimestamp();\n this.modifiedDate = nowTimestamp();\n }\n\n @BeforeUpdate()\n public setModified(): void {\n this.modifiedDate = nowTimestamp();\n }\n}\n\n@Entity('wallet_ledger_entry')\nexport class WalletLedgerEntryEntity {\n @PrimaryGeneratedColumn({ name: 'id' })\n public id!: number;\n\n @Column({ name: 'account_id' })\n public accountId!: number;\n\n @Column({ name: 'entry_type', length: 32 })\n public entryType!: string;\n\n @Column({ name: 'amount', type: 'bigint' })\n public amount!: string;\n\n @Column({ name: 'balance_after_available', type: 'bigint' })\n public balanceAfterAvailable!: string;\n\n @Column({ name: 'balance_after_held', type: 'bigint' })\n public balanceAfterHeld!: string;\n\n @Column({ name: 'idempotency_key', length: 255, unique: true })\n public idempotencyKey!: string;\n\n @Column({ name: 'reference_type', length: 64, nullable: true })\n public referenceType?: string;\n\n @Column({ name: 'reference_id', length: 128, nullable: true })\n public referenceId?: string;\n\n @Column({ name: 'metadata', type: 'json', nullable: true })\n public metadata?: Record<string, unknown>;\n\n @Column({ name: 'created_by', nullable: true })\n public createdBy?: number;\n\n @Column({ name: 'created_date', nullable: true })\n public createdDate!: string;\n\n @Column({ name: 'modified_by', nullable: true })\n public modifiedBy?: number;\n\n @Column({ name: 'modified_date', nullable: true })\n public modifiedDate!: string;\n\n @BeforeInsert()\n public setCreated(): void {\n this.createdDate = nowTimestamp();\n this.modifiedDate = nowTimestamp();\n }\n}\n\n@Entity('wallet_hold')\nexport class WalletHoldEntity {\n @PrimaryGeneratedColumn({ name: 'id' })\n public id!: number;\n\n @Column({ name: 'source_account_id' })\n public sourceAccountId!: number;\n\n @Column({ name: 'target_account_id' })\n public targetAccountId!: number;\n\n @Column({ name: 'amount', type: 'bigint' })\n public amount!: string;\n\n @Column({ name: 'status', length: 16, default: 'active' })\n public status!: string;\n\n @Column({ name: 'reference_type', length: 64 })\n public referenceType!: string;\n\n @Column({ name: 'reference_id', length: 128 })\n public referenceId!: string;\n\n @Column({ name: 'idempotency_key', length: 255 })\n public idempotencyKey!: string;\n\n @Column({ name: 'created_by', nullable: true })\n public createdBy?: number;\n\n @Column({ name: 'created_date', nullable: true })\n public createdDate!: string;\n\n @Column({ name: 'modified_by', nullable: true })\n public modifiedBy?: number;\n\n @Column({ name: 'modified_date', nullable: true })\n public modifiedDate!: string;\n\n @BeforeInsert()\n public setCreated(): void {\n this.createdDate = nowTimestamp();\n this.modifiedDate = nowTimestamp();\n }\n\n @BeforeUpdate()\n public setModified(): void {\n this.modifiedDate = nowTimestamp();\n }\n}\n","import { fromMinorUnit } from '../currency';\nimport { resolveWalletConnection } from '../plugin-instance';\nimport { WalletAccountEntity, WalletLedgerEntryEntity } from '../typeorm/entities';\n\nexport interface WalletParityDelta {\n orderId: number;\n vendorOrderId: number;\n vendorPaymentRupees: number;\n holdPaise: number;\n deltaRupees: number;\n}\n\nexport interface WalletCacheMismatch {\n accountId: number;\n cachedAvailable: number;\n cachedHeld: number;\n ledgerAvailable: number;\n ledgerHeld: number;\n}\n\nexport interface WalletReconciliationReport {\n parityDeltas: WalletParityDelta[];\n cacheMismatches: WalletCacheMismatch[];\n}\n\nexport async function runWalletReconciliation(): Promise<WalletReconciliationReport> {\n const parityDeltas = await findVendorPaymentHoldParityDeltas();\n const cacheMismatches = await findCacheLedgerMismatches();\n return { parityDeltas, cacheMismatches };\n}\n\nasync function findVendorPaymentHoldParityDeltas(): Promise<WalletParityDelta[]> {\n const rows = (await resolveWalletConnection().query(`\n SELECT\n vo.order_id AS orderId,\n vp.vendor_order_id AS vendorOrderId,\n vp.amount AS vendorPaymentAmount,\n wh.amount AS holdAmount,\n wh.status AS holdStatus\n FROM vendor_payment vp\n INNER JOIN vendor_orders vo ON vo.vendor_order_id = vp.vendor_order_id\n LEFT JOIN wallet_hold wh\n ON wh.reference_type = 'vendor_order'\n AND wh.reference_id = CAST(vp.vendor_order_id AS CHAR)\n WHERE vp.vendor_order_id IS NOT NULL\n `)) as Array<Record<string, unknown>>;\n\n const deltas: WalletParityDelta[] = [];\n for (const row of rows) {\n const vendorPaymentRupees = Number(row.vendorPaymentAmount) || 0;\n const holdPaise = row.holdAmount != null ? Number(row.holdAmount) : 0;\n const holdRupees = fromMinorUnit(holdPaise);\n const delta = Math.abs(vendorPaymentRupees - holdRupees);\n if (delta > 0.01 && row.holdStatus === 'active') {\n deltas.push({\n orderId: Number(row.orderId),\n vendorOrderId: Number(row.vendorOrderId),\n vendorPaymentRupees,\n holdPaise,\n deltaRupees: delta,\n });\n }\n }\n return deltas;\n}\n\nasync function findCacheLedgerMismatches(): Promise<WalletCacheMismatch[]> {\n const connection = resolveWalletConnection();\n const accounts = (await connection\n .getRepository(WalletAccountEntity)\n .find()) as WalletAccountEntity[];\n const mismatches: WalletCacheMismatch[] = [];\n\n for (const account of accounts) {\n const lastEntry = (await connection\n .getRepository(WalletLedgerEntryEntity)\n .findOne({\n where: { accountId: account.id },\n order: { id: 'DESC' },\n })) as WalletLedgerEntryEntity | null;\n if (!lastEntry) {\n continue;\n }\n const cachedAvailable = Number(account.availableBalance);\n const cachedHeld = Number(account.heldBalance);\n const ledgerAvailable = Number(lastEntry.balanceAfterAvailable);\n const ledgerHeld = Number(lastEntry.balanceAfterHeld);\n if (cachedAvailable !== ledgerAvailable || cachedHeld !== ledgerHeld) {\n mismatches.push({\n accountId: account.id,\n cachedAvailable,\n cachedHeld,\n ledgerAvailable,\n ledgerHeld,\n });\n }\n }\n return mismatches;\n}\n","import type { WalletLifecycleHooks } from './types';\nimport { createOrderHooks } from './order';\nimport { createRefundHooks } from './refund';\nimport { createSettlementHooks } from './settlement';\nimport type { HookRuntime } from './types';\n\nexport function createLifecycleHooks(runtime: HookRuntime): WalletLifecycleHooks {\n return {\n ...createOrderHooks(runtime),\n ...createSettlementHooks(runtime),\n ...createRefundHooks(runtime),\n };\n}\n\nexport type {\n DeliveredContext,\n OrderPaidContext,\n RefundContext,\n SettlementDebitContext,\n WalletLifecycleHooks,\n WalletOrderPaidLine,\n} from './types';\n\nexport { runWalletReconciliation } from './reconciliation';\nexport type {\n WalletCacheMismatch,\n WalletParityDelta,\n WalletReconciliationReport,\n} from './reconciliation';\n","import 'reflect-metadata';\nimport {\n Authorized,\n Body,\n Get,\n JsonController,\n Param,\n Post,\n QueryParam,\n Req,\n Res,\n} from 'routing-controllers';\nimport { IsInt, IsNotEmpty, IsNumber, IsOptional, IsString, Min } from 'class-validator';\nimport { fromMinorUnit, toMinorUnit } from '../../currency';\nimport { resolveWalletConnection, resolveWalletPlugin } from '../../plugin-instance';\nimport { WalletAccountType } from '../../types';\nimport type { WalletAdminMutationEvent, WalletPlugin } from '../../plugin-types';\nimport { WalletAccountEntity } from '../../typeorm/entities';\n\nclass WalletCreditDebitRequest {\n @IsString()\n @IsNotEmpty()\n public ownerType!: WalletAccountType;\n\n @IsInt()\n @Min(0)\n public ownerId!: number;\n\n @IsNumber()\n @Min(0.01)\n public amount!: number;\n\n @IsOptional()\n @IsString()\n public currency?: string;\n\n @IsOptional()\n @IsString()\n public reason?: string;\n}\n\n@JsonController('/admin/wallet')\nexport class AdminWalletController {\n private get plugin(): WalletPlugin {\n return resolveWalletPlugin();\n }\n\n private assertEnabled(response: { status: (code: number) => { send: (body: unknown) => void } }): boolean {\n if (!this.plugin.isEnabled()) {\n response.status(404).send({ status: 0, message: 'Wallet feature is disabled' });\n return false;\n }\n return true;\n }\n\n @Get('/accounts')\n @Authorized(['admin'])\n public async listAccounts(\n @QueryParam('limit') limit: number = 50,\n @QueryParam('offset') offset: number = 0,\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const rows = await resolveWalletConnection()\n .getRepository(WalletAccountEntity)\n .find({ take: limit, skip: offset, order: { id: 'DESC' } }) as WalletAccountEntity[];\n response.status(200).send({\n status: 1,\n data: rows.map((row) => ({\n id: row.id,\n ownerType: row.ownerType,\n ownerId: row.ownerId,\n currency: row.currency,\n available: fromMinorUnit(Number(row.availableBalance)),\n held: fromMinorUnit(Number(row.heldBalance)),\n total: fromMinorUnit(Number(row.availableBalance) + Number(row.heldBalance)),\n })),\n });\n }\n\n @Get('/transactions/:accountId')\n @Authorized(['admin'])\n public async listTransactions(\n @Param('accountId') accountId: number,\n @QueryParam('limit') limit: number = 50,\n @QueryParam('offset') offset: number = 0,\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const entries = await this.plugin.client.getTransactions({ accountId, limit, offset });\n response.status(200).send({\n status: 1,\n data: entries.map((e) => ({\n ...e,\n amount: fromMinorUnit(e.amount),\n balanceAfterAvailable: fromMinorUnit(e.balanceAfterAvailable),\n balanceAfterHeld: fromMinorUnit(e.balanceAfterHeld),\n })),\n });\n }\n\n @Post('/credit')\n @Authorized(['admin'])\n public async credit(\n @Body({ validate: true }) body: WalletCreditDebitRequest,\n @Req() request: { user?: { userId?: number } },\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const currency = body.currency || 'INR';\n const account = await this.plugin.client.getOrCreateAccount(body.ownerType, body.ownerId, currency);\n const result = await this.plugin.client.credit({\n accountId: account.id,\n amount: toMinorUnit(body.amount),\n idempotencyKey: `admin:credit:${body.ownerType}:${body.ownerId}:${Date.now()}`,\n reference: { referenceType: 'admin_adjustment', referenceId: String(request.user?.userId || 0) },\n metadata: { reason: body.reason },\n });\n await this.emitAdminMutation({\n event: 'wallet_admin_credit',\n actorId: request.user?.userId,\n actorRole: 'admin',\n amount: body.amount,\n after: { accountId: account.id, entryId: result.entry.id },\n });\n response.status(200).send({\n status: 1,\n message: 'Wallet credited successfully',\n data: { accountId: account.id, available: fromMinorUnit(result.account.availableBalance) },\n });\n }\n\n @Post('/debit')\n @Authorized(['admin'])\n public async debit(\n @Body({ validate: true }) body: WalletCreditDebitRequest,\n @Req() request: { user?: { userId?: number } },\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const currency = body.currency || 'INR';\n const account = await this.plugin.client.getOrCreateAccount(body.ownerType, body.ownerId, currency);\n const result = await this.plugin.client.debit({\n accountId: account.id,\n amount: toMinorUnit(body.amount),\n idempotencyKey: `admin:debit:${body.ownerType}:${body.ownerId}:${Date.now()}`,\n reference: { referenceType: 'admin_adjustment', referenceId: String(request.user?.userId || 0) },\n metadata: { reason: body.reason },\n });\n await this.emitAdminMutation({\n event: 'wallet_admin_debit',\n actorId: request.user?.userId,\n actorRole: 'admin',\n amount: body.amount,\n after: { accountId: account.id, entryId: result.entry.id },\n });\n response.status(200).send({\n status: 1,\n message: 'Wallet debited successfully',\n data: { accountId: account.id, available: fromMinorUnit(result.account.availableBalance) },\n });\n }\n\n private async emitAdminMutation(event: WalletAdminMutationEvent): Promise<void> {\n const handler = (this.plugin as WalletPlugin & { onAdminMutation?: (e: WalletAdminMutationEvent) => Promise<void> })\n .onAdminMutation;\n if (handler) {\n await handler(event);\n }\n }\n}\n","import 'reflect-metadata';\nimport { Authorized, Get, JsonController, QueryParam, Req, Res } from 'routing-controllers';\nimport { fromMinorUnit } from '../../currency';\nimport { resolveWalletPlugin } from '../../plugin-instance';\nimport { WalletAccountType } from '../../types';\n\n@JsonController('/customer/wallet')\nexport class CustomerWalletController {\n private get plugin() {\n return resolveWalletPlugin();\n }\n\n private assertEnabled(response: { status: (code: number) => { send: (body: unknown) => void } }): boolean {\n if (!this.plugin.isEnabled()) {\n response.status(404).send({ status: 0, message: 'Wallet feature is disabled' });\n return false;\n }\n return true;\n }\n\n @Get('/balance')\n @Authorized('customer')\n public async getBalance(\n @Req() request: { user?: { id?: number } },\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const customerId = request.user?.id ?? 0;\n const account = await this.plugin.client.getOrCreateAccount(\n WalletAccountType.CUSTOMER,\n customerId,\n 'INR'\n );\n const balance = await this.plugin.client.getBalance(account.id);\n response.status(200).send({\n status: 1,\n data: {\n available: fromMinorUnit(balance.available),\n held: fromMinorUnit(balance.held),\n total: fromMinorUnit(balance.total),\n currency: account.currency,\n },\n });\n }\n\n @Get('/transactions')\n @Authorized('customer')\n public async getTransactions(\n @Req() request: { user?: { id?: number } },\n @QueryParam('limit') limit: number = 50,\n @QueryParam('offset') offset: number = 0,\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const customerId = request.user?.id ?? 0;\n const account = await this.plugin.client.getOrCreateAccount(\n WalletAccountType.CUSTOMER,\n customerId,\n 'INR'\n );\n const entries = await this.plugin.client.getTransactions({\n accountId: account.id,\n limit,\n offset,\n });\n response.status(200).send({\n status: 1,\n data: entries.map((e) => ({\n id: e.id,\n entryType: e.entryType,\n amount: fromMinorUnit(e.amount),\n referenceType: e.referenceType,\n referenceId: e.referenceId,\n createdAt: e.createdAt,\n })),\n });\n }\n}\n","import 'reflect-metadata';\nimport { Authorized, Get, JsonController, QueryParam, Req, Res } from 'routing-controllers';\nimport { fromMinorUnit } from '../../currency';\nimport { resolveWalletPlugin } from '../../plugin-instance';\nimport { WalletAccountType } from '../../types';\n\n@JsonController('/vendor/wallet')\nexport class VendorWalletController {\n private get plugin() {\n return resolveWalletPlugin();\n }\n\n private assertEnabled(response: { status: (code: number) => { send: (body: unknown) => void } }): boolean {\n if (!this.plugin.isEnabled()) {\n response.status(404).send({ status: 0, message: 'Wallet feature is disabled' });\n return false;\n }\n return true;\n }\n\n @Get('/balance')\n @Authorized('vendor')\n public async getBalance(\n @Req() request: { user?: { vendorId?: number } },\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const vendorId = request.user?.vendorId ?? 0;\n const account = await this.plugin.client.getOrCreateAccount(\n WalletAccountType.VENDOR,\n vendorId,\n 'INR'\n );\n const balance = await this.plugin.client.getBalance(account.id);\n response.status(200).send({\n status: 1,\n data: {\n available: fromMinorUnit(balance.available),\n held: fromMinorUnit(balance.held),\n total: fromMinorUnit(balance.total),\n currency: account.currency,\n },\n });\n }\n\n @Get('/transactions')\n @Authorized('vendor')\n public async getTransactions(\n @Req() request: { user?: { vendorId?: number } },\n @QueryParam('limit') limit: number = 50,\n @QueryParam('offset') offset: number = 0,\n @Res() response: { status: (code: number) => { send: (body: unknown) => void } }\n ): Promise<void> {\n if (!this.assertEnabled(response)) {\n return;\n }\n const vendorId = request.user?.vendorId ?? 0;\n const account = await this.plugin.client.getOrCreateAccount(\n WalletAccountType.VENDOR,\n vendorId,\n 'INR'\n );\n const entries = await this.plugin.client.getTransactions({\n accountId: account.id,\n limit,\n offset,\n });\n response.status(200).send({\n status: 1,\n data: entries.map((e) => ({\n id: e.id,\n entryType: e.entryType,\n amount: fromMinorUnit(e.amount),\n referenceType: e.referenceType,\n referenceId: e.referenceId,\n createdAt: e.createdAt,\n })),\n });\n }\n}\n","import type { Router, Request, Response } from 'express';\nimport { Router as createRouter } from 'express';\nimport { fromMinorUnit } from '../../currency';\nimport { WalletAccountType } from '../../types';\nimport type { WalletPlugin } from '../../plugin-types';\n\nexport function createExpressWalletRouter(plugin: WalletPlugin, _basePath = '/api'): Router {\n const router = createRouter();\n\n const disabled = (_req: Request, res: Response) => {\n res.status(404).json({ status: 0, message: 'Wallet feature is disabled' });\n };\n\n const guard = (req: Request, res: Response, next: () => void) => {\n if (!plugin.isEnabled()) {\n disabled(req, res);\n return;\n }\n next();\n };\n\n router.use(guard);\n\n router.get('/customer/wallet/balance', async (req: Request, res: Response) => {\n try {\n const customerId = Number((req as Request & { user?: { id?: number } }).user?.id ?? 0);\n const account = await plugin.client.getOrCreateAccount(WalletAccountType.CUSTOMER, customerId, 'INR');\n const balance = await plugin.client.getBalance(account.id);\n res.json({\n status: 1,\n data: {\n available: fromMinorUnit(balance.available),\n held: fromMinorUnit(balance.held),\n total: fromMinorUnit(balance.total),\n currency: account.currency,\n },\n });\n } catch (e: unknown) {\n res.status(500).json({ status: 0, message: (e as Error).message });\n }\n });\n\n router.get('/vendor/wallet/balance', async (req: Request, res: Response) => {\n try {\n const vendorId = Number((req as Request & { user?: { vendorId?: number } }).user?.vendorId ?? 0);\n const account = await plugin.client.getOrCreateAccount(WalletAccountType.VENDOR, vendorId, 'INR');\n const balance = await plugin.client.getBalance(account.id);\n res.json({\n status: 1,\n data: {\n available: fromMinorUnit(balance.available),\n held: fromMinorUnit(balance.held),\n total: fromMinorUnit(balance.total),\n currency: account.currency,\n },\n });\n } catch (e: unknown) {\n res.status(500).json({ status: 0, message: (e as Error).message });\n }\n });\n\n return router;\n}\n","import type { WalletPlugin, WalletHttpConfig } from '../plugin-types';\nimport { AdminWalletController } from './routing-controllers/AdminWalletController';\nimport { CustomerWalletController } from './routing-controllers/CustomerWalletController';\nimport { VendorWalletController } from './routing-controllers/VendorWalletController';\nimport { createExpressWalletRouter } from './express/router';\n\nexport function buildWalletHttp(\n plugin: WalletPlugin,\n config?: WalletHttpConfig\n): {\n controllers?: Function[];\n expressRouter?: unknown;\n} {\n if (!config || config.mode === 'none' || !plugin.isEnabled()) {\n return {};\n }\n\n if (config.mode === 'routing-controllers') {\n return {\n controllers: [AdminWalletController, CustomerWalletController, VendorWalletController],\n };\n }\n\n if (config.mode === 'express-router') {\n const router = createExpressWalletRouter(plugin, config.basePath ?? '/api');\n if (config.app) {\n config.app.use(config.basePath ?? '/api', router);\n }\n return { expressRouter: router };\n }\n\n return {};\n}\n\nexport {\n AdminWalletController,\n CustomerWalletController,\n VendorWalletController,\n};\nexport { createExpressWalletRouter };\n","export const PaymentProviderWallet = 'wallet' as const;\n\nexport interface CreatePaymentInput {\n orderId: number;\n amount: number;\n currency: string;\n metadata?: Record<string, string>;\n}\n\nexport interface PaymentResult {\n providerPaymentId: string;\n provider: typeof PaymentProviderWallet;\n raw: unknown;\n}\n\nexport interface PaymentStatusResult {\n providerPaymentId: string;\n status: string;\n amount: number;\n currency: string;\n provider: typeof PaymentProviderWallet;\n raw: unknown;\n}\n\nexport interface RefundInput {\n providerPaymentId: string;\n amount?: number;\n}\n\nexport interface RefundResult {\n providerRefundId: string;\n status: string;\n amount: number;\n currency: string;\n provider: typeof PaymentProviderWallet;\n raw: unknown;\n}\n\nexport interface WebhookVerificationResult {\n isValid: boolean;\n event?: unknown;\n}\n\nexport interface IWalletPaymentProvider {\n readonly provider: typeof PaymentProviderWallet;\n getPublicCredential(): string | null;\n createPayment(input: CreatePaymentInput): Promise<PaymentResult>;\n verifyPayment(providerPaymentId: string, ...args: unknown[]): Promise<PaymentStatusResult>;\n fetchPaymentStatus(providerPaymentId: string): Promise<PaymentStatusResult>;\n resolveProviderPaymentId(orderId: number): Promise<string | null>;\n createRefund(input: RefundInput): Promise<RefundResult>;\n verifyWebhook(payload: string | Buffer, signature: string): WebhookVerificationResult;\n}\n","import { toMinorUnit } from '../currency';\nimport { WalletAccountType } from '../types';\nimport type { WalletPlugin } from '../plugin-types';\nimport {\n PaymentProviderWallet,\n type CreatePaymentInput,\n type IWalletPaymentProvider,\n type PaymentResult,\n type PaymentStatusResult,\n type RefundInput,\n type RefundResult,\n type WebhookVerificationResult,\n} from './types';\n\nexport function createWalletPaymentAdapter(plugin: WalletPlugin): IWalletPaymentProvider {\n return {\n provider: PaymentProviderWallet,\n\n getPublicCredential(): string | null {\n return plugin.isCheckoutEnabled() ? 'wallet' : null;\n },\n\n async createPayment(input: CreatePaymentInput): Promise<PaymentResult> {\n if (!plugin.isCheckoutEnabled()) {\n throw new Error('Wallet checkout is not enabled');\n }\n\n const resolveCustomer = plugin.resolveOrderCustomerId;\n if (!resolveCustomer) {\n throw new Error('resolveOrderCustomerId is not configured on wallet plugin');\n }\n\n const customerId = await resolveCustomer(input.orderId);\n if (!customerId) {\n throw new Error('Order customer not found for wallet payment');\n }\n\n const client = plugin.client;\n const customerAccount = await client.getOrCreateAccount(\n WalletAccountType.CUSTOMER,\n customerId,\n input.currency\n );\n const balance = await client.getBalance(customerAccount.id);\n const amountPaise = toMinorUnit(input.amount);\n if (balance.available < amountPaise) {\n throw new Error('Insufficient wallet balance');\n }\n\n return {\n providerPaymentId: `wallet-order-${input.orderId}`,\n provider: PaymentProviderWallet,\n raw: { customerAccountId: customerAccount.id, amountPaise },\n };\n },\n\n async verifyPayment(providerPaymentId: string): Promise<PaymentStatusResult> {\n return {\n providerPaymentId,\n status: 'succeeded',\n amount: 0,\n currency: 'INR',\n provider: PaymentProviderWallet,\n raw: {},\n };\n },\n\n async fetchPaymentStatus(providerPaymentId: string): Promise<PaymentStatusResult> {\n return this.verifyPayment(providerPaymentId);\n },\n\n async resolveProviderPaymentId(orderId: number): Promise<string | null> {\n return `wallet-order-${orderId}`;\n },\n\n async createRefund(_input: RefundInput): Promise<RefundResult> {\n throw new Error('Wallet refunds are handled via wallet hooks.onRefund');\n },\n\n verifyWebhook(_payload: string | Buffer, _signature: string): WebhookVerificationResult {\n return { isValid: false };\n },\n };\n}\n","import type { EntityManager } from 'typeorm';\nimport { DuplicateOperationError } from '../errors';\nimport type { WalletHostConnection } from '../plugin-instance';\nimport type { IWalletStore, IWalletStoreTx, WalletStoreContext } from '../store';\nimport {\n HoldStatus,\n LedgerEntryType,\n type BalanceDeltas,\n type WalletAccount,\n type WalletAccountType,\n type WalletHold,\n type WalletLedgerEntry,\n type WalletReference,\n} from '../types';\nimport {\n WalletAccountEntity,\n WalletHoldEntity,\n WalletLedgerEntryEntity,\n} from './entities';\n\nfunction toNumber(value: string | number | null | undefined): number {\n if (value == null) {\n return 0;\n }\n return Number(value);\n}\n\nfunction toLedgerAccount(row: WalletAccountEntity): WalletAccount {\n return {\n id: row.id,\n ownerType: row.ownerType as WalletAccountType,\n ownerId: row.ownerId,\n currency: row.currency,\n availableBalance: toNumber(row.availableBalance),\n heldBalance: toNumber(row.heldBalance),\n };\n}\n\nfunction toLedgerHold(row: WalletHoldEntity): WalletHold {\n return {\n id: row.id,\n sourceAccountId: row.sourceAccountId,\n targetAccountId: row.targetAccountId,\n amount: toNumber(row.amount),\n status: row.status as HoldStatus,\n referenceType: row.referenceType,\n referenceId: row.referenceId,\n idempotencyKey: row.idempotencyKey,\n createdAt: new Date(row.createdDate),\n };\n}\n\nfunction toLedgerEntry(row: WalletLedgerEntryEntity): WalletLedgerEntry {\n return {\n id: row.id,\n accountId: row.accountId,\n entryType: row.entryType as LedgerEntryType,\n amount: toNumber(row.amount),\n balanceAfterAvailable: toNumber(row.balanceAfterAvailable),\n balanceAfterHeld: toNumber(row.balanceAfterHeld),\n idempotencyKey: row.idempotencyKey,\n referenceType: row.referenceType,\n referenceId: row.referenceId,\n metadata: row.metadata,\n createdAt: new Date(row.createdDate),\n };\n}\n\nfunction isEntityManager(value: unknown): value is EntityManager {\n return (\n value != null &&\n typeof value === 'object' &&\n typeof (value as EntityManager).getRepository === 'function'\n );\n}\n\nclass TypeOrmWalletStoreTx implements IWalletStoreTx {\n constructor(private readonly em: EntityManager) {}\n\n public async getOrCreateAccount(\n type: WalletAccountType,\n ownerId: number,\n currency: string\n ): Promise<WalletAccount> {\n const repo = this.em.getRepository(WalletAccountEntity);\n let row = await repo.findOne({ where: { ownerType: type, ownerId, currency } });\n if (!row) {\n row = repo.create({\n ownerType: type,\n ownerId,\n currency,\n availableBalance: '0',\n heldBalance: '0',\n });\n row = await repo.save(row);\n }\n return toLedgerAccount(row);\n }\n\n public async lockAccount(accountId: number): Promise<WalletAccount> {\n const row = await this.em\n .getRepository(WalletAccountEntity)\n .createQueryBuilder('wa')\n .setLock('pessimistic_write')\n .where('wa.id = :id', { id: accountId })\n .getOne();\n if (!row) {\n throw new Error(`Wallet account ${accountId} not found`);\n }\n return toLedgerAccount(row);\n }\n\n public async getAccountById(accountId: number): Promise<WalletAccount | null> {\n const row = await this.em.getRepository(WalletAccountEntity).findOne({ where: { id: accountId } });\n return row ? toLedgerAccount(row) : null;\n }\n\n public async appendLedgerEntry(\n entry: Omit<WalletLedgerEntry, 'id' | 'createdAt'>\n ): Promise<WalletLedgerEntry> {\n const existing = await this.findLedgerByIdempotencyKey(entry.idempotencyKey);\n if (existing) {\n return existing;\n }\n\n const repo = this.em.getRepository(WalletLedgerEntryEntity);\n try {\n const row = await repo.save(\n repo.create({\n accountId: entry.accountId,\n entryType: entry.entryType,\n amount: String(entry.amount),\n balanceAfterAvailable: String(entry.balanceAfterAvailable),\n balanceAfterHeld: String(entry.balanceAfterHeld),\n idempotencyKey: entry.idempotencyKey,\n referenceType: entry.referenceType,\n referenceId: entry.referenceId,\n metadata: entry.metadata,\n })\n );\n return toLedgerEntry(row);\n } catch (error: unknown) {\n const err = error as { code?: string | number; errno?: string | number };\n const code = err?.code || err?.errno;\n if (code === 'ER_DUP_ENTRY' || code === 1062) {\n const dup = await this.findLedgerByIdempotencyKey(entry.idempotencyKey);\n if (dup) {\n return dup;\n }\n throw new DuplicateOperationError('Duplicate idempotency key', null);\n }\n throw error;\n }\n }\n\n public async updateBalances(accountId: number, deltas: BalanceDeltas): Promise<WalletAccount> {\n const row = await this.em\n .getRepository(WalletAccountEntity)\n .createQueryBuilder('wa')\n .setLock('pessimistic_write')\n .where('wa.id = :id', { id: accountId })\n .getOne();\n if (!row) {\n throw new Error(`Wallet account ${accountId} not found`);\n }\n\n const available = toNumber(row.availableBalance) + (deltas.availableDelta ?? 0);\n const held = toNumber(row.heldBalance) + (deltas.heldDelta ?? 0);\n if (available < 0 || held < 0) {\n throw new Error('Balance cannot be negative');\n }\n\n row.availableBalance = String(available);\n row.heldBalance = String(held);\n const saved = await this.em.getRepository(WalletAccountEntity).save(row);\n return toLedgerAccount(saved);\n }\n\n public async findHoldByReference(ref: WalletReference): Promise<WalletHold | null> {\n const row = await this.em.getRepository(WalletHoldEntity).findOne({\n where: { referenceType: ref.referenceType, referenceId: ref.referenceId },\n order: { id: 'DESC' },\n });\n return row ? toLedgerHold(row) : null;\n }\n\n public async upsertHold(\n hold: Omit<WalletHold, 'id' | 'createdAt'> & { id?: number }\n ): Promise<WalletHold> {\n const repo = this.em.getRepository(WalletHoldEntity);\n let row: WalletHoldEntity | undefined;\n if (hold.id != null) {\n row = await repo.findOne({ where: { id: hold.id } });\n }\n if (!row) {\n row = await repo.findOne({\n where: { referenceType: hold.referenceType, referenceId: hold.referenceId },\n });\n }\n if (!row) {\n row = repo.create({\n sourceAccountId: hold.sourceAccountId,\n targetAccountId: hold.targetAccountId,\n amount: String(hold.amount),\n status: hold.status,\n referenceType: hold.referenceType,\n referenceId: hold.referenceId,\n idempotencyKey: hold.idempotencyKey,\n });\n } else {\n row.sourceAccountId = hold.sourceAccountId;\n row.targetAccountId = hold.targetAccountId;\n row.amount = String(hold.amount);\n row.status = hold.status;\n row.idempotencyKey = hold.idempotencyKey;\n }\n const saved = await repo.save(row);\n return toLedgerHold(saved);\n }\n\n public async findLedgerByIdempotencyKey(key: string): Promise<WalletLedgerEntry | null> {\n const row = await this.em.getRepository(WalletLedgerEntryEntity).findOne({\n where: { idempotencyKey: key },\n });\n return row ? toLedgerEntry(row) : null;\n }\n\n public async listLedgerEntries(\n accountId: number,\n limit: number,\n offset: number\n ): Promise<WalletLedgerEntry[]> {\n const rows = await this.em.getRepository(WalletLedgerEntryEntity).find({\n where: { accountId },\n order: { id: 'DESC' },\n take: limit,\n skip: offset,\n });\n return rows.map(toLedgerEntry);\n }\n}\n\nexport class TypeOrmWalletStore implements IWalletStore {\n constructor(private readonly connection: WalletHostConnection) {}\n\n public async runInTransaction<T>(\n fn: (tx: IWalletStoreTx) => Promise<T>,\n ctx?: WalletStoreContext\n ): Promise<T> {\n if (isEntityManager(ctx?.nativeTx)) {\n return fn(new TypeOrmWalletStoreTx(ctx.nativeTx));\n }\n\n return this.connection.manager.transaction(async (em) =>\n fn(new TypeOrmWalletStoreTx(em as EntityManager))\n );\n }\n}\n","import { MigrationInterface, QueryRunner } from 'typeorm';\n\nasync function indexExists(\n queryRunner: QueryRunner,\n tableName: string,\n indexName: string\n): Promise<boolean> {\n const rows: Array<{ c: number }> = await queryRunner.query(\n `SELECT COUNT(1) AS c\n FROM information_schema.statistics\n WHERE table_schema = DATABASE()\n AND table_name = ?\n AND index_name = ?`,\n [tableName, indexName]\n );\n return Number(rows[0]?.c ?? 0) > 0;\n}\n\nexport class CreateWalletTables1790000000000 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n if (!(await queryRunner.hasTable('wallet_account'))) {\n await queryRunner.query(`\n CREATE TABLE \\`wallet_account\\` (\n \\`id\\` int NOT NULL AUTO_INCREMENT,\n \\`owner_type\\` varchar(32) NOT NULL,\n \\`owner_id\\` int NOT NULL,\n \\`currency\\` varchar(8) NOT NULL DEFAULT 'INR',\n \\`available_balance\\` bigint NOT NULL DEFAULT 0,\n \\`held_balance\\` bigint NOT NULL DEFAULT 0,\n \\`created_by\\` int NULL,\n \\`created_date\\` datetime NULL,\n \\`modified_by\\` int NULL,\n \\`modified_date\\` datetime NULL,\n PRIMARY KEY (\\`id\\`)\n ) ENGINE=InnoDB\n `);\n }\n\n if (!(await indexExists(queryRunner, 'wallet_account', 'IDX_wallet_account_owner_currency'))) {\n await queryRunner.query(`\n CREATE UNIQUE INDEX \\`IDX_wallet_account_owner_currency\\`\n ON \\`wallet_account\\` (\\`owner_type\\`, \\`owner_id\\`, \\`currency\\`)\n `);\n }\n\n if (!(await queryRunner.hasTable('wallet_ledger_entry'))) {\n await queryRunner.query(`\n CREATE TABLE \\`wallet_ledger_entry\\` (\n \\`id\\` int NOT NULL AUTO_INCREMENT,\n \\`account_id\\` int NOT NULL,\n \\`entry_type\\` varchar(32) NOT NULL,\n \\`amount\\` bigint NOT NULL,\n \\`balance_after_available\\` bigint NOT NULL,\n \\`balance_after_held\\` bigint NOT NULL,\n \\`idempotency_key\\` varchar(255) NOT NULL,\n \\`reference_type\\` varchar(64) NULL,\n \\`reference_id\\` varchar(128) NULL,\n \\`metadata\\` json NULL,\n \\`created_by\\` int NULL,\n \\`created_date\\` datetime NULL,\n \\`modified_by\\` int NULL,\n \\`modified_date\\` datetime NULL,\n PRIMARY KEY (\\`id\\`),\n UNIQUE INDEX \\`UQ_wallet_ledger_idempotency_key\\` (\\`idempotency_key\\`)\n ) ENGINE=InnoDB\n `);\n }\n\n if (!(await indexExists(queryRunner, 'wallet_ledger_entry', 'IDX_wallet_ledger_account_id'))) {\n await queryRunner.query(`\n CREATE INDEX \\`IDX_wallet_ledger_account_id\\`\n ON \\`wallet_ledger_entry\\` (\\`account_id\\`)\n `);\n }\n\n if (!(await queryRunner.hasTable('wallet_hold'))) {\n await queryRunner.query(`\n CREATE TABLE \\`wallet_hold\\` (\n \\`id\\` int NOT NULL AUTO_INCREMENT,\n \\`source_account_id\\` int NOT NULL,\n \\`target_account_id\\` int NOT NULL,\n \\`amount\\` bigint NOT NULL,\n \\`status\\` varchar(16) NOT NULL DEFAULT 'active',\n \\`reference_type\\` varchar(64) NOT NULL,\n \\`reference_id\\` varchar(128) NOT NULL,\n \\`idempotency_key\\` varchar(255) NOT NULL,\n \\`created_by\\` int NULL,\n \\`created_date\\` datetime NULL,\n \\`modified_by\\` int NULL,\n \\`modified_date\\` datetime NULL,\n PRIMARY KEY (\\`id\\`)\n ) ENGINE=InnoDB\n `);\n }\n\n if (!(await indexExists(queryRunner, 'wallet_hold', 'IDX_wallet_hold_reference'))) {\n await queryRunner.query(`\n CREATE INDEX \\`IDX_wallet_hold_reference\\`\n ON \\`wallet_hold\\` (\\`reference_type\\`, \\`reference_id\\`)\n `);\n }\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n if (await queryRunner.hasTable('wallet_hold')) {\n await queryRunner.query('DROP TABLE `wallet_hold`');\n }\n if (await queryRunner.hasTable('wallet_ledger_entry')) {\n await queryRunner.query('DROP TABLE `wallet_ledger_entry`');\n }\n if (await queryRunner.hasTable('wallet_account')) {\n await queryRunner.query('DROP TABLE `wallet_account`');\n }\n }\n}\n","import {\n WalletAccountEntity,\n WalletHoldEntity,\n WalletLedgerEntryEntity,\n} from './entities';\nimport { CreateWalletTables1790000000000 } from './migrations/CreateWalletTables';\n\nexport function getWalletOrmMetadata(): {\n entities: Function[];\n migrations: Function[];\n} {\n return {\n entities: [WalletAccountEntity, WalletLedgerEntryEntity, WalletHoldEntity],\n migrations: [CreateWalletTables1790000000000],\n };\n}\n","export interface WalletFeatureFlags {\n enabled: boolean;\n ledgerWrites: boolean;\n settlementDebit: boolean;\n checkout: boolean;\n}\n\nexport interface WalletAdminMutationEvent {\n event: string;\n actorId?: number;\n actorRole?: string;\n amount?: number;\n after?: Record<string, unknown>;\n}\n\nexport interface WalletHttpConfig {\n mode: 'routing-controllers' | 'express-router' | 'none';\n basePath?: string;\n app?: { use: (path: string, handler: unknown) => void };\n}\n\nexport interface WalletReconciliationConfig {\n enabled: boolean;\n cron?: string;\n onMismatch?: (report: import('./hooks/reconciliation').WalletReconciliationReport) => void;\n onLog?: (level: 'info' | 'warn', message: string, data?: unknown) => void;\n}\n\nexport interface WalletPluginConfig {\n dataSource: unknown;\n platformOwnerId: number;\n defaultCurrency?: string;\n flags: WalletFeatureFlags;\n http?: WalletHttpConfig;\n reconciliation?: WalletReconciliationConfig;\n onAdminMutation?: (event: WalletAdminMutationEvent) => Promise<void>;\n resolveOrderCustomerId?: (orderId: number) => Promise<number | null>;\n}\n\nexport interface WalletPlugin {\n readonly client: import('./client').WalletLedgerClient;\n readonly hooks: import('./hooks/types').WalletLifecycleHooks;\n readonly flags: WalletFeatureFlags;\n readonly http: {\n controllers?: Function[];\n expressRouter?: unknown;\n };\n readonly payment: {\n createWalletPaymentAdapter: () => import('./payment/types').IWalletPaymentProvider;\n };\n isEnabled(): boolean;\n isLedgerWritesEnabled(): boolean;\n isSettlementDebitEnabled(): boolean;\n isCheckoutEnabled(): boolean;\n resolveOrderCustomerId?: (orderId: number) => Promise<number | null>;\n onAdminMutation?: (event: WalletAdminMutationEvent) => Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport const WALLET_PLUGIN_TOKEN = 'multivendor-wallet.plugin';\n","import { WalletLedgerClient } from './client';\nimport { createLifecycleHooks } from './hooks';\nimport { runWalletReconciliation } from './hooks/reconciliation';\nimport { buildWalletHttp } from './http/plugin-http';\nimport { createWalletPaymentAdapter } from './payment/WalletPaymentAdapter';\nimport type {\n WalletAdminMutationEvent,\n WalletPlugin,\n WalletPluginConfig,\n} from './plugin-types';\nimport { bindWalletPlugin, bindWalletConnection, type WalletHostConnection } from './plugin-instance';\nimport { TypeOrmWalletStore } from './typeorm/store';\n\ntype CronTask = { stop: () => void };\n\nfunction scheduleReconciliation(\n config: WalletPluginConfig,\n onRun: () => Promise<void>\n): CronTask | undefined {\n if (!config.reconciliation?.enabled || !config.flags.enabled) {\n return undefined;\n }\n\n const cronExpr = config.reconciliation.cron ?? '0 2 * * *';\n let intervalId: ReturnType<typeof setInterval> | undefined;\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const cron = require('node-cron') as { schedule: (expr: string, fn: () => void) => CronTask };\n return cron.schedule(cronExpr, () => {\n void onRun();\n });\n } catch {\n intervalId = setInterval(() => {\n void onRun();\n }, 24 * 60 * 60 * 1000);\n return { stop: () => clearInterval(intervalId) };\n }\n}\n\nclass WalletPluginImpl implements WalletPlugin {\n readonly client: WalletLedgerClient;\n readonly hooks;\n readonly flags;\n readonly http;\n readonly payment;\n onAdminMutation?: (event: WalletAdminMutationEvent) => Promise<void>;\n resolveOrderCustomerId?: (orderId: number) => Promise<number | null>;\n\n private cronTask?: CronTask;\n\n constructor(config: WalletPluginConfig, store: TypeOrmWalletStore) {\n this.flags = config.flags;\n this.onAdminMutation = config.onAdminMutation;\n this.resolveOrderCustomerId = config.resolveOrderCustomerId;\n\n this.client = new WalletLedgerClient(store, {\n defaultCurrency: config.defaultCurrency ?? 'INR',\n platformOwnerId: config.platformOwnerId,\n });\n\n this.hooks = createLifecycleHooks({\n client: this.client,\n platformOwnerId: config.platformOwnerId,\n defaultCurrency: config.defaultCurrency ?? 'INR',\n flags: config.flags,\n });\n\n this.http = buildWalletHttp(this, config.http);\n this.payment = {\n createWalletPaymentAdapter: () => createWalletPaymentAdapter(this),\n };\n\n if (config.reconciliation?.enabled && config.flags.enabled) {\n this.cronTask = scheduleReconciliation(config, async () => {\n const report = await runWalletReconciliation();\n if (report.parityDeltas.length > 0 || report.cacheMismatches.length > 0) {\n config.reconciliation?.onMismatch?.(report);\n config.reconciliation?.onLog?.('warn', 'wallet reconciliation mismatch', report);\n } else {\n config.reconciliation?.onLog?.('info', 'wallet reconciliation ok');\n }\n });\n }\n }\n\n isEnabled(): boolean {\n return this.flags.enabled;\n }\n\n isLedgerWritesEnabled(): boolean {\n return this.flags.enabled && this.flags.ledgerWrites;\n }\n\n isSettlementDebitEnabled(): boolean {\n return this.flags.enabled && this.flags.settlementDebit;\n }\n\n isCheckoutEnabled(): boolean {\n return this.flags.enabled && this.flags.checkout;\n }\n\n async shutdown(): Promise<void> {\n this.cronTask?.stop();\n }\n}\n\nexport function registerWalletPlugin(config: WalletPluginConfig): WalletPlugin {\n if (config.dataSource == null) {\n throw new Error('WalletPluginConfig.dataSource is required (host TypeORM Connection).');\n }\n bindWalletConnection(config.dataSource);\n const store = new TypeOrmWalletStore(config.dataSource as WalletHostConnection);\n const plugin = new WalletPluginImpl(config, store);\n bindWalletPlugin(plugin);\n return plugin;\n}\n\nexport { getWalletOrmMetadata } from './typeorm/metadata';\nexport { WALLET_PLUGIN_TOKEN } from './plugin-types';\nexport type {\n WalletPlugin,\n WalletPluginConfig,\n WalletFeatureFlags,\n WalletAdminMutationEvent,\n WalletHttpConfig,\n WalletReconciliationConfig,\n} from './plugin-types';\n"]}
@@ -0,0 +1,131 @@
1
+ import { e as WalletPluginConfig, f as WalletPlugin, I as IWalletPaymentProvider } from './types-CrJxUVwX.mjs';
2
+ export { D as DeliveredContext, O as OrderPaidContext, P as PaymentProviderWallet, R as RefundContext, S as SettlementDebitContext, g as WALLET_PLUGIN_TOKEN, h as WalletAdminMutationEvent, i as WalletConfig, C as WalletCreatePaymentInput, j as WalletFeatureFlags, k as WalletHttpConfig, l as WalletLedgerClient, W as WalletLifecycleHooks, b as WalletOrderPaidLine, m as WalletReconciliationConfig } from './types-CrJxUVwX.mjs';
3
+ import { W as WalletAccountType } from './store-BQ3whei-.mjs';
4
+ export { B as BalanceDeltas, d as CancelHoldParams, C as CreditParams, D as DebitParams, G as GetTransactionsParams, H as HoldParams, f as HoldStatus, I as IWalletStore, g as IWalletStoreTx, h as LedgerEntryType, L as LedgerMutationResult, R as ReleaseParams, T as TransferParams, b as WalletAccount, c as WalletBalance, i as WalletHold, e as WalletLedgerEntry, j as WalletReference, a as WalletStoreContext } from './store-BQ3whei-.mjs';
5
+ export { CreateWalletTables1790000000000, TypeOrmWalletStore, WalletAccountEntity, WalletHoldEntity, WalletLedgerEntryEntity, getWalletOrmMetadata } from './typeorm/index.mjs';
6
+ import { Router } from 'express';
7
+ import 'typeorm';
8
+
9
+ /**
10
+ * Convert decimal currency amount (e.g. rupees) to smallest unit (paise).
11
+ */
12
+ declare function toMinorUnit(amount: number): number;
13
+ /**
14
+ * Convert smallest currency unit (paise) back to decimal amount (rupees).
15
+ */
16
+ declare function fromMinorUnit(amount: number): number;
17
+
18
+ declare class WalletError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ declare class WalletConfigError extends WalletError {
22
+ constructor(message: string);
23
+ }
24
+ declare class InsufficientBalanceError extends WalletError {
25
+ constructor(message?: string);
26
+ }
27
+ declare class HoldNotFoundError extends WalletError {
28
+ constructor(message?: string);
29
+ }
30
+ declare class DuplicateOperationError extends WalletError {
31
+ readonly existingEntry: unknown;
32
+ constructor(message: string, existingEntry: unknown);
33
+ }
34
+ declare class InvalidAmountError extends WalletError {
35
+ constructor(message?: string);
36
+ }
37
+
38
+ declare function registerWalletPlugin(config: WalletPluginConfig): WalletPlugin;
39
+
40
+ declare function createWalletPaymentAdapter(plugin: WalletPlugin): IWalletPaymentProvider;
41
+
42
+ declare class WalletCreditDebitRequest {
43
+ ownerType: WalletAccountType;
44
+ ownerId: number;
45
+ amount: number;
46
+ currency?: string;
47
+ reason?: string;
48
+ }
49
+ declare class AdminWalletController {
50
+ private get plugin();
51
+ private assertEnabled;
52
+ listAccounts(limit: number | undefined, offset: number | undefined, response: {
53
+ status: (code: number) => {
54
+ send: (body: unknown) => void;
55
+ };
56
+ }): Promise<void>;
57
+ listTransactions(accountId: number, limit: number | undefined, offset: number | undefined, response: {
58
+ status: (code: number) => {
59
+ send: (body: unknown) => void;
60
+ };
61
+ }): Promise<void>;
62
+ credit(body: WalletCreditDebitRequest, request: {
63
+ user?: {
64
+ userId?: number;
65
+ };
66
+ }, response: {
67
+ status: (code: number) => {
68
+ send: (body: unknown) => void;
69
+ };
70
+ }): Promise<void>;
71
+ debit(body: WalletCreditDebitRequest, request: {
72
+ user?: {
73
+ userId?: number;
74
+ };
75
+ }, response: {
76
+ status: (code: number) => {
77
+ send: (body: unknown) => void;
78
+ };
79
+ }): Promise<void>;
80
+ private emitAdminMutation;
81
+ }
82
+
83
+ declare class CustomerWalletController {
84
+ private get plugin();
85
+ private assertEnabled;
86
+ getBalance(request: {
87
+ user?: {
88
+ id?: number;
89
+ };
90
+ }, response: {
91
+ status: (code: number) => {
92
+ send: (body: unknown) => void;
93
+ };
94
+ }): Promise<void>;
95
+ getTransactions(request: {
96
+ user?: {
97
+ id?: number;
98
+ };
99
+ }, limit: number | undefined, offset: number | undefined, response: {
100
+ status: (code: number) => {
101
+ send: (body: unknown) => void;
102
+ };
103
+ }): Promise<void>;
104
+ }
105
+
106
+ declare class VendorWalletController {
107
+ private get plugin();
108
+ private assertEnabled;
109
+ getBalance(request: {
110
+ user?: {
111
+ vendorId?: number;
112
+ };
113
+ }, response: {
114
+ status: (code: number) => {
115
+ send: (body: unknown) => void;
116
+ };
117
+ }): Promise<void>;
118
+ getTransactions(request: {
119
+ user?: {
120
+ vendorId?: number;
121
+ };
122
+ }, limit: number | undefined, offset: number | undefined, response: {
123
+ status: (code: number) => {
124
+ send: (body: unknown) => void;
125
+ };
126
+ }): Promise<void>;
127
+ }
128
+
129
+ declare function createExpressWalletRouter(plugin: WalletPlugin, _basePath?: string): Router;
130
+
131
+ export { AdminWalletController, CustomerWalletController, DuplicateOperationError, HoldNotFoundError, IWalletPaymentProvider, InsufficientBalanceError, InvalidAmountError, VendorWalletController, WalletAccountType, WalletConfigError, WalletError, WalletPlugin, WalletPluginConfig, createExpressWalletRouter, createWalletPaymentAdapter, fromMinorUnit, registerWalletPlugin, toMinorUnit };
@@ -0,0 +1,131 @@
1
+ import { e as WalletPluginConfig, f as WalletPlugin, I as IWalletPaymentProvider } from './types-iNUEzUgo.js';
2
+ export { D as DeliveredContext, O as OrderPaidContext, P as PaymentProviderWallet, R as RefundContext, S as SettlementDebitContext, g as WALLET_PLUGIN_TOKEN, h as WalletAdminMutationEvent, i as WalletConfig, C as WalletCreatePaymentInput, j as WalletFeatureFlags, k as WalletHttpConfig, l as WalletLedgerClient, W as WalletLifecycleHooks, b as WalletOrderPaidLine, m as WalletReconciliationConfig } from './types-iNUEzUgo.js';
3
+ import { W as WalletAccountType } from './store-BQ3whei-.js';
4
+ export { B as BalanceDeltas, d as CancelHoldParams, C as CreditParams, D as DebitParams, G as GetTransactionsParams, H as HoldParams, f as HoldStatus, I as IWalletStore, g as IWalletStoreTx, h as LedgerEntryType, L as LedgerMutationResult, R as ReleaseParams, T as TransferParams, b as WalletAccount, c as WalletBalance, i as WalletHold, e as WalletLedgerEntry, j as WalletReference, a as WalletStoreContext } from './store-BQ3whei-.js';
5
+ export { CreateWalletTables1790000000000, TypeOrmWalletStore, WalletAccountEntity, WalletHoldEntity, WalletLedgerEntryEntity, getWalletOrmMetadata } from './typeorm/index.js';
6
+ import { Router } from 'express';
7
+ import 'typeorm';
8
+
9
+ /**
10
+ * Convert decimal currency amount (e.g. rupees) to smallest unit (paise).
11
+ */
12
+ declare function toMinorUnit(amount: number): number;
13
+ /**
14
+ * Convert smallest currency unit (paise) back to decimal amount (rupees).
15
+ */
16
+ declare function fromMinorUnit(amount: number): number;
17
+
18
+ declare class WalletError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ declare class WalletConfigError extends WalletError {
22
+ constructor(message: string);
23
+ }
24
+ declare class InsufficientBalanceError extends WalletError {
25
+ constructor(message?: string);
26
+ }
27
+ declare class HoldNotFoundError extends WalletError {
28
+ constructor(message?: string);
29
+ }
30
+ declare class DuplicateOperationError extends WalletError {
31
+ readonly existingEntry: unknown;
32
+ constructor(message: string, existingEntry: unknown);
33
+ }
34
+ declare class InvalidAmountError extends WalletError {
35
+ constructor(message?: string);
36
+ }
37
+
38
+ declare function registerWalletPlugin(config: WalletPluginConfig): WalletPlugin;
39
+
40
+ declare function createWalletPaymentAdapter(plugin: WalletPlugin): IWalletPaymentProvider;
41
+
42
+ declare class WalletCreditDebitRequest {
43
+ ownerType: WalletAccountType;
44
+ ownerId: number;
45
+ amount: number;
46
+ currency?: string;
47
+ reason?: string;
48
+ }
49
+ declare class AdminWalletController {
50
+ private get plugin();
51
+ private assertEnabled;
52
+ listAccounts(limit: number | undefined, offset: number | undefined, response: {
53
+ status: (code: number) => {
54
+ send: (body: unknown) => void;
55
+ };
56
+ }): Promise<void>;
57
+ listTransactions(accountId: number, limit: number | undefined, offset: number | undefined, response: {
58
+ status: (code: number) => {
59
+ send: (body: unknown) => void;
60
+ };
61
+ }): Promise<void>;
62
+ credit(body: WalletCreditDebitRequest, request: {
63
+ user?: {
64
+ userId?: number;
65
+ };
66
+ }, response: {
67
+ status: (code: number) => {
68
+ send: (body: unknown) => void;
69
+ };
70
+ }): Promise<void>;
71
+ debit(body: WalletCreditDebitRequest, request: {
72
+ user?: {
73
+ userId?: number;
74
+ };
75
+ }, response: {
76
+ status: (code: number) => {
77
+ send: (body: unknown) => void;
78
+ };
79
+ }): Promise<void>;
80
+ private emitAdminMutation;
81
+ }
82
+
83
+ declare class CustomerWalletController {
84
+ private get plugin();
85
+ private assertEnabled;
86
+ getBalance(request: {
87
+ user?: {
88
+ id?: number;
89
+ };
90
+ }, response: {
91
+ status: (code: number) => {
92
+ send: (body: unknown) => void;
93
+ };
94
+ }): Promise<void>;
95
+ getTransactions(request: {
96
+ user?: {
97
+ id?: number;
98
+ };
99
+ }, limit: number | undefined, offset: number | undefined, response: {
100
+ status: (code: number) => {
101
+ send: (body: unknown) => void;
102
+ };
103
+ }): Promise<void>;
104
+ }
105
+
106
+ declare class VendorWalletController {
107
+ private get plugin();
108
+ private assertEnabled;
109
+ getBalance(request: {
110
+ user?: {
111
+ vendorId?: number;
112
+ };
113
+ }, response: {
114
+ status: (code: number) => {
115
+ send: (body: unknown) => void;
116
+ };
117
+ }): Promise<void>;
118
+ getTransactions(request: {
119
+ user?: {
120
+ vendorId?: number;
121
+ };
122
+ }, limit: number | undefined, offset: number | undefined, response: {
123
+ status: (code: number) => {
124
+ send: (body: unknown) => void;
125
+ };
126
+ }): Promise<void>;
127
+ }
128
+
129
+ declare function createExpressWalletRouter(plugin: WalletPlugin, _basePath?: string): Router;
130
+
131
+ export { AdminWalletController, CustomerWalletController, DuplicateOperationError, HoldNotFoundError, IWalletPaymentProvider, InsufficientBalanceError, InvalidAmountError, VendorWalletController, WalletAccountType, WalletConfigError, WalletError, WalletPlugin, WalletPluginConfig, createExpressWalletRouter, createWalletPaymentAdapter, fromMinorUnit, registerWalletPlugin, toMinorUnit };