From 04cc03fe25593331d2767d744e5e34f427b4ae79 Mon Sep 17 00:00:00 2001 From: mohammad sedighi Date: Sun, 30 Aug 2026 14:16:36 +0330 Subject: [PATCH] Sync Tahesab wallet balance on import and let admins resolve conflicts. Add customer search on the Tahesab-only list, bulk/per-customer mande sync UI, and a decision modal when app balance differs from Tahesab. Co-authored-by: Cursor --- src/api/tahesab.ts | 69 ++++ .../components/TahesabCustomerSync.vue | 59 +++- .../components/TahesabWalletBulkSync.vue | 313 ++++++++++++++++++ .../CustomerAccountingCodeModal.vue | 70 ++++ .../components/TahesabMandeDecisionModal.vue | 97 ++++++ .../components/TahesabWalletSyncAction.vue | 72 ++++ src/pages/menuPages/customers/base/index.vue | 89 +++++ 7 files changed, 761 insertions(+), 8 deletions(-) create mode 100644 src/pages/menuPages/accounting/components/TahesabWalletBulkSync.vue create mode 100644 src/pages/menuPages/customers/base/components/TahesabMandeDecisionModal.vue create mode 100644 src/pages/menuPages/customers/base/components/TahesabWalletSyncAction.vue diff --git a/src/api/tahesab.ts b/src/api/tahesab.ts index a93c02d..9c4c838 100644 --- a/src/api/tahesab.ts +++ b/src/api/tahesab.ts @@ -131,3 +131,72 @@ export const importFromTahesab = async (customers: TahesabOnlyCustomer[]) => await useAxios.post('/admin/tahesab/customer-sync/import-from-tahesab', { customers, }) + +export interface TahesabWalletSyncResult { + ok: boolean + needs_decision?: boolean + message: string + result?: { + applied: boolean + needs_decision?: boolean + skipped?: boolean + gold_delta?: number + rial_delta?: number + app_gold?: number + app_cash?: number + tahesab_gold?: number + tahesab_cash?: number + message: string + } +} + +/** همگام‌سازی مانده یک مشتری با ته‌حساب */ +export const syncCustomerWalletFromTahesab = async ( + customerId: number, + opts?: { overwrite?: boolean; keep?: boolean; ask_if_conflict?: boolean } +) => + await useAxios.post( + `/admin/customer/${customerId}/tahesab/sync-wallet`, + { + overwrite: opts?.overwrite ?? false, + keep: opts?.keep ?? false, + ask_if_conflict: opts?.ask_if_conflict ?? true, + } + ) + +export interface TahesabBulkWalletSyncChunk { + ok: boolean + message: string + total: number + offset: number + processed: number + next_offset: number + done: boolean + success: number + changed: number + needs_decision: number + failed: number + errors: { id: number; name: string; mobile?: string; error: string }[] + decisions: { + id: number + name: string + mobile?: string + app_gold?: number + app_cash?: number + tahesab_gold?: number + tahesab_cash?: number + message: string + }[] +} + +/** یک دسته از همگام‌سازی ماندهٔ همهٔ مشتریان دارای کد ته‌حساب */ +export const syncAllWalletsFromTahesabChunk = async (params?: { + offset?: number + limit?: number + overwrite?: boolean +}) => + await useAxios.post('/admin/tahesab/wallet-sync/all', { + offset: params?.offset ?? 0, + limit: params?.limit ?? 20, + overwrite: params?.overwrite ?? false, + }) diff --git a/src/pages/menuPages/accounting/components/TahesabCustomerSync.vue b/src/pages/menuPages/accounting/components/TahesabCustomerSync.vue index d3144c6..56607cf 100644 --- a/src/pages/menuPages/accounting/components/TahesabCustomerSync.vue +++ b/src/pages/menuPages/accounting/components/TahesabCustomerSync.vue @@ -1,6 +1,8 @@