From 09716054ce71a0861a0ef08ac3027728c831a98c Mon Sep 17 00:00:00 2001 From: adonis Date: Tue, 28 Jul 2026 19:08:04 +0330 Subject: [PATCH] fix some bugs from accounting 6 --- .../Controllers/Admin/ZarinController.php | 53 ++++++++++++++++--- database/sql/deploy_settings_const.sql | 13 +++-- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/Admin/ZarinController.php b/app/Http/Controllers/Admin/ZarinController.php index e5fe693..8a51544 100644 --- a/app/Http/Controllers/Admin/ZarinController.php +++ b/app/Http/Controllers/Admin/ZarinController.php @@ -127,6 +127,32 @@ class ZarinController extends Controller return $value > 0 ? $value : 16; } + /** + * نوع کار برای سند تعدادی (sabtSanadTedadi). + * روی زرین aygin: 16=گرمی (رد می‌شود)، 17=سکه-تعدادی، 18=اجرت تعدادی. + */ + private function zarinCountNoeKar(): int + { + $tedadi = (int) $this->Config('zarin_noe_kar_tedadi'); + if (in_array($tedadi, [17, 18], true)) { + return $tedadi; + } + + $configured = $this->zarinDefaultNoeKar(); + if (in_array($configured, [17, 18], true)) { + return $configured; + } + + // 16 و سایر مقادیر گرمی/نامرتبط برای sabtSanadTedadi قابل استفاده نیستند + return 17; + } + + /** fkNoeهایی که sabtSanadTedadi قبول می‌کند */ + private function zarinCountFkNoes(): array + { + return ['17', '18']; + } + private function zarinDefaultGoroheKar() { $value = (int) $this->Config('zarin_gorohe_kar'); @@ -279,7 +305,7 @@ class ZarinController extends Controller $goroheKar = $goroheKar ?: $this->zarinDefaultGoroheKar(); $productName = $this->normalizeZarinName($product->title); - $fromList = $this->findZarinKarInListKarSakhte($productName, $exactOnly); + $fromList = $this->findZarinKarInListKarSakhte($productName, $exactOnly, true); if ($fromList) { return $fromList; } @@ -294,8 +320,9 @@ class ZarinController extends Controller /** * کاتالوگ کارهای ساخته (لیست ۴۷ زرین) — id همین idKar سند تعدادی است. + * برای سند تعدادی فقط fkNoe سکه-تعدادی/اجرت تعدادی (۱۷/۱۸) قبول می‌شود؛ گرمی(۱۶) رد. */ - private function findZarinKarInListKarSakhte(string $productName, bool $exactOnly = false): ?array + private function findZarinKarInListKarSakhte(string $productName, bool $exactOnly = false, bool $countDocOnly = true): ?array { $response = $this->zarinRequest([ 'kind' => 'listKarSakhte', @@ -310,6 +337,7 @@ class ZarinController extends Controller return null; } + $allowedFk = $this->zarinCountFkNoes(); $exact = null; $fuzzy = null; @@ -318,6 +346,11 @@ class ZarinController extends Controller continue; } + $fkNoe = (string) ($row['fkNoe'] ?? $row['fknoe'] ?? ''); + if ($countDocOnly && $fkNoe !== '' && !in_array($fkNoe, $allowedFk, true)) { + continue; + } + $name = $row['namFelezsakhthe'] ?? $row['nam_kar_sakhte'] ?? $row['nameKar'] @@ -336,6 +369,7 @@ class ZarinController extends Controller 'row' => $row, 'match' => 'exact', 'source' => 'listKarSakhte', + 'fkNoe' => $fkNoe, ]; break; } @@ -352,6 +386,7 @@ class ZarinController extends Controller 'row' => $row, 'match' => 'fuzzy', 'source' => 'listKarSakhte', + 'fkNoe' => $fkNoe, ]; } } @@ -602,7 +637,7 @@ class ZarinController extends Controller $params = [ 'kind' => 'addFelezsakhteModel', 'nameKar' => $product->title, - 'noeKar' => $this->zarinDefaultNoeKar(), + 'noeKar' => $this->zarinCountNoeKar(), 'gorooheKar' => $this->zarinDefaultGoroheKar(), ]; @@ -746,8 +781,14 @@ class ZarinController extends Controller ?? $existingRow['title'] ?? '' ); - // اگر idKar موجود مال کالای دیگری است (مثلاً شمش برای گوی) قبول نکن - if ($rowName !== '' && $productName !== '' && $rowName !== $productName) { + $idGp = (string) ($existingRow['idGp'] ?? $existingRow['idgp'] ?? $existingRow['fkNoe'] ?? ''); + $wrongType = $idGp !== '' && !in_array($idGp, $this->zarinCountFkNoes(), true); + + // اگر idKar موجود مال کالای دیگری است یا نوع گرمی است (نه تعدادی) قبول نکن + if ( + $wrongType + || ($rowName !== '' && $productName !== '' && $rowName !== $productName) + ) { $this->clearProductZarinKar($product); $product->refresh(); } else { @@ -1835,7 +1876,7 @@ class ZarinController extends Controller [$response, $httpError] = $this->zarinDecodeResponse($http); $diag = 'idKar=' . $idKar - . ' noeKar=' . $this->zarinDefaultNoeKar() + . ' noeKar=' . $this->zarinCountNoeKar() . ' goroheKar=' . $this->zarinDefaultGoroheKar() . ' product=' . ($product->title ?? '') . ' source=' . ($kar['source'] ?? ''); diff --git a/database/sql/deploy_settings_const.sql b/database/sql/deploy_settings_const.sql index 8741f1e..5d1019a 100644 --- a/database/sql/deploy_settings_const.sql +++ b/database/sql/deploy_settings_const.sql @@ -523,9 +523,13 @@ SELECT 'zarin_token', '', 'توکن زرین', 0, 1, 'توکن مکمل API زر WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_token' LIMIT 1); INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) -SELECT 'zarin_noe_kar', '16', 'نوع کار پیش‌فرض زرین', 0, 1, 'کد noeKar هنگام ساخت کار ساخته در زرین.', 'number' +SELECT 'zarin_noe_kar', '16', 'نوع کار پیش‌فرض زرین', 0, 1, 'کد noeKar هنگام ساخت کار ساخته در زرین. مقدار ۱۶ معمولاً گرمی است و برای sabtSanadTedadi مناسب نیست.', 'number' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_noe_kar' LIMIT 1); +INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) +SELECT 'zarin_noe_kar_tedadi', '17', 'نوع کار تعدادی زرین', 0, 1, 'noeKar برای سند تعدادی (سکه/شمش/گوی/مکعب). روی زرین معمولاً ۱۷=سکه-تعدادی یا ۱۸=اجرت تعدادی. اگر خالی/نامعتبر باشد کد از ۱۷ استفاده می‌کند.', 'number' +WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_noe_kar_tedadi' LIMIT 1); + INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`) SELECT 'zarin_gorohe_kar', '52', 'گروه کار پیش‌فرض زرین', 0, 1, 'کد gorooheKar هنگام ساخت/جستجوی کار در زرین. برای جداسازی چند پنل روی یک زرین، برای هر پنل مقدار متفاوت بگذارید.', 'number' WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_gorohe_kar' LIMIT 1); @@ -1744,19 +1748,20 @@ UPDATE `settings` SET `can_edit` = 0, `is_active` = 0 WHERE `key` IN ('send_to_t UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN ( 'accounting_provider', 'tahesab_host', 'tahesab_port', 'tahesab_token', 'tahesab_db', 'tahesab_bank_account', - 'zarin_api', 'zarin_token', 'zarin_noe_kar', 'zarin_gorohe_kar', 'zarin_name_g', 'zarin_uid_prefix', + 'zarin_api', 'zarin_token', 'zarin_noe_kar', 'zarin_noe_kar_tedadi', 'zarin_gorohe_kar', 'zarin_name_g', 'zarin_uid_prefix', 'pargar_username', 'pargar_password', 'pargar_api_token', 'pargar_item_id_rial', 'pargar_item_id_gold' ); UPDATE `settings` SET `can_edit` = 0, `is_active` = 1 WHERE `key` LIKE 'zarin_%'; UPDATE `settings` SET `type` = 'text', `can_edit` = 0 WHERE `key` IN ('zarin_api', 'zarin_token', 'zarin_name_g', 'zarin_uid_prefix'); -UPDATE `settings` SET `type` = 'number', `can_edit` = 0 WHERE `key` IN ('zarin_noe_kar', 'zarin_gorohe_kar'); +UPDATE `settings` SET `type` = 'number', `can_edit` = 0 WHERE `key` IN ('zarin_noe_kar', 'zarin_noe_kar_tedadi', 'zarin_gorohe_kar'); UPDATE `settings` SET `title_fa` = 'سیستم حسابداری', `type` = 'select', `description` = 'none,pargar,tahesab,zarin' WHERE `key` = 'accounting_provider'; UPDATE `settings` SET `description` = 'سیستم حسابداری: none=هیچکدام، pargar=API پرگار، tahesab=ارسال خودکار ته‌حساب، zarin=ارسال خودکار زرین.' WHERE `key` = 'accounting_provider'; UPDATE `settings` SET `title_fa` = 'آدرس API زرین', `description` = 'آدرس پایه وب‌سرویس زرین (بدون /ZarrinService/accounting).' WHERE `key` = 'zarin_api'; UPDATE `settings` SET `title_fa` = 'توکن زرین', `description` = 'توکن مکمل API زرین که در نرم‌افزار زرین تعریف می‌شود.' WHERE `key` = 'zarin_token'; -UPDATE `settings` SET `title_fa` = 'نوع کار پیش‌فرض زرین', `type` = 'number', `description` = 'کد noeKar هنگام ساخت کار ساخته در زرین.' WHERE `key` = 'zarin_noe_kar'; +UPDATE `settings` SET `title_fa` = 'نوع کار پیش‌فرض زرین', `type` = 'number', `description` = 'noeKar عمومی. مقدار ۱۶ معمولاً گرمی است و برای sabtSanadTedadi مناسب نیست؛ سند تعدادی از zarin_noe_kar_tedadi استفاده می‌کند.' WHERE `key` = 'zarin_noe_kar'; +UPDATE `settings` SET `title_fa` = 'نوع کار تعدادی زرین', `type` = 'number', `description` = 'noeKar برای سند تعدادی (سکه/شمش/گوی/مکعب). معمولاً ۱۷=سکه-تعدادی یا ۱۸=اجرت تعدادی.' WHERE `key` = 'zarin_noe_kar_tedadi'; UPDATE `settings` SET `title_fa` = 'گروه کار پیش‌فرض زرین', `type` = 'number', `description` = 'کد gorooheKar هنگام ساخت/جستجوی کار در زرین. برای جداسازی چند پنل روی یک زرین، برای هر پنل مقدار متفاوت بگذارید.' WHERE `key` = 'zarin_gorohe_kar'; UPDATE `settings` SET `title_fa` = 'نام گروه حساب مشتریان زرین', `type` = 'text', `description` = 'پارامتر nameG در addhesab — گروه حساب زرین. برای اپ خانگی: مشتری نقدی (خریدار) = گروه ۶. گروه همکار استفاده نشود (مظنه متفاوت است).' WHERE `key` = 'zarin_name_g'; -- فقط اگر خالی است، پیش‌فرض گروه ۶ را بگذار (value موجود دست نخورده)