fix some bugs 3
This commit is contained in:
@@ -160,18 +160,70 @@ class PargarInboundWalletService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// حتی اگر همه skip شدند، دسته را مصرفشده علامت بزن تا دوباره نیاید
|
// حتی اگر همه skip شدند، دسته را مصرفشده علامت بزن تا دوباره نیاید
|
||||||
$data['wallet_batch_applied'] = true;
|
// خطای ذخیره نباید کل sync را بشکند (mande باید بعداً اجرا شود)
|
||||||
$data['wallet_batch_applied_at'] = now()->toDateTimeString();
|
try {
|
||||||
$batch->data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
|
$this->markDocumentBatchApplied($batch, $data);
|
||||||
if (is_string($batch->desc) && ! str_contains($batch->desc, '[اعمالشده]')) {
|
} catch (\Throwable $e) {
|
||||||
$batch->desc = '[اعمالشده] '.$batch->desc;
|
$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;
|
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
|
* @param array<string, mixed> $tx
|
||||||
* @return 'applied'|'skipped'|string error
|
* @return 'applied'|'skipped'|string error
|
||||||
@@ -256,7 +308,7 @@ class PargarInboundWalletService
|
|||||||
|
|
||||||
if (abs($goldDiff) < 0.01 && abs($rialDiff) < 1) {
|
if (abs($goldDiff) < 0.01 && abs($rialDiff) < 1) {
|
||||||
$data['wallet_applied_from_mande'] = true;
|
$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();
|
$log->save();
|
||||||
|
|
||||||
return ['applied' => false, 'message' => 'مانده با پرگار یکسان است'];
|
return ['applied' => false, 'message' => 'مانده با پرگار یکسان است'];
|
||||||
@@ -287,7 +339,7 @@ class PargarInboundWalletService
|
|||||||
$data['applied_gold_delta'] = $goldDiff;
|
$data['applied_gold_delta'] = $goldDiff;
|
||||||
$data['applied_rial_delta'] = $rialDiff;
|
$data['applied_rial_delta'] = $rialDiff;
|
||||||
$data['applied_at'] = now()->toDateTimeString();
|
$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->desc = 'اعمال ماندهٔ پرگار روی کیف اپ';
|
||||||
$log->save();
|
$log->save();
|
||||||
|
|
||||||
@@ -368,7 +420,7 @@ class PargarInboundWalletService
|
|||||||
'skip_reason' => $skipReason,
|
'skip_reason' => $skipReason,
|
||||||
'gold_delta' => $goldDelta,
|
'gold_delta' => $goldDelta,
|
||||||
'rial_delta' => $rialDelta,
|
'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->text('sync_log')->nullable();
|
||||||
$table->string('pargar_ref')->nullable();
|
$table->string('pargar_ref')->nullable();
|
||||||
$table->text('res')->nullable();
|
$table->text('res')->nullable();
|
||||||
$table->text('data')->nullable();
|
$table->longText('data')->nullable();
|
||||||
$table->timestamps();
|
$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