hesabresi and desc transfer

This commit is contained in:
javad committed 2026-08-16 15:42:48 +03:30
1 parent e353ed6fc2
commit 16eb747b5c
7 files changed
+678 -78

No files matched your search

+91
View File
@@ -0,0 +1,91 @@
import os
import csv
import django
from django.db.models import Sum, Subquery, OuterRef, F, IntegerField
from django.db.models.functions import Coalesce
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'khatibi.settings') # myproject را تغییر دهید
django.setup()
from admin_panel.models import Article, Sarresid, Customer
def run_360_audit():
print("\n" + "="*70)
print(" 🔎 کالبدشکافی ۳۶۰ درجه سیستم مالی (ترازنامه دقیق)")
print("="*70 + "\n")
# ---------------------------------------------------------
# ۱. محاسبه تراز کل سیستم (پایه ریاضی)
# ---------------------------------------------------------
g_art = Article.objects.aggregate(d=Sum('debit'), c=Sum('credit'))
global_mande = (g_art['d'] or 0) - (g_art['c'] or 0)
g_sar = Sarresid.objects.filter(payStatus="false").aggregate(s=Sum('price'))['s'] or 0
global_diff = global_mande - g_sar
print(f"💰 تراز کل دفتر کل (mandehesab): {global_mande:15,} ریال")
print(f"📑 مجموع چک‌های دست شرکت: {g_sar:15,} ریال")
print(f"⚠️ کل اختلاف سیستم: {global_diff:15,} ریال\n")
# ---------------------------------------------------------
# ۲. اسکن پرسرعت تمام مشتریان
# ---------------------------------------------------------
sq_deb = Article.objects.filter(customer=OuterRef('pk')).values('customer').annotate(s=Sum('debit')).values('s')
sq_cre = Article.objects.filter(customer=OuterRef('pk')).values('customer').annotate(s=Sum('credit')).values('s')
sq_sar = Sarresid.objects.filter(customer=OuterRef('pk'), payStatus="false").values('customer').annotate(s=Sum('price')).values('s')
customers = Customer.objects.annotate(
net_debt=Coalesce(Subquery(sq_deb, output_field=IntegerField()), 0) - Coalesce(Subquery(sq_cre, output_field=IntegerField()), 0),
sarresid_total=Coalesce(Subquery(sq_sar, output_field=IntegerField()), 0),
).annotate(
diff=F('net_debt') - F('sarresid_total')
)
# ---------------------------------------------------------
# ۳. دسته‌بندی ریاضیاتی (Bucketing)
# ---------------------------------------------------------
cat1_risk = 0 # 🔴 گروه 1: بدهکارانی که کسر سند/چک دارند (بدهی رو هوا)
cat2_fake_check = 0 # 🟡 گروه 2: چک پاس نشده در سیستم بیشتر از بدهی است (خطای اپراتور)
cat3_advance = 0 # 🟢 گروه 3: پیش‌دریافت (مشتری بستانکار است و چکی ندارد)
cat4_advance_check = 0 # 🟣 گروه 4: عجیب‌ترین! مشتری هم بستانکار است، هم چک پاس‌نشده دارد!
print("📊 [ تفکیک دقیق اختلاف به ۴ گروه حسابداری ]")
print("-" * 70)
for c in customers:
d = c.diff
if d > 0:
cat1_risk += d
elif d < 0:
if c.net_debt >= 0:
cat2_fake_check += d
elif c.net_debt < 0 and c.sarresid_total == 0:
cat3_advance += d
elif c.net_debt < 0 and c.sarresid_total > 0:
cat4_advance_check += d
print(f"🔴 گروه 1 (کسری چک / بدهی خطرناک): {cat1_risk:+15,} ریال [باعث مثبت شدن اختلاف]")
print(f"🟡 گروه 2 (خطای ثبتی / چک اضافی): {cat2_fake_check:+15,} ریال [باعث منفی شدن اختلاف]")
print(f"🟢 گروه 3 (پیش‌دریافت / بستانکاری خالص): {cat3_advance:+15,} ریال [باعث منفی شدن اختلاف]")
print(f"🟣 گروه 4 (بستانکارانی که چک هم داده‌اند!): {cat4_advance_check:+15,} ریال [باعث منفی شدن اختلاف]")
print("-" * 70)
calculated_diff = cat1_risk + cat2_fake_check + cat3_advance + cat4_advance_check
print(f"🧮 جمع ریاضی هر 4 گروه بالا: {calculated_diff:15,} ریال")
if calculated_diff == global_diff:
print("✅ تطابق 100%: هیچ پولی گم نشده و محاسبات از نظر حسابداری کاملاً تراز است!")
else:
print(f"❌ هنوز {global_diff - calculated_diff:,} ریال اختلاف وجود دارد!")
# ---------------------------------------------------------
# ۴. استخراج اسامی عاملین اختلاف منفی ۱۱۱ میلیونی (گروه‌های ۳ و ۴)
# ---------------------------------------------------------
print("\n🔎 [ چه کسانی باعث آن 111 میلیون اختلاف منفی شده‌اند؟ (پیش‌دریافت‌ها) ]")
bostankar_qs = customers.filter(net_debt__lt=0).order_by('net_debt')[:10]
for c in bostankar_qs:
print(f" 👤 {c.name_family} | تراز: {c.net_debt:,} | چک در دست: {c.sarresid_total:,} | تاثیر در اختلاف: {c.diff:,}")
if __name__ == '__main__':
run_360_audit()