render($order); } public function returned(string $order): Response { return $this->render($order); } public function retry(Request $request, string $order, PaymentGatewayManager $gateways): RedirectResponse { $billingOrder = BillingOrder::withoutGlobalScope('tenant')->where('uuid', $order)->where('status', 'pending')->firstOrFail(); try { $driver = $gateways->driver($billingOrder->gateway); $methods = collect($driver->paymentMethods($billingOrder)); if ($methods->isNotEmpty()) { $data = $request->validate(['payment_method' => ['required', 'string']]); abort_unless($methods->contains('code', $data['payment_method']), 422, 'Kanal pembayaran tidak tersedia.'); $billingOrder->update(['payment_method' => $data['payment_method']]); } $billingOrder->update($driver->createCheckout($billingOrder->fresh())); $billingOrder->update(['metadata' => collect($billingOrder->metadata ?? [])->except('gateway_error')->all()]); } catch (Throwable $exception) { report($exception); return back()->withErrors(['payment' => str($exception->getMessage())->after(':')->trim()->toString() ?: 'Gateway pembayaran belum siap.']); } return redirect()->away($billingOrder->checkout_url); } private function render(string $uuid): Response { $order = BillingOrder::withoutGlobalScope('tenant')->where('uuid', $uuid)->firstOrFail(); $plan = config("billing.plans.{$order->plan_code}"); $methods = []; $gatewayError = null; if ($order->status === 'pending' && ! $order->checkout_url) { try { $methods = app(PaymentGatewayManager::class)->driver($order->gateway)->paymentMethods($order); } catch (Throwable $exception) { report($exception); $gatewayError = str($exception->getMessage())->after(':')->trim()->toString(); } } return Inertia::render('checkout/show', ['order' => [ 'uuid' => $order->uuid, 'plan' => $plan['name'], 'status' => $order->status, 'total' => $order->total, 'currency' => $order->currency, 'checkout_url' => $order->checkout_url, 'expires_at' => $order->expires_at?->toIso8601String(), 'gateway' => $order->gateway, 'payment_method' => $order->payment_method, 'payment_methods' => $methods, 'gateway_error' => $gatewayError, ]]); } }