arc/docs/PAYROLL_PLUGIN_PRODUCTION.md

172 lines
7.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# افزونه حقوق و دستمزد (Payroll) — سند اجرایی تولید
این سند برای پیاده‌سازی **سطح تجاری و تولید (Production)** افزونه حقوق و دستمزد در Hesabix تهیه شده است. معماری با الگوی افزونه‌های موجود (`customer_club`, `repair_shop_management`) و بازار افزونه هم‌خوان است.
---
## ۱. هدف و محدوده
### ۱.۱ هدف
- مدیریت **انعطاف‌پذیر** حقوق و دستمزد به ازای هر کسب‌وکار
- تعریف آیتم‌های حقوق (مزایا، کسورات، هزینه کارفرما) با **نگاشت حساب** از دفتر کل
- ثبت پرسنل، دوره‌های حقوق، اجرای حقوق و در فازهای بعد صدور اسناد حسابداری
### ۱.۲ وضعیت پیاده‌سازی (فاز ۰ — زیرساخت)
| قابلیت | وضعیت |
|--------|--------|
| ثبت افزونه در بازار با کد `payroll` | ✓ |
| مدل داده جامع (۱۱ جدول) | ✓ |
| گیت لایسنس (`payroll_plugin_dependency`) | ✓ |
| API تنظیمات، آیتم‌ها، دسته‌ها، پرسنل، دوره، لیست اجرا | ✓ |
| Seed آیتم‌های پیش‌فرض سیستمی | ✓ |
| مجوزهای `view`, `manage`, `operate`, `post`, `approve` | ✓ |
| منو، تنظیمات، داشبورد Flutter | ✓ |
| ثبت/ویرایش سند حقوق (اجرای حقوق) | ✓ |
| انتخاب حساب از درخت حساب‌ها در UI تنظیمات | ✓ |
| CRUD پرسنل و بخش در UI | ✓ (پرسنل؛ بخش از API) |
| محاسبه خودکار جمع‌ها | ✓ |
| فیش حقوق PDF | ✓ (فاز ۲) |
| import گروهی Excel پرسنل و مقادیر سند | ✓ (فاز ۲) |
| بستن دوره حقوق | ✓ (فاز ۲) |
| کپی سند از دوره/سند قبل | ✓ (فاز ۲) |
| مدیریت بخش در UI | ✓ (فاز ۲) |
| گزارش تفکیکی بخش | ✓ (فاز ۲) |
| صدور سند تعهدی و پرداخت حسابداری | ✓ (فاز ۳) |
| قوانین بیمه/مالیات (`payroll_statutory.py`) | ✓ (فاز ۴) |
| رد تأیید و بازگشت به پیش‌نویس (`reject_run`) | ✓ (فاز ۴) |
| گزارش‌های پیشرفته (آیتم، پرسنل، بیمه/مالیات، نمای دوره) | ✓ (فاز ۴) |
| UI قوانین بیمه/مالیات و گزارش‌ها | ✓ (فاز ۴) |
---
## ۲. معماری فنی
### ۲.۱ کد افزونه
- **کد بازار:** `payroll`
- **دسته:** `hr_payroll`
- فعال‌سازی: `business_plugins` + `marketplace_plugins`
- اسکریپت: `scripts/add_payroll_plugin.py`
### ۲.۲ مجوزهای کسب‌وکار
| اکشن | کاربرد |
|------|--------|
| `view` | مشاهده داشبورد، آیتم‌ها، پرسنل، لیست اسناد |
| `manage` | تنظیمات، آیتم‌ها، دسته‌ها، پرسنل، بخش‌ها |
| `operate` | ایجاد دوره و اجرای حقوق |
| `approve` | تأیید اجرای حقوق (در صورت `require_approval`) |
| `post` | صدور سند حسابداری |
### ۲.۳ مدل داده
| جدول | نقش |
|------|-----|
| `payroll_settings` | تنظیمات کسب‌وکار، حساب‌های پیش‌فرض |
| `payroll_item_categories` | دسته‌بندی آیتم‌ها |
| `payroll_item_definitions` | آیتم‌های حقوق + `account_id` |
| `payroll_departments` | بخش سازمانی |
| `payroll_employees` | پروفایل پرسنلی (`person_id`) |
| `payroll_periods` | دوره ماهانه |
| `payroll_runs` | اجرای حقوق / سند تجمیعی |
| `payroll_run_lines` | ردیف per پرسنل |
| `payroll_run_line_items` | مقدار آیتم per ردیف |
| `payroll_document_links` | پیوند با `documents` |
| `payroll_audit_logs` | حسابرسی تغییرات |
### ۲.۴ انواع آیتم (`item_kind`)
- `earning` — مزایا / درآمد
- `deduction` — کسورات
- `employer_cost` — هزینه سمت کارفرما
- `informational` — بدون اثر حسابداری
### ۲.۵ انواع محاسبه (`calculation_type`)
- `manual` — مقدار دستی در سند
- `fixed` — مقدار پیش‌فرض ثابت
- `percent_of_base` — درصد از حقوق پایه
- `percent_of_gross` — درصد از ناخالص
- `formula` — فرمول (فاز بعد)
---
## ۳. API
پیشوند: `/api/v1/payroll/business/{business_id}/...`
| متد | مسیر | مجوز |
|-----|------|------|
| GET | `/settings` | view |
| PUT | `/settings` | manage |
| GET | `/dashboard` | view |
| GET/POST/PUT/DELETE | `/item-categories` | view / manage |
| GET/POST/PUT/DELETE | `/items` | view / manage |
| GET/POST | `/departments` | view / manage |
| GET/POST | `/employees` | view / manage |
| GET/POST | `/periods` | view / operate |
| POST | `/periods/{period_id}/close` | operate |
| GET | `/runs` | view |
| GET | `/runs/{run_id}` | view |
| POST | `/runs` | operate |
| PUT | `/runs/{run_id}` | operate |
| DELETE | `/runs/{run_id}` | operate |
| POST | `/runs/{run_id}/finalize` | operate |
| POST | `/runs/{run_id}/cancel` | operate |
| POST | `/runs/{run_id}/copy` | operate |
| GET | `/runs/{run_id}/payslip/pdf` | view |
| GET | `/runs/{run_id}/import/template` | operate |
| POST | `/runs/{run_id}/import/excel` | operate |
| GET | `/employees/import/template` | manage |
| GET | `/employees/export/excel` | view |
| POST | `/employees/import/excel` | manage |
| GET | `/reports/department-summary` | view |
| POST | `/runs/{run_id}/approve` | approve |
| POST | `/runs/{run_id}/post` | post |
| POST | `/runs/{run_id}/post-payment` | post |
| PUT | `/employees/{employee_id}` | manage |
| PUT | `/departments/{department_id}` | manage |
---
## ۴. فرانت‌اند
| مسیر | صفحه |
|------|------|
| `/business/:id/payroll` | `PayrollMainPage` |
| `/business/:id/payroll/reports` | `PayrollReportsPage` |
| `/business/:id/settings/payroll` | `PayrollSettingsPage` |
گیت لایسنس: `PayrollPluginGate`
### تقویم و تاریخ
- همه تاریخ‌های UI (تاریخ سند، استخدام، پایان همکاری، بازه دوره، اسناد حسابداری) از `DateInputField` و `PayrollCalendarUtils` استفاده می‌کنند.
- نمایش مطابق `CalendarController` (شمسی/میلادی)؛ ذخیره در API به صورت `YYYY-MM-DD` میلادی (تاریخ سند/استخدام) یا سال/ماه شمسی (دوره حقوق).
- انتخاب شخص در ثبت پرسنل: فقط اشخاص با نوع **کارمند** (`personTypes: ['کارمند']`)؛ اعتبارسنجی سمت سرور در `create_employee`.
- افزودن شخص جدید از combobox: نوع شخص مطابق فیلتر combobox از پیش انتخاب می‌شود (`PersonFormDialog.initialPersonTypes`).
- فرم پرسنل: انتخاب **بخش سازمانی** (اختیاری) و تاریخ استخدام/پایان همکاری.
---
## ۵. استقرار
```bash
# مهاجرت
alembic upgrade head
# ثبت افزونه در بازار
python scripts/add_payroll_plugin.py
```
---
## ۶. فازهای بعدی
1. **فاز ۱:** CRUD کامل `payroll_runs` + فرم ثبت سند حقوق — ✓
2. **فاز ۲:** فیش حقوق PDF، import Excel، بستن دوره، کپی سند، بخش‌ها، گزارش تفکیکی — ✓
3. **فاز ۳:** `payroll_accounting.py` — سند تعهدی و پرداخت — ✓
4. **فاز ۴:** قوانین بیمه/مالیات، workflow تأیید، گزارش‌های پیشرفته — ✓
5. **فاز ۵ (آینده):** فرمول سفارشی آیتم‌ها، ادغام حضور و غیاب، گزارش‌های قانونی خروجی