import datetime from django.db import models from django.utils.translation import gettext_lazy as _ from .enum import BankType, PaymentStatus from order.models import OrderModel class BankQuerySet(models.QuerySet): def __init__(self, *args, **kwargs): super(BankQuerySet, self).__init__(*args, **kwargs) def active(self): return self.filter() class BankManager(models.Manager): def get_queryset(self): return BankQuerySet(self.model, using=self._db) def active(self): return self.get_queryset().active() def update_expire_records(self): count = ( self.active() .filter( status=PaymentStatus.RETURN_FROM_BANK, update_at__lte=datetime.datetime.now() - datetime.timedelta(minutes=15), ) .update(status=PaymentStatus.EXPIRE_VERIFY_PAYMENT) ) count = count + self.active().filter( status=PaymentStatus.REDIRECT_TO_BANK, update_at__lt=datetime.datetime.now() - datetime.timedelta(minutes=15), ).update(status=PaymentStatus.EXPIRE_GATEWAY_TOKEN) return count def filter_return_from_bank(self): return self.active().filter(status=PaymentStatus.RETURN_FROM_BANK) class Bank(models.Model): status = models.CharField( max_length=50, null=False, blank=False, choices=PaymentStatus.choices, verbose_name=_("Status"), ) bank_type = models.CharField( max_length=50, choices=BankType.choices, verbose_name=_("Bank"), ) # It's local and generate locally tracking_code = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("Tracking code")) amount = models.CharField(max_length=10, null=False, blank=False, verbose_name=_("Amount")) # Reference number return from bank reference_number = models.CharField( unique=True, max_length=255, null=False, blank=False, verbose_name=_("Reference number"), ) response_result = models.TextField(null=True, blank=True, verbose_name=_("Bank result")) callback_url = models.TextField(null=False, blank=False, verbose_name=_("Callback url")) extra_information = models.TextField(null=True, blank=True, verbose_name=_("Extra information")) bank_choose_identifier = models.CharField( max_length=255, blank=True, null=True, verbose_name=_("Bank choose identifier") ) order = models.ForeignKey(OrderModel, on_delete=models.SET_NULL, null=True, blank=True ,related_name='bank_records', verbose_name='سفارش') created_at = models.DateTimeField(auto_now_add=True, editable=False, verbose_name=_("Created at")) update_at = models.DateTimeField(auto_now=True, editable=False, verbose_name=_("Updated at")) objects = BankManager() class Meta: verbose_name = _("Bank gateway") verbose_name_plural = _("Bank gateways") def __str__(self): return "{}-{}".format(self.pk, self.tracking_code) @property def is_success(self): return self.status == PaymentStatus.COMPLETE