fix some bugs 3
This commit is contained in:
@@ -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');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user