Files
exchange-2.0/app/Console/Commands/LarkPushBookingTransactionsModuleCommand.php
T
2025-10-25 17:54:47 +08:00

122 lines
5.5 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\Booking;
use App\Models\BookingTransactions;
use App\Models\LarkPushed;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class LarkPushBookingTransactionsModuleCommand extends Command
{
protected $signature = 'lark:push-booking-transactions-module {--limit=10}';
protected $description = 'Send booking transactions records to a Lark webhook, one by one.';
public function handle(): int
{
$module = 'Booking Transactions';
$webhookId = config('services.lark.booking_transactions_webhook_id', env('LARK_BOOKING_TRANSACTIONS_WEBHOOK_ID'));
if (!$webhookId) {
$this->error('[Lark ' . $module . '] Missing LARK_BOOKING1_WEBHOOK_ID');
return self::FAILURE;
}
print_r(env('APP_ENV'));
$limit = (int) $this->option('limit');
$url = "https://hfbbr1an7s0.sg.larksuite.com/base/automation/webhook/event/{$webhookId}";
$statusM = ApprovalStatus::APPROVAL_STATUS_ID;
$transactionTypeM = TransactionType::ID_TO_NAME;
$bookingTransactions = BookingTransactions::query()
->whereNotExists(function ($q) {
$b = new BookingTransactions;
$q->selectRaw(1)
->from('lark_pushed')
->whereColumn('lark_pushed.owner_id', 'booking_transactions_view.transaction_id')
->where('lark_pushed.owner_type', $b->getMorphClass())
->where('lark_pushed.is_success', 1);
})
->limit($limit)
->get();
if ($bookingTransactions->isEmpty()) {
$this->warn('[Lark ' . $module . '] Nothing to push.');
return self::SUCCESS;
}
$this->info("[Lark " . $module . "] Pushing {$bookingTransactions->count()} record(s)...");
Log::info('[Lark ' . $module . '] Start', ['limit' => $limit, 'env' => app()->environment()]);
foreach ($bookingTransactions as $b) {
$payload = [
'transaction_id' => $b->transaction_id,
'transaction_type' => $transactionTypeM[$b->transaction_type],
'transaction_status' => $statusM[$b->transaction_status],
'transaction_bill_no' => $b->transaction_bill_no,
'transaction_currency_rate' => $b->transaction_currency_rate,
'transaction_service_charge' => $b->transaction_service_charge,
'transaction_currency_code' => $b->transaction_currency_code,
'transaction_amount' => $b->transaction_amount,
'transaction_original_currency_code' => $b->transaction_original_currency_code,
'transaction_original_amount' => $b->transaction_original_amount,
'booking_id' => $b->booking_id,
'booking_marking' => $b->booking_marking,
'company_name' => $b->company_name,
'company_reference' => $b->company_reference,
'service_name' => $b->service_name,
'currency_code' => $b->currency_code,
'booking_amount' => $b->booking_amount,
'transaction_created_at' => $b->transaction_created_at,
'transaction_updated_at' => $b->transaction_updated_at,
'need_e_invoice' => $b->need_e_invoice,
];
try {
$res = Http::asJson()->post($url, $payload);
$ok = $res->successful() && (int) data_get($res->json(), 'code', -1) === 0;
LarkPushed::create([
'owner_id' => $b->transaction_id,
'owner_type' => $b->getMorphClass(),
'is_success' => $ok ? 1 : 0,
]);
$trransactionTypeString = $transactionTypeM[$b->transaction_type];
if ($ok) {
$this->info("[Lark $module]: ✅ Sent: {$b->transaction_id} | {$trransactionTypeString}");
} else {
$this->error("[Lark $module] Failed {$b->transaction_id} | {$trransactionTypeString}: {$res->status()} {$res->body()}");
Log::error('[Lark ' . $module . '] Push failed', [
'transaction_id' => $b->transaction_id,
'status' => $res->status(),
'body' => $res->body(),
]);
}
} catch (\Throwable $e) {
LarkPushed::create([
'owner_id' => $b->transaction_id,
'owner_type' => $b->getMorphClass(),
'is_success' => 0,
]);
$this->error("[Lark $module]: ❌ Exception {$b->id} | {$b->marking}: {$e->getMessage()}");
Log::error('[Lark ' . $module . '] Exception', [
'transaction_id' => $b->transaction_id,
'exception' => $e->getMessage(),
]);
}
sleep(1);
}
$this->info("[Lark " . $module . "] Finished {$bookingTransactions->count()} record(s).");
Log::info('[Lark ' . $module . '] Finished', ['count' => $bookingTransactions->count()]);
return self::SUCCESS;
}
}