feat: port payment management tab from tauri to admin dashboard

Add per-clinic payment methods (bank accounts + POS/card-reader devices)
under the "مدیریت پرداخت" settings tab at /admin/my-financial, ported from
clinic-pro-tauri's mock-only PaymentManagement tab into a real persisted
feature. These records are referenceable (by uuid) from patient invoices to
record which method a service payment was made with.

Backend (new src/PaymentMethod domain):
- BankAccount + Pos entities, repositories, PaymentMethodService (validation,
  ownership scoping, create/update/toggle logic).
- Thin PaymentMethodController exposing /api/v1/my/payment-methods/{bank-accounts,pos}
  (GET/POST/PUT + PATCH .../status), guarded to clinic/doctor/secretary/admin.
- Migration for bank_accounts + pos_devices tables.
- Functional tests (success + validation/404/403 + empty boundaries).
- docs/api/payment-method.md.

Frontend:
- Replace MyFinancialPage content with the payment-management UI (two tabs,
  tables, add/edit modals, status toggle) using the admin design system.
- usePaymentMethods hook (TanStack Query) + presentational components.
- Update page test to cover tabs, data, empty state and the add modal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
hamed
2026-07-15 11:39:32 +03:30
co-authored by Claude Opus 4.8
parent cac2e8b46a
commit b459d082a4
19 changed files with 1631 additions and 82 deletions
@@ -0,0 +1,16 @@
import type { SelectOption } from '../ui/SearchableSelect';
/**
* فهرست بانک‌های قابل انتخاب — عیناً از مبدأ clinic-pro-tauri
* (PaymentManagement/list/ModalAddBankAccount.jsx). value = label تا نام بانک
* مستقیم ذخیره شود (بک‌اند نام را نگه می‌دارد، نه شناسه).
*/
export const BANK_OPTIONS: SelectOption[] = [
{ value: 'ملی', label: 'ملی' },
{ value: 'ملت', label: 'ملت' },
{ value: 'تجارت', label: 'تجارت' },
{ value: 'صادرات', label: 'صادرات' },
{ value: 'سپه', label: 'سپه' },
{ value: 'پاسارگاد', label: 'پاسارگاد' },
{ value: 'رفاه', label: 'رفاه' },
];