119 lines
4.7 KiB
Markdown
119 lines
4.7 KiB
Markdown
|
|
# رفع مشکل کدهای تکراری حسابداری
|
||
|
|
|
||
|
|
## مشکل
|
||
|
|
سیستم حسابداری گاهی اوقات کدهای تکراری به اسناد میداد که باعث خطا در سیستم میشد. این مشکل به دلایل زیر رخ میداد:
|
||
|
|
|
||
|
|
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**: عملکرد سیستم را پس از اعمال تغییرات نظارت کنید
|