|null $payload */ public function recordCheckoutSession( ?User $user, ?CreditProduct $product, string $stripeCheckoutSessionId, PaymentTransactionStatus $status = PaymentTransactionStatus::PENDING, ?string $stripeEventId = null, ?string $stripeEventType = null, ?string $stripeCustomerId = null, ?string $stripePaymentIntentId = null, ?int $amount = null, ?string $currency = null, ?int $creditsExpected = null, ?int $creditsGranted = null, ?CreditLedgerEntry $ledgerEntry = null, ?string $invoiceUrl = null, ?string $invoicePdfUrl = null, ?string $errorMessage = null, ?array $payload = null, ): PaymentTransaction { return PaymentTransaction::query()->updateOrCreate([ 'stripe_checkout_session_id' => $stripeCheckoutSessionId, ], [ 'user_id' => $user?->getKey(), 'credit_product_id' => $product?->getKey(), 'credit_ledger_entry_id' => $ledgerEntry?->getKey(), 'type' => PaymentTransactionType::CHECKOUT, 'status' => $status, 'stripe_event_id' => $stripeEventId, 'stripe_event_type' => $stripeEventType, 'stripe_customer_id' => $stripeCustomerId, 'stripe_payment_intent_id' => $stripePaymentIntentId, 'amount' => $amount, 'currency' => $currency, 'credits_expected' => $creditsExpected ?? $product?->credits, 'credits_granted' => $creditsGranted ?? 0, 'invoice_url' => $invoiceUrl, 'invoice_pdf_url' => $invoicePdfUrl, 'error_message' => $errorMessage, 'payload' => $payload, 'processed_at' => $status === PaymentTransactionStatus::PENDING ? null : now(), ]); } /** * @param array|null $payload */ public function recordInvoice( ?User $user, ?CreditProduct $product, string $stripeInvoiceId, ?string $stripePriceId, PaymentTransactionStatus $status, ?string $stripeEventId = null, ?string $stripeEventType = null, ?string $stripeCustomerId = null, ?string $stripePaymentIntentId = null, ?string $stripeSubscriptionId = null, ?int $amount = null, ?string $currency = null, ?int $creditsExpected = null, ?int $creditsGranted = null, ?CreditLedgerEntry $ledgerEntry = null, ?string $invoiceUrl = null, ?string $invoicePdfUrl = null, ?string $errorMessage = null, ?array $payload = null, ): PaymentTransaction { return PaymentTransaction::query()->updateOrCreate([ 'stripe_invoice_id' => $stripeInvoiceId, 'stripe_price_id' => $stripePriceId, ], [ 'user_id' => $user?->getKey(), 'credit_product_id' => $product?->getKey(), 'credit_ledger_entry_id' => $ledgerEntry?->getKey(), 'type' => PaymentTransactionType::SUBSCRIPTION_INVOICE, 'status' => $status, 'stripe_event_id' => $stripeEventId, 'stripe_event_type' => $stripeEventType, 'stripe_customer_id' => $stripeCustomerId, 'stripe_payment_intent_id' => $stripePaymentIntentId, 'stripe_subscription_id' => $stripeSubscriptionId, 'amount' => $amount, 'currency' => $currency, 'credits_expected' => $creditsExpected ?? $product?->credits, 'credits_granted' => $creditsGranted ?? 0, 'invoice_url' => $invoiceUrl, 'invoice_pdf_url' => $invoicePdfUrl, 'error_message' => $errorMessage, 'payload' => $payload, 'processed_at' => now(), ]); } }