hesabixCore/docs/DUPLICATE_CODE_FIX.md

119 lines
4.7 KiB
Markdown
Raw Normal View History

2025-08-28 15:46:28 +03:30
# رفع مشکل کدهای تکراری حسابداری
## مشکل
سیستم حسابداری گاهی اوقات کدهای تکراری به اسناد می‌داد که باعث خطا در سیستم می‌شد. این مشکل به دلایل زیر رخ می‌داد:
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**: عملکرد سیستم را پس از اعمال تغییرات نظارت کنید