# تسک ۱۸: ماژول تسویه نماینده (Settlement) ## توضیح سیستم تسویه‌حساب نمایندگان — هر بار که از طریق دامنه یک نماینده نوبت پرداخت می‌شود، کمیسیون مشخصی (طبق `commission_percent`) به کیف پول نماینده واریز می‌شود. نماینده می‌تواند درخواست تسویه (برداشت) بدهد و ادمین آن را تأیید/رد می‌کند. ## فلوی کمیسیون (از مستند) ``` بیمار → پرداخت نوبت از دامنه نماینده → commission = amount × (commission_percent / 100) → واریز به کیف پول نماینده (wallet_transactions) دکتر → خرید اشتراک از طریق نماینده → کمیسیون اشتراک → واریز به کیف پول نماینده ``` ## Endpoint ها | متد | مسیر | توضیح | نیاز به Auth | |-----|------|-------|-------------| | GET | `/api/v1/representation/{id}/wallet` | موجودی کیف پول نماینده | بله (Admin / Owner) | | GET | `/api/v1/representation/{id}/wallet/transactions` | تاریخچه تراکنش‌های کیف پول | بله (Admin / Owner) | | POST | `/api/v1/representation/{id}/settlement` | درخواست تسویه توسط نماینده | بله (Owner) | | GET | `/api/v1/settlements` | لیست همه درخواست‌های تسویه | بله (Admin) | | GET | `/api/v1/settlement/{uuid}` | جزئیات یک درخواست تسویه | بله (Admin / Owner) | | PATCH | `/api/v1/settlement/{uuid}/approve` | تأیید تسویه توسط ادمین | بله (Admin) | | PATCH | `/api/v1/settlement/{uuid}/reject` | رد تسویه توسط ادمین | بله (Admin) | ## پیش‌نیازها - تسک ۰۱، ۰۲، ۱۵ (Payment)، ۱۶ (Representation) ## زمان تخمینی ۸ تا ۱۰ ساعت --- ## نمونه Request — POST /api/v1/representation/{id}/settlement ```json { "amount": 5000000, "card_number": "6037-9999-1234-5678", "bank_name": "ملت", "description": "تسویه اسفندماه ۱۴۰۳" } ``` ## نمونه Response — GET /api/v1/representation/{id}/wallet ```json { "representation_id": 3, "balance": 12500000, "total_earned": 35000000, "total_settled": 22500000, "pending_settlement": 0 } ``` ## نمونه Response — GET /api/v1/representation/{id}/wallet/transactions ```json { "data": [ { "uuid": "...", "type": "credit", "amount": 50000, "source": "appointment", "source_id": 142, "description": "کمیسیون نوبت #142", "created_at": 1748000000 }, { "uuid": "...", "type": "debit", "amount": 5000000, "source": "settlement", "source_id": 7, "description": "تسویه #7", "created_at": 1747000000 } ], "page": { "totalRecords": 48, "totalPages": 5, "currentPage": 1 } } ``` ## نمونه Response — GET /api/v1/settlement/{uuid} ```json { "uuid": "...", "representation": { "id": 3, "uuid": "...", "label": "نمایندگی یاسوج" }, "amount": 5000000, "card_number": "6037-9999-1234-5678", "bank_name": "ملت", "status": "pending", "description": "تسویه اسفندماه ۱۴۰۳", "admin_note": null, "requested_at": 1748000000, "resolved_at": null } ``` ## نکات مهم - **موجودی کافی:** قبل از ثبت درخواست تسویه، موجودی کیف پول نماینده بررسی شود - **یک درخواست pending:** نماینده نمی‌تواند همزمان دو درخواست `pending` داشته باشد - **کارت بانکی:** شماره کارت از لیست `bank_account` نماینده باشد (نه کارت دلخواه) - **مبلغ حداقل:** حداقل مبلغ تسویه باید تعریف شود (مثلاً ۱۰۰,۰۰۰ ریال) - **واریز کمیسیون:** هنگام `payments.status = 'received'` → کمیسیون محاسبه و به wallet واریز شود