import uuid from django.db import models from accounts.models import BaseModel, IAmPrincipal, IAmPrincipalType from django.db.models.signals import post_save from django.dispatch import receiver from manage_referrals.models import ReferralRecordReward from manage_subscriptions.models import PrincipalSubscription # Create your models here. class Wallet(BaseModel): principal = models.OneToOneField(IAmPrincipal, on_delete=models.CASCADE) balance = models.DecimalField(max_digits=14, decimal_places=2, default=0.00) deposit = models.DecimalField(max_digits=14, decimal_places=2, default=0.00) earnings = models.DecimalField(max_digits=14, decimal_places=2, default=0.00) coins = models.BigIntegerField(default=0) withdrawal_balance = models.DecimalField( max_digits=14, decimal_places=2, default=0.00 ) class Meta: db_table = "wallet" def __str__(self): return f"Balance: {self.balance} For Principal: {self.principal}" @receiver(post_save, sender=IAmPrincipal) def create_wallet(sender, instance, created, **kwargs): if created: wallet = Wallet.objects.create(principal=instance) class TransactionType(models.TextChoices): PAYMENT = "payment", "Payment" DEPOSIT = "deposit", "Deposit" WITHDRAW = "withdraw", "Withdraw" CREDIT = "credit", "Credit" class TransactionStatus(models.TextChoices): SUCCESS = "success", "Success" FAIL = "fail", "Fail" INITIATE = "initiate", "Initiate" class PaymentMethod(models.TextChoices): CARD = "card", "Card" UPI = "upi", "UPI" COIN = "coin", "Coin" class Transaction(BaseModel): principal = models.ForeignKey(IAmPrincipal, on_delete=models.CASCADE) principal_subscription = models.ForeignKey( PrincipalSubscription, related_name="transaction_principal_subscription", on_delete=models.SET_NULL, blank=True, null=True, ) transaction_type = models.CharField( max_length=10, choices=TransactionType.choices, ) payment_method = models.CharField( max_length=10, choices=PaymentMethod.choices, ) transaction_status = models.CharField( max_length=10, choices=TransactionStatus.choices, default=TransactionStatus.INITIATE, ) amount = models.DecimalField(max_digits=14, decimal_places=2, default=0.00) coins = models.IntegerField(default=0) comment = models.CharField(max_length=200, null=True, blank=True) order_id = models.CharField(unique=True, max_length=255, null=True, blank=True) product_id = models.CharField(unique=True, max_length=255, null=True, blank=True) reference_id = models.CharField(max_length=255, null=True, blank=True) def save(self, *args, **kwargs): if self.order_id is None and self.created_on and self.id: self.order_id = self.created_on.strftime("GDTMS%Y%m%dODR") + str(self.id) return super().save(*args, **kwargs) class Meta: db_table = "transaction_history" def __str__(self): return f"principal: {self.principal}, type: {self.transaction_type}, status: {self.transaction_status}, amount: {self.amount}" class StripeConnectAccount(BaseModel): principal = models.ForeignKey(IAmPrincipal, on_delete=models.CASCADE) stripe_connect_id = models.CharField(max_length=255, unique=True) charges_enabled = models.BooleanField(default=False) transfers_enabled = models.BooleanField(default=False) details_submitted = models.BooleanField(default=False) class Meta: db_table = "stripe_connect" def __str__(self): return f"principal: {self.principal}, type: {self.stripe_connect_id}" class PrincipalBankAccount(BaseModel): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) principal = models.ForeignKey(IAmPrincipal, on_delete=models.CASCADE) first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) account_no = models.CharField(max_length=255) sort_code = models.CharField(max_length=255) is_verified = models.BooleanField(default=False) class Meta: db_table = "bank_account" def __str__(self): return f"principal: {self.principal}, account_no: {self.account_no}" class WithdrawalRequest(BaseModel): STATUS_CHOICES = [ ("submitted", "Submitted"), ("review", "Review"), ("processing", "Under Process"), ("transferred", "Transferred"), ("dispute", "Dispute"), ("denied", "Denied"), ] # Update this line to reference IAmPrincipal principal = models.ForeignKey( IAmPrincipal, on_delete=models.CASCADE, related_name="withdrawal_requests" ) coins = models.IntegerField(default=0) token = models.CharField(max_length=255, blank=True, null=True) amount = models.DecimalField(max_digits=14, decimal_places=2, default=0.00) ref_image = models.ImageField(upload_to="withdrawal", null=True, blank=True) ref_id = models.CharField(unique=True, max_length=255, null=True, blank=True) notes = models.TextField(null=True, blank=True) reply = models.TextField(null=True, blank=True) status = models.CharField( max_length=20, choices=STATUS_CHOICES, default="submitted" ) class Meta: db_table = "withdraw_request" def __str__(self): return f"Withdrawal Request by {self.principal.get_full_name()} on {self.created_on.strftime('%Y-%m-%d')}"