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()