6.3 KiB
Executable file
6.3 KiB
Executable file
🔧 حل مشکل عدم اجرای ورکفلو هنگام ایجاد فاکتور
🎯 مشکل شناسایی شده
خلاصه:
زمانی که فاکتور فروش جدیدی ایجاد میشود، ورکفلو اجرا نمیشود حتی اگر ورکفلو فعال باشد و تریگر invoice.created داشته باشد.
جزئیات:
- ورکفلو: فعال ✅
- تریگر:
invoice.createdبا فیلترinvoice_sales✅ - فاکتورهای ایجاد شده: ۵ فاکتور در ۲۴ ساعت اخیر ✅
- اجرای ورکفلو: ❌ هیچکدام ورکفلو را تریگر نکردهاند
علت ریشهای:
در تابع create_invoice در فایل invoice_service.py، هیچ فراخوانی به trigger_workflows وجود نداشت.
در مقایسه، تابع create_manual_document این فراخوانی را دارد:
# فراخوانی 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، کد زیر اضافه شد:
# فراخوانی 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}")
چه اتفاقی میافتد:
- فاکتور ایجاد میشود و در دیتابیس commit میشود
- تابع
trigger_invoice_createdفراخوانی میشود - این تابع:
- نوع تریگر را تشخیص میدهد (
invoice.sales.createdبرای فروش،invoice.purchase.createdبرای خرید، یاinvoice.createdبه صورت عمومی) - تمام ورکفلوهای فعال با تریگر مطابق را پیدا میکند
- هر ورکفلو را اجرا میکند
- نوع تریگر را تشخیص میدهد (
- اگر خطایی رخ دهد، فقط لاگ میشود و فاکتور به درستی برگشت داده میشود
🧪 تست
قبل از تغییر:
📄 فاکتورهای ایجاد شده: 5
📊 اجراهای ورکفلو: 0 ❌
بعد از تغییر (انتظار میرود):
📄 یک فاکتور جدید ایجاد کنید
📊 ورکفلو به صورت خودکار اجرا میشود ✅
📨 پیام تلگرام ارسال میشود ✅
🚀 مراحل بعدی
1. ریاستارت سرور API:
# اگر از systemd استفاده میکنید:
sudo systemctl restart hesabix-api
# یا اگر از Docker استفاده میکنید:
docker-compose restart api
2. تست ورکفلو:
- وارد سیستم شوید (Business ID: 51)
- یک فاکتور فروش جدید ایجاد کنید
- بررسی کنید که:
- ورکفلو اجرا شده (از بخش اتوماسیونها > لاگها)
- پیام تلگرام ارسال شده
3. بررسی لاگها:
# بررسی لاگهای API
tail -f /var/log/hesabix/api.log | grep -i workflow
# یا اگر از Docker استفاده میکنید:
docker-compose logs -f api | grep -i workflow
📊 انواع تریگرهای فاکتور
تابع trigger_invoice_created از منطق زیر برای تشخیص نوع تریگر استفاده میکند:
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 | ❌ | ✅ |
| اجرای خودکار ورکفلو | ❌ | ✅ |
| ارسال پیام تلگرام | ❌ | ✅ |
| سایر اکشنها | ❌ | ✅ |
🔍 نکات مهم
-
این تغییر فقط برای فاکتورهای جدید است
- فاکتورهای قبلی (که قبل از این تغییر ایجاد شدهاند) ورکفلو را تریگر نمیکنند
-
عدم موفقیت در trigger نباید مانع ایجاد فاکتور شود
- اگر خطایی در ورکفلو رخ دهد، فقط لاگ میشود
- فاکتور به درستی ایجاد و برگشت داده میشود
-
Performance
- فراخوانی trigger در یک try-except است
- به صورت async اجرا نمیشود (در همان request)
- اگر ورکفلوهای زیادی دارید، ممکن است response time کمی افزایش یابد
-
Logging
- همه اجراهای ورکفلو در جدول
workflow_executionsثبت میشوند - لاگهای جزئی در جدول
workflow_logsثبت میشوند - خطاها در لاگ API نیز ثبت میشوند
- همه اجراهای ورکفلو در جدول
تاریخ: 2025-12-04 نسخه: 1.0 وضعیت: ✅ تکمیل شده - نیاز به ریاستارت API