From 356471c9f366cefd35aaa24e5212f14d9f642b02 Mon Sep 17 00:00:00 2001 From: adonis Date: Tue, 21 Jul 2026 21:31:16 +0330 Subject: [PATCH] fix some bugs 3 --- app/Services/PargarInboundWalletService.php | 70 ++++++++++++++++--- ...07_05_000002_create_pargar_integration.php | 2 +- ...lter_pargar_sync_logs_data_to_longtext.php | 26 +++++++ 3 files changed, 88 insertions(+), 10 deletions(-) create mode 100644 database/migrations/2026_07_21_000003_alter_pargar_sync_logs_data_to_longtext.php diff --git a/app/Services/PargarInboundWalletService.php b/app/Services/PargarInboundWalletService.php index 897c0c5..cdbe3b2 100644 --- a/app/Services/PargarInboundWalletService.php +++ b/app/Services/PargarInboundWalletService.php @@ -160,18 +160,70 @@ class PargarInboundWalletService } // حتی اگر همه skip شدند، دسته را مصرف‌شده علامت بزن تا دوباره نیاید - $data['wallet_batch_applied'] = true; - $data['wallet_batch_applied_at'] = now()->toDateTimeString(); - $batch->data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); - if (is_string($batch->desc) && ! str_contains($batch->desc, '[اعمال‌شده]')) { - $batch->desc = '[اعمال‌شده] '.$batch->desc; + // خطای ذخیره نباید کل sync را بشکند (mande باید بعداً اجرا شود) + try { + $this->markDocumentBatchApplied($batch, $data); + } catch (\Throwable $e) { + $result['errors'][] = 'علامت دسته #'.$batch->id.' ناموفق: '.$e->getMessage(); + Log::error('Pargar markDocumentBatchApplied failed', [ + 'log_id' => $batch->id, + 'customer_id' => $customer->id, + 'error' => $e->getMessage(), + ]); } - $batch->save(); } return $result; } + /** + * علامت مصرف دسته — بدون Pretty-Print؛ در صورت بزرگ بودن payload فشرده‌سازی می‌کند. + * + * @param array $data + */ + private function markDocumentBatchApplied(PargarSyncLog $batch, array $data): void + { + $data['wallet_batch_applied'] = true; + $data['wallet_batch_applied_at'] = now()->toDateTimeString(); + + if (is_string($batch->desc) && ! str_contains($batch->desc, '[اعمال‌شده]')) { + $batch->desc = mb_substr('[اعمال‌شده] '.$batch->desc, 0, 250); + } + + $encoded = json_encode($data, JSON_UNESCAPED_UNICODE); + if ($encoded === false) { + throw new \RuntimeException('json_encode failed for pargar batch #'.$batch->id); + } + + $batch->data = $encoded; + + try { + $batch->save(); + } catch (\Throwable $e) { + // ستون هنوز TEXT باشد یا payload خیلی بزرگ — stub کوچک تا دسته دوباره نیاید + $batch->data = $this->encodeAppliedBatchCompact($data); + $batch->save(); + } + } + + /** + * @param array $data + */ + private function encodeAppliedBatchCompact(array $data): string + { + $transactions = is_array($data['transactions'] ?? null) ? $data['transactions'] : []; + + return (string) json_encode([ + 'accountName' => $data['accountName'] ?? null, + 'accountId' => $data['accountId'] ?? null, + 'transactions_count' => count($transactions), + 'transactions_fp' => hash('sha256', (string) json_encode($transactions, JSON_UNESCAPED_UNICODE)), + 'wallet_batch_applied' => true, + 'wallet_batch_applied_at' => $data['wallet_batch_applied_at'] ?? now()->toDateTimeString(), + 'payload_compacted' => true, + ], JSON_UNESCAPED_UNICODE); + } + /** * @param array $tx * @return 'applied'|'skipped'|string error @@ -256,7 +308,7 @@ class PargarInboundWalletService if (abs($goldDiff) < 0.01 && abs($rialDiff) < 1) { $data['wallet_applied_from_mande'] = true; - $log->data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + $log->data = json_encode($data, JSON_UNESCAPED_UNICODE); $log->save(); return ['applied' => false, 'message' => 'مانده با پرگار یکسان است']; @@ -287,7 +339,7 @@ class PargarInboundWalletService $data['applied_gold_delta'] = $goldDiff; $data['applied_rial_delta'] = $rialDiff; $data['applied_at'] = now()->toDateTimeString(); - $log->data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); + $log->data = json_encode($data, JSON_UNESCAPED_UNICODE); $log->desc = 'اعمال ماندهٔ پرگار روی کیف اپ'; $log->save(); @@ -368,7 +420,7 @@ class PargarInboundWalletService 'skip_reason' => $skipReason, 'gold_delta' => $goldDelta, 'rial_delta' => $rialDelta, - ], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), + ], JSON_UNESCAPED_UNICODE), ]); } diff --git a/database/migrations/2026_07_05_000002_create_pargar_integration.php b/database/migrations/2026_07_05_000002_create_pargar_integration.php index 7ad7f0d..ddfb0a4 100644 --- a/database/migrations/2026_07_05_000002_create_pargar_integration.php +++ b/database/migrations/2026_07_05_000002_create_pargar_integration.php @@ -34,7 +34,7 @@ return new class extends Migration $table->text('sync_log')->nullable(); $table->string('pargar_ref')->nullable(); $table->text('res')->nullable(); - $table->text('data')->nullable(); + $table->longText('data')->nullable(); $table->timestamps(); }); } diff --git a/database/migrations/2026_07_21_000003_alter_pargar_sync_logs_data_to_longtext.php b/database/migrations/2026_07_21_000003_alter_pargar_sync_logs_data_to_longtext.php new file mode 100644 index 0000000..097917e --- /dev/null +++ b/database/migrations/2026_07_21_000003_alter_pargar_sync_logs_data_to_longtext.php @@ -0,0 +1,26 @@ +