Introduces a OneToOneField for carrier in the Refund model to support future integration and refactoring. Adds and updates TODO comments for email template usage, error handling in Stripe webhooks, and clarifies logic placement in Stripe models.
66 lines
2.2 KiB
Python
66 lines
2.2 KiB
Python
from django.db import models
|
|
from django.apps import apps
|
|
|
|
# Create your models here.
|
|
|
|
from .client import StripeClient
|
|
|
|
class StripeModel(models.Model):
|
|
class STATUS_CHOICES(models.TextChoices):
|
|
PENDING = "pending", "Čeká se na platbu"
|
|
PAID = "paid", "Zaplaceno"
|
|
FAILED = "failed", "Neúspěšné"
|
|
CANCELLED = "cancelled", "Zrušeno"
|
|
REFUNDING = "refunding", "Platba se vrací"
|
|
REFUNDED = "refunded", "Platba úspěšně vrácena"
|
|
|
|
status = models.CharField(max_length=20, choices=STATUS_CHOICES.choices, default=STATUS_CHOICES.PENDING)
|
|
|
|
stripe_session_id = models.CharField(max_length=255, blank=True, null=True)
|
|
stripe_payment_intent = models.CharField(max_length=255, blank=True, null=True)
|
|
stripe_session_url = models.URLField(blank=True, null=True)
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True, null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"Order {self.id} - {self.status}"
|
|
|
|
|
|
|
|
def save(self, *args, **kwargs):
|
|
#if new
|
|
if self.pk:
|
|
Order = apps.get_model('commerce', 'Order')
|
|
Payment = apps.get_model('commerce', 'Payment')
|
|
|
|
order = Order.objects.get(payment=Payment.objects.get(stripe=self))
|
|
|
|
session = StripeClient.create_checkout_session(order)# <-- předáme self.StripePayment
|
|
|
|
self.stripe_session_id = session.id
|
|
self.stripe_payment_intent = session.payment_intent
|
|
self.stripe_session_url = session.url
|
|
|
|
else:
|
|
self.updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
super().save(*args, **kwargs)
|
|
|
|
def paid(self):
|
|
self.status = self.STATUS_CHOICES.PAID
|
|
self.save()
|
|
|
|
def refund(self):
|
|
StripeClient.refund_order(self.stripe_payment_intent)
|
|
self.status = self.STATUS_CHOICES.REFUNDING
|
|
self.save()
|
|
|
|
def refund_confirmed(self):
|
|
self.status = self.STATUS_CHOICES.REFUNDED
|
|
self.save()
|
|
|
|
def cancel(self):
|
|
StripeClient.cancel_checkout_session(self.stripe_session_id)
|
|
self.status = self.STATUS_CHOICES.CANCELLED
|
|
self.save() |