fix some bugs 3

This commit is contained in:
2026-07-21 21:31:16 +03:30
parent 227534a493
commit 356471c9f3
3 changed files with 88 additions and 10 deletions
+61 -9
View File
@@ -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<string, mixed> $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<string, mixed> $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<string, mixed> $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),
]);
}
@@ -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();
});
}
@@ -0,0 +1,26 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
if (! Schema::hasTable('pargar_sync_logs') || ! Schema::hasColumn('pargar_sync_logs', 'data')) {
return;
}
DB::statement('ALTER TABLE `pargar_sync_logs` MODIFY COLUMN `data` LONGTEXT NULL');
}
public function down(): void
{
if (! Schema::hasTable('pargar_sync_logs') || ! Schema::hasColumn('pargar_sync_logs', 'data')) {
return;
}
DB::statement('ALTER TABLE `pargar_sync_logs` MODIFY COLUMN `data` TEXT NULL');
}
};