multivendor-wallet 0.0.1 → 0.0.3

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.
@@ -172,31 +172,11 @@ function createRefundHooks(runtime) {
172
172
  __name(createRefundHooks, "createRefundHooks");
173
173
 
174
174
  // src/hooks/settlement.ts
175
- function createSettlementHooks(runtime) {
176
- const { client, flags } = runtime;
175
+ function createSettlementHooks(_runtime) {
177
176
  return {
178
- async onSettlementDebit(ctx) {
179
- if (!flags.enabled || !flags.settlementDebit) {
180
- return;
181
- }
182
- const txCtx = {
183
- nativeTx: ctx.nativeTx
184
- };
185
- const amountPaise = toMinorUnit(ctx.amountRupees);
186
- const vendorAccount = await client.getOrCreateAccount(WalletAccountType.VENDOR, ctx.vendorId, ctx.currency, txCtx);
187
- const balance = await client.getBalance(vendorAccount.id, txCtx);
188
- if (balance.available < amountPaise) {
189
- throw new Error(`Insufficient vendor wallet balance for settlement (vendor ${ctx.vendorId})`);
190
- }
191
- await client.debit({
192
- accountId: vendorAccount.id,
193
- amount: amountPaise,
194
- idempotencyKey: `settlement:${ctx.settlementId}:debit:${ctx.vendorId}`,
195
- reference: {
196
- referenceType: "settlement",
197
- referenceId: String(ctx.settlementId)
198
- }
199
- }, txCtx);
177
+ /** @deprecated Settlement wallet debits removed — vendor payouts use wallet payout requests. */
178
+ async onSettlementDebit(_ctx) {
179
+ return;
200
180
  }
201
181
  };
202
182
  }
@@ -669,7 +649,7 @@ __name(findCacheLedgerMismatches, "findCacheLedgerMismatches");
669
649
  function createLifecycleHooks(runtime) {
670
650
  return {
671
651
  ...createOrderHooks(runtime),
672
- ...createSettlementHooks(runtime),
652
+ ...createSettlementHooks(),
673
653
  ...createRefundHooks(runtime)
674
654
  };
675
655
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/currency.ts","../../src/types.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"],"names":["toMinorUnit","amount","Math","round","fromMinorUnit","WalletAccountType","isWalletOnlyPayment","paymentMethod","String","trim","toLowerCase","createOrderHooks","runtime","client","platformOwnerId","flags","onOrderPaid","ctx","enabled","ledgerWrites","txCtx","nativeTx","platform","getOrCreateAccount","PLATFORM","currency","orderTotalPaise","orderTotalRupees","shouldDebitCustomer","customerId","skipCustomerDebit","debitRupees","walletAmountRupees","customer","CUSTOMER","debit","accountId","id","idempotencyKey","paymentNumber","reference","referenceType","referenceId","orderId","credit","line","lines","vendorNetRupees","commissionBaseRupees","commissionRupees","vendor","VENDOR","vendorId","hold","sourceAccountId","targetAccountId","vendorOrderId","onLineDelivered","release","undefined","isWalletPayment","walletCreditRupees","walletRefundRupees","lineTotalRupees","idempotencyPrefix","scope","idempotencyScope","orderProductId","refundReason","createRefundHooks","onRefund","processExternalRefund","keyPrefix","skipEscrow","cancelHold","refundPaise","balance","getBalance","available","creditRupees","createSettlementHooks","onSettlementDebit","settlementDebit","amountPaise","amountRupees","vendorAccount","Error","settlementId","resolveWalletConnection","nowTimestamp","Date","toISOString","slice","replace","WalletAccountEntity","ownerType","ownerId","availableBalance","heldBalance","createdBy","createdDate","modifiedBy","modifiedDate","setCreated","setModified","name","length","default","type","nullable","WalletLedgerEntryEntity","entryType","balanceAfterAvailable","balanceAfterHeld","metadata","unique","WalletHoldEntity","status","runWalletReconciliation","parityDeltas","findVendorPaymentHoldParityDeltas","cacheMismatches","findCacheLedgerMismatches","rows","query","deltas","row","vendorPaymentRupees","Number","vendorPaymentAmount","holdPaise","holdAmount","holdRupees","delta","abs","holdStatus","push","deltaRupees","connection","accounts","getRepository","find","mismatches","account","lastEntry","findOne","where","order","cachedAvailable","cachedHeld","ledgerAvailable","ledgerHeld","createLifecycleHooks"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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","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 { 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"]}
1
+ {"version":3,"sources":["../../src/currency.ts","../../src/types.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"],"names":["toMinorUnit","amount","Math","round","fromMinorUnit","WalletAccountType","isWalletOnlyPayment","paymentMethod","String","trim","toLowerCase","createOrderHooks","runtime","client","platformOwnerId","flags","onOrderPaid","ctx","enabled","ledgerWrites","txCtx","nativeTx","platform","getOrCreateAccount","PLATFORM","currency","orderTotalPaise","orderTotalRupees","shouldDebitCustomer","customerId","skipCustomerDebit","debitRupees","walletAmountRupees","customer","CUSTOMER","debit","accountId","id","idempotencyKey","paymentNumber","reference","referenceType","referenceId","orderId","credit","line","lines","vendorNetRupees","commissionBaseRupees","commissionRupees","vendor","VENDOR","vendorId","hold","sourceAccountId","targetAccountId","vendorOrderId","onLineDelivered","release","undefined","isWalletPayment","walletCreditRupees","walletRefundRupees","lineTotalRupees","idempotencyPrefix","scope","idempotencyScope","orderProductId","refundReason","createRefundHooks","onRefund","processExternalRefund","keyPrefix","skipEscrow","cancelHold","refundPaise","balance","getBalance","available","creditRupees","createSettlementHooks","_runtime","onSettlementDebit","_ctx","resolveWalletConnection","Error","nowTimestamp","Date","toISOString","slice","replace","WalletAccountEntity","ownerType","ownerId","availableBalance","heldBalance","createdBy","createdDate","modifiedBy","modifiedDate","setCreated","setModified","name","length","default","type","nullable","WalletLedgerEntryEntity","entryType","balanceAfterAvailable","balanceAfterHeld","metadata","unique","WalletHoldEntity","status","runWalletReconciliation","parityDeltas","findVendorPaymentHoldParityDeltas","cacheMismatches","findCacheLedgerMismatches","rows","query","deltas","row","vendorPaymentRupees","Number","vendorPaymentAmount","holdPaise","holdAmount","holdRupees","delta","abs","holdStatus","push","deltaRupees","connection","accounts","getRepository","find","mismatches","account","lastEntry","findOne","where","order","cachedAvailable","cachedHeld","ledgerAvailable","ledgerHeld","createLifecycleHooks"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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","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 { 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 type { HookRuntime, SettlementDebitContext, WalletLifecycleHooks } from './types';\n\nexport function createSettlementHooks(\n _runtime: HookRuntime\n): Pick<WalletLifecycleHooks, 'onSettlementDebit'> {\n return {\n /** @deprecated Settlement wallet debits removed — vendor payouts use wallet payout requests. */\n async onSettlementDebit(_ctx: SettlementDebitContext): Promise<void> {\n return;\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"]}
@@ -170,31 +170,11 @@ function createRefundHooks(runtime) {
170
170
  __name(createRefundHooks, "createRefundHooks");
171
171
 
172
172
  // src/hooks/settlement.ts
173
- function createSettlementHooks(runtime) {
174
- const { client, flags } = runtime;
173
+ function createSettlementHooks(_runtime) {
175
174
  return {
176
- async onSettlementDebit(ctx) {
177
- if (!flags.enabled || !flags.settlementDebit) {
178
- return;
179
- }
180
- const txCtx = {
181
- nativeTx: ctx.nativeTx
182
- };
183
- const amountPaise = toMinorUnit(ctx.amountRupees);
184
- const vendorAccount = await client.getOrCreateAccount(WalletAccountType.VENDOR, ctx.vendorId, ctx.currency, txCtx);
185
- const balance = await client.getBalance(vendorAccount.id, txCtx);
186
- if (balance.available < amountPaise) {
187
- throw new Error(`Insufficient vendor wallet balance for settlement (vendor ${ctx.vendorId})`);
188
- }
189
- await client.debit({
190
- accountId: vendorAccount.id,
191
- amount: amountPaise,
192
- idempotencyKey: `settlement:${ctx.settlementId}:debit:${ctx.vendorId}`,
193
- reference: {
194
- referenceType: "settlement",
195
- referenceId: String(ctx.settlementId)
196
- }
197
- }, txCtx);
175
+ /** @deprecated Settlement wallet debits removed — vendor payouts use wallet payout requests. */
176
+ async onSettlementDebit(_ctx) {
177
+ return;
198
178
  }
199
179
  };
200
180
  }
@@ -667,7 +647,7 @@ __name(findCacheLedgerMismatches, "findCacheLedgerMismatches");
667
647
  function createLifecycleHooks(runtime) {
668
648
  return {
669
649
  ...createOrderHooks(runtime),
670
- ...createSettlementHooks(runtime),
650
+ ...createSettlementHooks(),
671
651
  ...createRefundHooks(runtime)
672
652
  };
673
653
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/currency.ts","../../src/types.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"],"names":["toMinorUnit","amount","Math","round","fromMinorUnit","WalletAccountType","isWalletOnlyPayment","paymentMethod","String","trim","toLowerCase","createOrderHooks","runtime","client","platformOwnerId","flags","onOrderPaid","ctx","enabled","ledgerWrites","txCtx","nativeTx","platform","getOrCreateAccount","PLATFORM","currency","orderTotalPaise","orderTotalRupees","shouldDebitCustomer","customerId","skipCustomerDebit","debitRupees","walletAmountRupees","customer","CUSTOMER","debit","accountId","id","idempotencyKey","paymentNumber","reference","referenceType","referenceId","orderId","credit","line","lines","vendorNetRupees","commissionBaseRupees","commissionRupees","vendor","VENDOR","vendorId","hold","sourceAccountId","targetAccountId","vendorOrderId","onLineDelivered","release","undefined","isWalletPayment","walletCreditRupees","walletRefundRupees","lineTotalRupees","idempotencyPrefix","scope","idempotencyScope","orderProductId","refundReason","createRefundHooks","onRefund","processExternalRefund","keyPrefix","skipEscrow","cancelHold","refundPaise","balance","getBalance","available","creditRupees","createSettlementHooks","onSettlementDebit","settlementDebit","amountPaise","amountRupees","vendorAccount","Error","settlementId","resolveWalletConnection","nowTimestamp","Date","toISOString","slice","replace","WalletAccountEntity","ownerType","ownerId","availableBalance","heldBalance","createdBy","createdDate","modifiedBy","modifiedDate","setCreated","setModified","name","length","default","type","nullable","WalletLedgerEntryEntity","entryType","balanceAfterAvailable","balanceAfterHeld","metadata","unique","WalletHoldEntity","status","runWalletReconciliation","parityDeltas","findVendorPaymentHoldParityDeltas","cacheMismatches","findCacheLedgerMismatches","rows","query","deltas","row","vendorPaymentRupees","Number","vendorPaymentAmount","holdPaise","holdAmount","holdRupees","delta","abs","holdStatus","push","deltaRupees","connection","accounts","getRepository","find","mismatches","account","lastEntry","findOne","where","order","cachedAvailable","cachedHeld","ledgerAvailable","ledgerHeld","createLifecycleHooks"],"mappings":"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","file":"index.js","sourcesContent":["/**\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","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 { 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"]}
1
+ {"version":3,"sources":["../../src/currency.ts","../../src/types.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"],"names":["toMinorUnit","amount","Math","round","fromMinorUnit","WalletAccountType","isWalletOnlyPayment","paymentMethod","String","trim","toLowerCase","createOrderHooks","runtime","client","platformOwnerId","flags","onOrderPaid","ctx","enabled","ledgerWrites","txCtx","nativeTx","platform","getOrCreateAccount","PLATFORM","currency","orderTotalPaise","orderTotalRupees","shouldDebitCustomer","customerId","skipCustomerDebit","debitRupees","walletAmountRupees","customer","CUSTOMER","debit","accountId","id","idempotencyKey","paymentNumber","reference","referenceType","referenceId","orderId","credit","line","lines","vendorNetRupees","commissionBaseRupees","commissionRupees","vendor","VENDOR","vendorId","hold","sourceAccountId","targetAccountId","vendorOrderId","onLineDelivered","release","undefined","isWalletPayment","walletCreditRupees","walletRefundRupees","lineTotalRupees","idempotencyPrefix","scope","idempotencyScope","orderProductId","refundReason","createRefundHooks","onRefund","processExternalRefund","keyPrefix","skipEscrow","cancelHold","refundPaise","balance","getBalance","available","creditRupees","createSettlementHooks","_runtime","onSettlementDebit","_ctx","resolveWalletConnection","Error","nowTimestamp","Date","toISOString","slice","replace","WalletAccountEntity","ownerType","ownerId","availableBalance","heldBalance","createdBy","createdDate","modifiedBy","modifiedDate","setCreated","setModified","name","length","default","type","nullable","WalletLedgerEntryEntity","entryType","balanceAfterAvailable","balanceAfterHeld","metadata","unique","WalletHoldEntity","status","runWalletReconciliation","parityDeltas","findVendorPaymentHoldParityDeltas","cacheMismatches","findCacheLedgerMismatches","rows","query","deltas","row","vendorPaymentRupees","Number","vendorPaymentAmount","holdPaise","holdAmount","holdRupees","delta","abs","holdStatus","push","deltaRupees","connection","accounts","getRepository","find","mismatches","account","lastEntry","findOne","where","order","cachedAvailable","cachedHeld","ledgerAvailable","ledgerHeld","createLifecycleHooks"],"mappings":"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","file":"index.js","sourcesContent":["/**\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","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 { 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 type { HookRuntime, SettlementDebitContext, WalletLifecycleHooks } from './types';\n\nexport function createSettlementHooks(\n _runtime: HookRuntime\n): Pick<WalletLifecycleHooks, 'onSettlementDebit'> {\n return {\n /** @deprecated Settlement wallet debits removed — vendor payouts use wallet payout requests. */\n async onSettlementDebit(_ctx: SettlementDebitContext): Promise<void> {\n return;\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"]}
package/dist/index.cjs CHANGED
@@ -570,31 +570,11 @@ function createRefundHooks(runtime) {
570
570
  __name(createRefundHooks, "createRefundHooks");
571
571
 
572
572
  // src/hooks/settlement.ts
573
- function createSettlementHooks(runtime) {
574
- const { client, flags } = runtime;
573
+ function createSettlementHooks(_runtime) {
575
574
  return {
576
- async onSettlementDebit(ctx) {
577
- if (!flags.enabled || !flags.settlementDebit) {
578
- return;
579
- }
580
- const txCtx = {
581
- nativeTx: ctx.nativeTx
582
- };
583
- const amountPaise = toMinorUnit(ctx.amountRupees);
584
- const vendorAccount = await client.getOrCreateAccount(WalletAccountType.VENDOR, ctx.vendorId, ctx.currency, txCtx);
585
- const balance = await client.getBalance(vendorAccount.id, txCtx);
586
- if (balance.available < amountPaise) {
587
- throw new Error(`Insufficient vendor wallet balance for settlement (vendor ${ctx.vendorId})`);
588
- }
589
- await client.debit({
590
- accountId: vendorAccount.id,
591
- amount: amountPaise,
592
- idempotencyKey: `settlement:${ctx.settlementId}:debit:${ctx.vendorId}`,
593
- reference: {
594
- referenceType: "settlement",
595
- referenceId: String(ctx.settlementId)
596
- }
597
- }, txCtx);
575
+ /** @deprecated Settlement wallet debits removed — vendor payouts use wallet payout requests. */
576
+ async onSettlementDebit(_ctx) {
577
+ return;
598
578
  }
599
579
  };
600
580
  }
@@ -1087,7 +1067,7 @@ __name(findCacheLedgerMismatches, "findCacheLedgerMismatches");
1087
1067
  function createLifecycleHooks(runtime) {
1088
1068
  return {
1089
1069
  ...createOrderHooks(runtime),
1090
- ...createSettlementHooks(runtime),
1070
+ ...createSettlementHooks(),
1091
1071
  ...createRefundHooks(runtime)
1092
1072
  };
1093
1073
  }