hesabixCore/docs/DUPLICATE_CODE_FIX.md

4.7 KiB

رفع مشکل کدهای تکراری حسابداری

مشکل

سیستم حسابداری گاهی اوقات کدهای تکراری به اسناد می‌داد که باعث خطا در سیستم می‌شد. این مشکل به دلایل زیر رخ می‌داد:

  1. عدم بررسی تکراری بودن کد: متد getAccountingCode کد جدیدی تولید می‌کرد بدون بررسی تکراری بودن
  2. Race Condition: در صورت ارسال چندین درخواست همزمان، کدهای یکسانی تولید می‌شد
  3. عدم استفاده از تراکنش: عملیات بدون تراکنش انجام می‌شد

راه‌حل‌های پیاده‌سازی شده

1. بهبود متد getAccountingCode در Provider.php

تغییرات:

  • استفاده از تراکنش دیتابیس: برای جلوگیری از Race Condition
  • بررسی تکراری بودن کد: قبل از ذخیره، بررسی می‌شود که کد قبلاً وجود نداشته باشد
  • Retry Logic: در صورت تکراری بودن، تا 10 بار تلاش می‌کند
  • Timestamp Fallback: در صورت عدم موفقیت، از timestamp استفاده می‌کند

کد جدید:

public function getAccountingCode($bid, $part)
{
    $maxRetries = 10;
    $retryCount = 0;
    
    do {
        $retryCount++;
        $this->entityManager->beginTransaction();
        
        try {
            // تولید کد جدید
            $newCode = intval($count) + 1;
            
            // بررسی تکراری بودن
            $isDuplicate = $this->checkCodeDuplicate($bid, $part, $newCode);
            
            if (!$isDuplicate) {
                // کد منحصر به فرد است
                $business->{$setter}($newCode);
                $this->entityManager->persist($business);
                $this->entityManager->flush();
                $this->entityManager->commit();
                return $newCode;
            } else {
                // کد تکراری است، دوباره تلاش کن
                if ($retryCount >= $maxRetries) {
                    $timestampCode = $this->generateTimestampCode($bid, $part);
                    return $timestampCode;
                }
            }
        } catch (\Exception $e) {
            $this->entityManager->rollback();
            throw $e;
        }
    } while (true);
}

2. بهبود متد app_accounting_insert در HesabdariController.php

تغییرات:

  • استفاده از تراکنش: کل عملیات در یک تراکنش انجام می‌شود
  • مدیریت خطا: در صورت بروز خطا، تراکنش rollback می‌شود
  • بررسی خطای تولید کد: خطاهای احتمالی در تولید کد مدیریت می‌شود

3. متدهای کمکی جدید

checkCodeDuplicate():

بررسی تکراری بودن کد در جدول مربوطه

generateTimestampCode():

تولید کد منحصر به فرد با استفاده از timestamp

fixDuplicateCodes():

ترمیم کدهای تکراری موجود در دیتابیس

4. API جدید برای ترمیم کدهای تکراری

Endpoint: /api/accounting/fix-duplicate-codes

  • Method: POST
  • Access: فقط ادمین
  • Function: ترمیم کدهای تکراری موجود

نحوه استفاده

برای ترمیم کدهای تکراری موجود:

POST /api/accounting/fix-duplicate-codes
Content-Type: application/json

{
    "part": "accounting"
}

پاسخ:

{
    "result": 1,
    "message": "5 کد تکراری ترمیم شد",
    "fixed_count": 5
}

مزایای راه‌حل

  1. جلوگیری از کدهای تکراری: سیستم اکنون کدهای منحصر به فرد تولید می‌کند
  2. مدیریت Race Condition: استفاده از تراکنش از تداخل عملیات جلوگیری می‌کند
  3. ترمیم خودکار: در صورت بروز مشکل، سیستم خودکار کد جدید تولید می‌کند
  4. ابزار ترمیم: امکان ترمیم کدهای تکراری موجود
  5. Backward Compatibility: تغییرات بدون تأثیر بر عملکرد موجود

نکات مهم

  1. فقط ادمین: فقط کاربران ادمین می‌توانند کدهای تکراری را ترمیم کنند
  2. Backup: قبل از اجرای ترمیم، از دیتابیس backup بگیرید
  3. تست: تغییرات را در محیط تست بررسی کنید
  4. Monitoring: عملکرد سیستم را پس از اعمال تغییرات نظارت کنید