fix(zarin): post rial wallet docs as cash via payment, not pooli buy-fi
Zarin kind=payment creates type 55 cash-only rows; it needs zarin_idbank as the counterpart account. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -171,6 +171,12 @@ class ZarinController extends Controller
|
|||||||
return $nameG !== '' ? $nameG : 'مشتری نقدی (خریدار)';
|
return $nameG !== '' ? $nameG : 'مشتری نقدی (خریدار)';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** کد حساب بانک/صندوق زرین برای kind=payment (وجه نقد) */
|
||||||
|
private function zarinIdBank(): int
|
||||||
|
{
|
||||||
|
return (int) preg_replace('/\D+/', '', (string) $this->Config('zarin_idbank'));
|
||||||
|
}
|
||||||
|
|
||||||
/** آیا درخواست لیست زرین را خواسته؟ (query/body/header؛ مقاوم به QUERY_STRING خالی) */
|
/** آیا درخواست لیست زرین را خواسته؟ (query/body/header؛ مقاوم به QUERY_STRING خالی) */
|
||||||
private function requestWantsZarinList(Request $request): bool
|
private function requestWantsZarinList(Request $request): bool
|
||||||
{
|
{
|
||||||
@@ -2066,28 +2072,31 @@ class ZarinController extends Controller
|
|||||||
$isWithdraw = (int) ($data['direction'] ?? 0) === 1;
|
$isWithdraw = (int) ($data['direction'] ?? 0) === 1;
|
||||||
$uidSource = $data['withdraw_id'] ?? $zarin->id;
|
$uidSource = $data['withdraw_id'] ?? $zarin->id;
|
||||||
|
|
||||||
// kind=pooli فی خالی را با HTTP 400 «ERROR: fi is empty» رد میکند و فی باید در ۲۵٪ مظنه روز باشد.
|
// kind=payment = نوع ۵۵ «وجه نقد» (فقط ریال). id دریافت میکند، idbank پرداخت میکند.
|
||||||
// نتیجه همیشه نوع ۵۳ «پولی(خرید و فروش)» / عنوان «خرید فی» است (تبدیل ریال به گرم). نوع ۵۵ «وجه نقد» در API این پنل در دسترس نیست.
|
$idBank = $this->zarinIdBank();
|
||||||
$prices = $this->lastPriceData();
|
if ($idBank <= 0) {
|
||||||
$mazaneh = $isWithdraw ? (int) ($prices['sell'] ?? 0) : (int) ($prices['buy'] ?? 0);
|
$this->sync()->markFailed($zarin, null, 'کد حساب بانک زرین (zarin_idbank) تنظیم نشده');
|
||||||
if ($mazaneh <= 0) {
|
return 'کد حساب بانک زرین تنظیم نشده است. zarin_idbank را در تنظیمات بگذارید.';
|
||||||
$this->sync()->markFailed($zarin, null, 'مظنه برای سند ریالی زرین در دسترس نیست');
|
}
|
||||||
return 'مظنه برای سند ریالی زرین در دسترس نیست.';
|
|
||||||
|
$customerCode = (int) $customer->moshtari_code;
|
||||||
|
if ($customerCode <= 0) {
|
||||||
|
$this->sync()->markFailed($zarin, null, 'کد حساب زرین مشتری نامعتبر است');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ($customerCode === $idBank) {
|
||||||
|
$this->sync()->markFailed($zarin, null, 'zarin_idbank نباید با کد مشتری یکی باشد');
|
||||||
|
return 'کد حساب بانک زرین با کد مشتری یکی است.';
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$http = $this->zarinRequest([
|
$http = $this->zarinRequest([
|
||||||
'kind' => 'pooli',
|
'kind' => 'payment',
|
||||||
'radif' => 1,
|
'id' => $isWithdraw ? $idBank : $customerCode,
|
||||||
'korf' => $isWithdraw ? 'f' : 'k',
|
'idbank' => $isWithdraw ? $customerCode : $idBank,
|
||||||
'poolorvazn' => 'pool',
|
'mablagh' => (string) (int) abs((float) $data['value']),
|
||||||
'meghdar' => $data['value'],
|
|
||||||
'fi' => $mazaneh,
|
|
||||||
'hesab' => $customer->moshtari_code,
|
|
||||||
'sharh' => $sharh,
|
'sharh' => $sharh,
|
||||||
'ayar' => '750',
|
'movaghat' => '0',
|
||||||
'movaghat' => '',
|
|
||||||
'idFactor' => '',
|
|
||||||
'uid' => $this->zarinUid('20', $uidSource),
|
'uid' => $this->zarinUid('20', $uidSource),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class ZarinSyncService
|
|||||||
|
|
||||||
private function hasNumericIdKey(array $row): bool
|
private function hasNumericIdKey(array $row): bool
|
||||||
{
|
{
|
||||||
foreach (['idFactor', 'idSanad', 'pkRadifSanad', 'idHesab', 'OK'] as $key) {
|
foreach (['idFactor', 'idSanad', 'pkRadifSanad', 'idHesab', 'OK', 'shomareSanad'] as $key) {
|
||||||
if (! array_key_exists($key, $row)) {
|
if (! array_key_exists($key, $row)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -70,6 +70,7 @@ class ZarinSyncService
|
|||||||
?? $flat['idFactor']
|
?? $flat['idFactor']
|
||||||
?? $flat['idSanad']
|
?? $flat['idSanad']
|
||||||
?? $flat['pkRadifSanad']
|
?? $flat['pkRadifSanad']
|
||||||
|
?? $flat['shomareSanad']
|
||||||
?? $flat['idHesab']
|
?? $flat['idHesab']
|
||||||
?? null;
|
?? null;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* کد حساب بانک/صندوق زرین برای سند وجه نقد (kind=payment).
|
||||||
|
* value ردیف موجود را تغییر نمیدهد.
|
||||||
|
*/
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
$key = 'zarin_idbank';
|
||||||
|
$meta = [
|
||||||
|
'title_fa' => 'کد حساب بانک زرین',
|
||||||
|
'description' => 'کد حساب بانک یا صندوق در زرین (idbank) برای واریز/برداشت ریالی کیف. سند نوع وجه نقد است، نه خرید فی. از لیست حسابهای زرین همان کد عددی را بگذارید.',
|
||||||
|
'type' => 'number',
|
||||||
|
];
|
||||||
|
|
||||||
|
$exists = DB::table('settings')->where('key', $key)->exists();
|
||||||
|
if (! $exists) {
|
||||||
|
DB::table('settings')->insert([
|
||||||
|
'key' => $key,
|
||||||
|
'value' => '',
|
||||||
|
'title_fa' => $meta['title_fa'],
|
||||||
|
'can_edit' => 0,
|
||||||
|
'is_active' => 1,
|
||||||
|
'description' => $meta['description'],
|
||||||
|
'type' => $meta['type'],
|
||||||
|
]);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB::table('settings')->where('key', $key)->update([
|
||||||
|
'title_fa' => $meta['title_fa'],
|
||||||
|
'description' => $meta['description'],
|
||||||
|
'type' => $meta['type'],
|
||||||
|
'can_edit' => 0,
|
||||||
|
'is_active' => 1,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
// کلید را حذف نمیکنیم
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -709,6 +709,11 @@ WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'referral_limit' LIMIT
|
|||||||
-- SELECT 'zarin_uid_prefix', '', 'پیشوند عددی uid زرین', 0, 1, 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.', 'text'
|
-- SELECT 'zarin_uid_prefix', '', 'پیشوند عددی uid زرین', 0, 1, 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.', 'text'
|
||||||
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_uid_prefix' LIMIT 1);
|
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_uid_prefix' LIMIT 1);
|
||||||
|
|
||||||
|
-- [super-admin can_edit=0]
|
||||||
|
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||||
|
-- SELECT 'zarin_idbank', '', 'کد حساب بانک زرین', 0, 1, 'کد حساب بانک یا صندوق در زرین (idbank وبسرویس payment) برای واریز/برداشت ریالی کیف. سند نوع وجه نقد است نه خرید فی.', 'number'
|
||||||
|
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_idbank' LIMIT 1);
|
||||||
|
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
|
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
|
||||||
-- SELECT 'send_to_pargar', 'false', 'ارسال به پرگار (قدیمی)', 0, 0, NULL
|
-- SELECT 'send_to_pargar', 'false', 'ارسال به پرگار (قدیمی)', 0, 0, NULL
|
||||||
@@ -2398,7 +2403,7 @@ WHERE `key` = 'deposit_method_shetab';
|
|||||||
-- UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
-- UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
||||||
-- 'accounting_provider',
|
-- 'accounting_provider',
|
||||||
-- 'tahesab_host', 'tahesab_port', 'tahesab_token', 'tahesab_db', 'tahesab_bank_account',
|
-- 'tahesab_host', 'tahesab_port', 'tahesab_token', 'tahesab_db', 'tahesab_bank_account',
|
||||||
-- 'zarin_api', 'zarin_token', 'zarin_noe_kar', 'zarin_noe_kar_tedadi', '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', 'zarin_idbank',
|
||||||
-- 'pargar_username', 'pargar_password', 'pargar_api_token',
|
-- 'pargar_username', 'pargar_password', 'pargar_api_token',
|
||||||
-- 'pargar_item_id_rial', 'pargar_item_id_gold'
|
-- 'pargar_item_id_rial', 'pargar_item_id_gold'
|
||||||
-- );
|
-- );
|
||||||
@@ -2407,7 +2412,7 @@ WHERE `key` = 'deposit_method_shetab';
|
|||||||
-- [super-admin can_edit=0 sync]
|
-- [super-admin can_edit=0 sync]
|
||||||
-- 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` = 'text', `can_edit` = 0 WHERE `key` IN ('zarin_api', 'zarin_token', 'zarin_name_g', 'zarin_uid_prefix');
|
||||||
-- [super-admin can_edit=0 sync]
|
-- [super-admin can_edit=0 sync]
|
||||||
-- UPDATE `settings` SET `type` = 'number', `can_edit` = 0 WHERE `key` IN ('zarin_noe_kar', 'zarin_noe_kar_tedadi', 'zarin_gorohe_kar');
|
-- UPDATE `settings` SET `type` = 'number', `can_edit` = 0 WHERE `key` IN ('zarin_noe_kar', 'zarin_noe_kar_tedadi', 'zarin_gorohe_kar', 'zarin_idbank');
|
||||||
|
|
||||||
-- درگاه شارژ آنلاین (Montify) — متادیتا + can_edit=0 (value دست نخورده)
|
-- درگاه شارژ آنلاین (Montify) — متادیتا + can_edit=0 (value دست نخورده)
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
@@ -2497,6 +2502,8 @@ WHERE `key` = 'deposit_method_shetab';
|
|||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
-- UPDATE `settings` SET `title_fa` = 'پیشوند عددی uid زرین', `type` = 'text', `description` = 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.' WHERE `key` = 'zarin_uid_prefix';
|
-- UPDATE `settings` SET `title_fa` = 'پیشوند عددی uid زرین', `type` = 'text', `description` = 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.' WHERE `key` = 'zarin_uid_prefix';
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
|
-- UPDATE `settings` SET `title_fa` = 'کد حساب بانک زرین', `type` = 'number', `description` = 'کد حساب بانک یا صندوق در زرین (idbank وبسرویس payment) برای واریز/برداشت ریالی کیف. سند نوع وجه نقد است نه خرید فی.' WHERE `key` = 'zarin_idbank';
|
||||||
|
-- [super-admin can_edit=0]
|
||||||
-- UPDATE `settings` SET `value` = 'pargar'
|
-- UPDATE `settings` SET `value` = 'pargar'
|
||||||
-- WHERE `key` = 'accounting_provider'
|
-- WHERE `key` = 'accounting_provider'
|
||||||
-- AND TRIM(COALESCE(`value`, '')) IN ('', 'none')
|
-- AND TRIM(COALESCE(`value`, '')) IN ('', 'none')
|
||||||
|
|||||||
@@ -592,6 +592,11 @@ WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'referral_limit' LIMIT
|
|||||||
-- SELECT 'zarin_uid_prefix', '', 'پیشوند عددی uid زرین', 0, 1, 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.', 'text'
|
-- SELECT 'zarin_uid_prefix', '', 'پیشوند عددی uid زرین', 0, 1, 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.', 'text'
|
||||||
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_uid_prefix' LIMIT 1);
|
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_uid_prefix' LIMIT 1);
|
||||||
|
|
||||||
|
-- [super-admin can_edit=0]
|
||||||
|
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`, `type`)
|
||||||
|
-- SELECT 'zarin_idbank', '', 'کد حساب بانک زرین', 0, 1, 'کد حساب بانک یا صندوق در زرین (idbank وبسرویس payment) برای واریز/برداشت ریالی کیف. سند نوع وجه نقد است نه خرید فی.', 'number'
|
||||||
|
-- WHERE NOT EXISTS (SELECT 1 FROM `settings` WHERE `key` = 'zarin_idbank' LIMIT 1);
|
||||||
|
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
|
-- INSERT INTO `settings` (`key`, `value`, `title_fa`, `can_edit`, `is_active`, `description`)
|
||||||
-- SELECT 'send_to_pargar', 'false', 'ارسال به پرگار (قدیمی)', 0, 0, NULL
|
-- SELECT 'send_to_pargar', 'false', 'ارسال به پرگار (قدیمی)', 0, 0, NULL
|
||||||
@@ -1723,7 +1728,7 @@ UPDATE `settings` SET `type` = 'number' WHERE `key` IN (
|
|||||||
-- UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
-- UPDATE `settings` SET `can_edit` = 0 WHERE `key` IN (
|
||||||
-- 'accounting_provider',
|
-- 'accounting_provider',
|
||||||
-- 'tahesab_host', 'tahesab_port', 'tahesab_token', 'tahesab_db', 'tahesab_bank_account',
|
-- '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_gorohe_kar', 'zarin_name_g', 'zarin_uid_prefix', 'zarin_idbank',
|
||||||
-- 'pargar_username', 'pargar_password', 'pargar_api_token'
|
-- 'pargar_username', 'pargar_password', 'pargar_api_token'
|
||||||
-- );
|
-- );
|
||||||
-- [super-admin can_edit=0 sync]
|
-- [super-admin can_edit=0 sync]
|
||||||
@@ -1731,7 +1736,7 @@ UPDATE `settings` SET `type` = 'number' WHERE `key` IN (
|
|||||||
-- [super-admin can_edit=0 sync]
|
-- [super-admin can_edit=0 sync]
|
||||||
-- 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` = 'text', `can_edit` = 0 WHERE `key` IN ('zarin_api', 'zarin_token', 'zarin_name_g', 'zarin_uid_prefix');
|
||||||
-- [super-admin can_edit=0 sync]
|
-- [super-admin can_edit=0 sync]
|
||||||
-- 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_gorohe_kar', 'zarin_idbank');
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
-- UPDATE `settings` SET `title_fa` = 'سیستم حسابداری', `type` = 'select', `description` = 'none,pargar,tahesab,zarin'
|
-- UPDATE `settings` SET `title_fa` = 'سیستم حسابداری', `type` = 'select', `description` = 'none,pargar,tahesab,zarin'
|
||||||
-- WHERE `key` = 'accounting_provider';
|
-- WHERE `key` = 'accounting_provider';
|
||||||
@@ -1753,6 +1758,8 @@ UPDATE `settings` SET `type` = 'number' WHERE `key` IN (
|
|||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
-- UPDATE `settings` SET `title_fa` = 'پیشوند عددی uid زرین', `type` = 'text', `description` = 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.' WHERE `key` = 'zarin_uid_prefix';
|
-- UPDATE `settings` SET `title_fa` = 'پیشوند عددی uid زرین', `type` = 'text', `description` = 'فقط عدد. وقتی چند پنل یک زرین دارند باید متفاوت باشد تا uid تکراری نشود.' WHERE `key` = 'zarin_uid_prefix';
|
||||||
-- [super-admin can_edit=0]
|
-- [super-admin can_edit=0]
|
||||||
|
-- UPDATE `settings` SET `title_fa` = 'کد حساب بانک زرین', `type` = 'number', `description` = 'کد حساب بانک یا صندوق در زرین (idbank وبسرویس payment) برای واریز/برداشت ریالی کیف. سند نوع وجه نقد است نه خرید فی.' WHERE `key` = 'zarin_idbank';
|
||||||
|
-- [super-admin can_edit=0]
|
||||||
-- UPDATE `settings` SET `value` = 'pargar'
|
-- UPDATE `settings` SET `value` = 'pargar'
|
||||||
-- WHERE `key` = 'accounting_provider'
|
-- WHERE `key` = 'accounting_provider'
|
||||||
-- AND TRIM(COALESCE(`value`, '')) IN ('', 'none')
|
-- AND TRIM(COALESCE(`value`, '')) IN ('', 'none')
|
||||||
|
|||||||
Reference in New Issue
Block a user