arc/docs/WORKFLOW_TRIGGER_FIX.md
2026-04-14 19:34:55 +03:30

174 lines
6.3 KiB
Markdown
Executable file
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.

# 🔧 حل مشکل عدم اجرای ورک‌فلو هنگام ایجاد فاکتور
## 🎯 مشکل شناسایی شده
### خلاصه:
زمانی که فاکتور فروش جدیدی ایجاد می‌شود، **ورک‌فلو اجرا نمی‌شود** حتی اگر ورک‌فلو فعال باشد و تریگر `invoice.created` داشته باشد.
### جزئیات:
- **ورک‌فلو**: فعال ✅
- **تریگر**: `invoice.created` با فیلتر `invoice_sales` ✅
- **فاکتورهای ایجاد شده**: ۵ فاکتور در ۲۴ ساعت اخیر ✅
- **اجرای ورک‌فلو**: ❌ هیچ‌کدام ورک‌فلو را تریگر نکرده‌اند
### علت ریشه‌ای:
در تابع `create_invoice` در فایل `invoice_service.py`، **هیچ فراخوانی به `trigger_workflows` وجود نداشت**.
در مقایسه، تابع `create_manual_document` این فراخوانی را دارد:
```python
# فراخوانی workflow triggers
try:
from app.services.workflow.workflow_trigger_service import trigger_document_created
trigger_document_created(...)
except Exception as e:
logger.warning(f"Failed to trigger workflows...")
```
---
## ✅ راه‌حل اعمال شده
### تغییرات کد:
در فایل `/var/www/ark/hesabixAPI/app/services/invoice_service.py` (خط ~1888)، **قبل از return**، کد زیر اضافه شد:
```python
# فراخوانی workflow triggers برای فاکتور ایجاد شده
try:
from app.services.workflow.workflow_trigger_service import trigger_invoice_created
trigger_invoice_created(
db=db,
business_id=business_id,
invoice_id=document.id,
invoice_type=invoice_type,
total_amount=float(total_with_tax),
user_id=user_id
)
except Exception as e:
# عدم موفقیت در trigger نباید مانع بازگشت فاکتور شود
logger.warning(f"Failed to trigger workflows for invoice {document.id}: {e}")
```
### چه اتفاقی می‌افتد:
1. فاکتور ایجاد می‌شود و در دیتابیس commit می‌شود
2. تابع `trigger_invoice_created` فراخوانی می‌شود
3. این تابع:
- نوع تریگر را تشخیص می‌دهد (`invoice.sales.created` برای فروش، `invoice.purchase.created` برای خرید، یا `invoice.created` به صورت عمومی)
- تمام ورک‌فلوهای فعال با تریگر مطابق را پیدا می‌کند
- هر ورک‌فلو را اجرا می‌کند
4. اگر خطایی رخ دهد، فقط لاگ می‌شود و فاکتور به درستی برگشت داده می‌شود
---
## 🧪 تست
### قبل از تغییر:
```
📄 فاکتورهای ایجاد شده: 5
📊 اجراهای ورک‌فلو: 0 ❌
```
### بعد از تغییر (انتظار می‌رود):
```
📄 یک فاکتور جدید ایجاد کنید
📊 ورک‌فلو به صورت خودکار اجرا می‌شود ✅
📨 پیام تلگرام ارسال می‌شود ✅
```
---
## 🚀 مراحل بعدی
### 1. ری‌استارت سرور API:
```bash
# اگر از systemd استفاده می‌کنید:
sudo systemctl restart hesabix-api
# یا اگر از Docker استفاده می‌کنید:
docker-compose restart api
```
### 2. تست ورک‌فلو:
1. وارد سیستم شوید (Business ID: 51)
2. یک فاکتور فروش جدید ایجاد کنید
3. بررسی کنید که:
- ورک‌فلو اجرا شده (از بخش اتوماسیون‌ها > لاگ‌ها)
- پیام تلگرام ارسال شده
### 3. بررسی لاگ‌ها:
```bash
# بررسی لاگ‌های API
tail -f /var/log/hesabix/api.log | grep -i workflow
# یا اگر از Docker استفاده می‌کنید:
docker-compose logs -f api | grep -i workflow
```
---
## 📊 انواع تریگرهای فاکتور
تابع `trigger_invoice_created` از منطق زیر برای تشخیص نوع تریگر استفاده می‌کند:
```python
if invoice_type in ["invoice_sales", "sales"]:
trigger_type = "invoice.sales.created"
elif invoice_type in ["invoice_purchase", "purchase"]:
trigger_type = "invoice.purchase.created"
else:
trigger_type = "invoice.created"
```
### تریگرهای موجود:
- `invoice.created` - تمام فاکتورها
- `invoice.sales.created` - فقط فاکتورهای فروش
- `invoice.purchase.created` - فقط فاکتورهای خرید
### فیلترهای اضافی (در config تریگر):
- `invoice_type` - فیلتر بر اساس نوع دقیق فاکتور
- `min_amount` - حداقل مبلغ
- `max_amount` - حداکثر مبلغ
- `person_type` - نوع طرف حساب (حقیقی/حقوقی)
- `include_tax_details` - شامل جزئیات مالیاتی
- `include_payment_status` - شامل وضعیت پرداخت
---
## ✅ خلاصه
| مورد | قبل | بعد |
|------|-----|-----|
| فراخوانی trigger | ❌ | ✅ |
| اجرای خودکار ورک‌فلو | ❌ | ✅ |
| ارسال پیام تلگرام | ❌ | ✅ |
| سایر اکشن‌ها | ❌ | ✅ |
---
## 🔍 نکات مهم
1. **این تغییر فقط برای فاکتورهای جدید است**
- فاکتورهای قبلی (که قبل از این تغییر ایجاد شده‌اند) ورک‌فلو را تریگر نمی‌کنند
2. **عدم موفقیت در trigger نباید مانع ایجاد فاکتور شود**
- اگر خطایی در ورک‌فلو رخ دهد، فقط لاگ می‌شود
- فاکتور به درستی ایجاد و برگشت داده می‌شود
3. **Performance**
- فراخوانی trigger در یک try-except است
- به صورت async اجرا نمی‌شود (در همان request)
- اگر ورک‌فلوهای زیادی دارید، ممکن است response time کمی افزایش یابد
4. **Logging**
- همه اجراهای ورک‌فلو در جدول `workflow_executions` ثبت می‌شوند
- لاگ‌های جزئی در جدول `workflow_logs` ثبت می‌شوند
- خطاها در لاگ API نیز ثبت می‌شوند
---
**تاریخ**: 2025-12-04
**نسخه**: 1.0
**وضعیت**: ✅ تکمیل شده - نیاز به ری‌استارت API