# رفع مشکل کدهای تکراری حسابداری ## مشکل سیستم حسابداری گاهی اوقات کدهای تکراری به اسناد می‌داد که باعث خطا در سیستم می‌شد. این مشکل به دلایل زیر رخ می‌داد: 1. **عدم بررسی تکراری بودن کد**: متد `getAccountingCode` کد جدیدی تولید می‌کرد بدون بررسی تکراری بودن 2. **Race Condition**: در صورت ارسال چندین درخواست همزمان، کدهای یکسانی تولید می‌شد 3. **عدم استفاده از تراکنش**: عملیات بدون تراکنش انجام می‌شد ## راه‌حل‌های پیاده‌سازی شده ### 1. بهبود متد `getAccountingCode` در `Provider.php` #### تغییرات: - **استفاده از تراکنش دیتابیس**: برای جلوگیری از Race Condition - **بررسی تکراری بودن کد**: قبل از ذخیره، بررسی می‌شود که کد قبلاً وجود نداشته باشد - **Retry Logic**: در صورت تکراری بودن، تا 10 بار تلاش می‌کند - **Timestamp Fallback**: در صورت عدم موفقیت، از timestamp استفاده می‌کند #### کد جدید: ```php 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**: ترمیم کدهای تکراری موجود ## نحوه استفاده ### برای ترمیم کدهای تکراری موجود: ```bash POST /api/accounting/fix-duplicate-codes Content-Type: application/json { "part": "accounting" } ``` ### پاسخ: ```json { "result": 1, "message": "5 کد تکراری ترمیم شد", "fixed_count": 5 } ``` ## مزایای راه‌حل 1. **جلوگیری از کدهای تکراری**: سیستم اکنون کدهای منحصر به فرد تولید می‌کند 2. **مدیریت Race Condition**: استفاده از تراکنش از تداخل عملیات جلوگیری می‌کند 3. **ترمیم خودکار**: در صورت بروز مشکل، سیستم خودکار کد جدید تولید می‌کند 4. **ابزار ترمیم**: امکان ترمیم کدهای تکراری موجود 5. **Backward Compatibility**: تغییرات بدون تأثیر بر عملکرد موجود ## نکات مهم 1. **فقط ادمین**: فقط کاربران ادمین می‌توانند کدهای تکراری را ترمیم کنند 2. **Backup**: قبل از اجرای ترمیم، از دیتابیس backup بگیرید 3. **تست**: تغییرات را در محیط تست بررسی کنید 4. **Monitoring**: عملکرد سیستم را پس از اعمال تغییرات نظارت کنید