8.5 KiB
Executable file
بررسی ثبت چک در فاکتورها
خلاصه
در فاکتورها، چک به صورت غیرمستقیم ثبت میشود. یعنی:
- چک در بخش
paymentsفاکتور ثبت میشود - یک سند دریافت/پرداخت مرتبط با فاکتور ایجاد میشود
- چک در آن سند دریافت/پرداخت ثبت میشود
جریان ثبت چک در فاکتور
1. ثبت فاکتور (create_invoice)
- خط 1025-1124: ثبتهای حسابداری فاکتور (بدون چک)
- خط 1275-1380: اگر
paymentsموجود باشد، برای هر چک:- خط 1322-1329: بررسی وجود چک و تطابق ارز
- خط 1335-1347: ایجاد
account_lineبرای چک - خط 1373: فراخوانی
create_receipt_paymentبرای ایجاد سند دریافت/پرداخت
2. ایجاد سند دریافت/پرداخت مرتبط
- خط 1350: تعیین نوع سند بر اساس نوع فاکتور:
INVOICE_SALES,INVOICE_PURCHASE_RETURN→receipt- سایر انواع →
payment
- خط 1373: فراخوانی
create_receipt_paymentباaccount_linesشامل چک
سناریوهای مختلف
سناریو 1: فاکتور فروش + چک دریافتی ✅
جریان:
- چک دریافتی قبلاً ثبت شده (حساب 10403 بدهکار، حساب 10401 بستانکار)
- فاکتور فروش ثبت میشود:
- حساب 10401 (شخص) بدهکار میشود
- حساب درآمد بستانکار میشود
- سند دریافت ایجاد میشود:
- چک در
account_linesقرار میگیرد is_receipt = True- حساب 10403 (اسناد دریافتنی) بستانکار میشود ✅
- حساب 10401 (شخص) بستانکار میشود ✅
- وضعیت چک به
DEPOSITEDیاCLEAREDتغییر میکند ✅
- چک در
نتیجه: ✅ صحیح - تداخلی وجود ندارد
سناریو 2: فاکتور خرید + چک پرداختی ✅
جریان:
- چک پرداختی قبلاً ثبت شده (حساب 20201 بدهکار، حساب 20202 بستانکار)
- فاکتور خرید ثبت میشود:
- حساب 20201 (شخص) بستانکار میشود
- حساب هزینه بدهکار میشود
- سند پرداخت ایجاد میشود:
- چک در
account_linesقرار میگیرد is_receipt = False- حساب 20202 (اسناد پرداختنی) بدهکار میشود ✅
- حساب 20201 (شخص) بدهکار میشود ✅
- وضعیت چک به
CLEAREDتغییر میکند ✅
- چک در
نتیجه: ✅ صحیح - تداخلی وجود ندارد
سناریو 3: برگشت از فروش + چک دریافتی ✅
جریان:
- چک دریافتی قبلاً ثبت شده
- برگشت از فروش ثبت میشود:
- حساب 10401 (شخص) بستانکار میشود
- حساب برگشت از فروش بدهکار میشود
- سند دریافت ایجاد میشود:
- چک در
account_linesقرار میگیرد is_receipt = True- حساب 10403 (اسناد دریافتنی) بستانکار میشود ✅
- حساب 10401 (شخص) بستانکار میشود ✅
- چک در
نتیجه: ✅ صحیح - تداخلی وجود ندارد
سناریو 4: برگشت از خرید + چک پرداختی ✅
جریان:
- چک پرداختی قبلاً ثبت شده
- برگشت از خرید ثبت میشود:
- حساب 20201 (شخص) بدهکار میشود
- حساب برگشت از خرید بستانکار میشود
- سند پرداخت ایجاد میشود:
- چک در
account_linesقرار میگیرد is_receipt = False- حساب 20202 (اسناد پرداختنی) بدهکار میشود ✅
- حساب 20201 (شخص) بدهکار میشود ✅
- چک در
نتیجه: ✅ صحیح - تداخلی وجود ندارد
بررسی مشکلات احتمالی
مشکل 1: بررسی نوع چک ❓
موقعیت: invoice_service.py خط 1322-1329
- فقط وجود چک و تطابق ارز بررسی میشود
- نوع چک بررسی نمیشود!
- آیا باید چک دریافتی فقط در فاکتور فروش استفاده شود؟
- آیا باید چک پرداختی فقط در فاکتور خرید استفاده شود؟
مثال مشکل:
- چک دریافتی در فاکتور خرید استفاده میشود
is_receipt = False→ سند پرداخت ایجاد میشود- در
create_receipt_payment:ALLOWED_PAYMENT_CHECK_STATUSES = {TRANSFERRED_ISSUED} - چک دریافتی وضعیت
RECEIVED_ON_HANDدارد - validation رد میشود! ✅ (این مشکل نیست، سیستم جلوگیری میکند)
اما:
- اگر validation نباشد یا از validation عبور کند:
- چک دریافتی در سند پرداخت استفاده میشود
- حساب 20202 بدهکار میشود (اشتباه!)
- باید حساب 10403 بستانکار میشد
مشکل 2: بررسی وضعیت چک ❓
موقعیت: invoice_service.py خط 1322-1329
- فقط وجود چک بررسی میشود
- وضعیت چک بررسی نمیشود!
- آیا چک باید
RECEIVED_ON_HANDباشد؟ - آیا چک باید
TRANSFERRED_ISSUEDباشد؟
جواب:
- این بررسی در
create_receipt_paymentانجام میشود (خط 224) ALLOWED_RECEIPT_CHECK_STATUSES = {RECEIVED_ON_HAND}ALLOWED_PAYMENT_CHECK_STATUSES = {TRANSFERRED_ISSUED}- ✅ پس مشکل نیست
مشکل 3: تداخل با ثبت اولیه چک ❌
موقعیت: چک قبلاً در create_check ثبت شده
- خط 146: حساب 10403 بدهکار میشود (چک دریافتی)
- خط 147: حساب 10401 بستانکار میشود
در فاکتور فروش:
- خط 1035: حساب 10401 بدهکار میشود (فاکتور فروش)
- در سند دریافت مرتبط:
- حساب 10403 بستانکار میشود (چک خارج شد) ✅
- حساب 10401 بستانکار میشود (تسویه بدهی) ✅
نتیجه: ✅ تداخلی وجود ندارد - منطق صحیح است
خلاصه مشکلات
✅ چیزهایی که درست هستند:
- چک در سند دریافت/پرداخت مرتبط ثبت میشود (نه مستقیم در فاکتور)
- منطق حسابداری در
create_receipt_paymentدرست است - تغییر وضعیت چک انجام میشود
- validation وضعیت چک در
create_receipt_paymentانجام میشود
⚠️ مشکلات احتمالی:
1. عدم بررسی نوع چک در فاکتور (کم اهمیت)
مشکل: در invoice_service.py نوع چک بررسی نمیشود
راهحل: میتوان validation اضافه کرد که:
- چک دریافتی فقط در فاکتور فروش/برگشت از فروش استفاده شود
- چک پرداختی فقط در فاکتور خرید/برگشت از خرید استفاده شود
اما: این validation فعلاً در create_receipt_payment انجام میشود (از طریق وضعیت چک)
2. عدم validation مستقیم در فاکتور (کم اهمیت)
مشکل: اگر validation در create_receipt_payment شکست بخورد، خطا مبهم است
راهحل: میتوان validation را در create_invoice هم اضافه کرد
نتیجهگیری
وضعیت کلی: ✅ خوب
مشکلات اصلی که در اسناد دریافت/پرداخت و هزینه/درآمد وجود داشت، در فاکتورها وجود ندارد چون:
- چک به صورت مستقیم در فاکتور ثبت نمیشود
- منطق حسابداری از طریق
create_receipt_paymentانجام میشود که قبلاً اصلاح شده - تغییر وضعیت چک در
create_receipt_paymentانجام میشود
پیشنهادات بهبود (اختیاری):
- اضافه کردن validation نوع چک در
create_invoiceبرای خطای واضحتر - اضافه کردن validation وضعیت چک در
create_invoiceبرای خطای واضحتر
اما این تغییرات ضروری نیستند چون validation در create_receipt_payment انجام میشود.