All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 38s
65 lines
3.3 KiB
Python
65 lines
3.3 KiB
Python
from django.db import models
|
|
from django.contrib.auth.models import User
|
|
|
|
class CRMAdmin(models.Model):
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='crm_admin')
|
|
role = models.CharField(max_length=50, default='moderator') # super_admin, moderator
|
|
is_active = models.BooleanField(default=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.user.username} ({self.role})"
|
|
|
|
class AuditLog(models.Model):
|
|
admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
|
action = models.CharField(max_length=100) # approve_seller, reject_product, ban_customer, issue_refund...
|
|
target_type = models.CharField(max_length=50) # seller, customer, product, withdrawal, order
|
|
target_id = models.IntegerField(null=True, blank=True)
|
|
details = models.JSONField(default=dict)
|
|
performed_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.admin} - {self.action} on {self.target_type} #{self.target_id}"
|
|
|
|
class WithdrawalRequest(models.Model):
|
|
seller_wallet_id = models.IntegerField()
|
|
seller_user_id = models.IntegerField()
|
|
amount = models.DecimalField(max_digits=12, decimal_places=2)
|
|
status = models.CharField(max_length=50, default='pending') # pending, approved, rejected
|
|
utr_number = models.CharField(max_length=100, blank=True, null=True)
|
|
admin_note = models.TextField(blank=True, null=True)
|
|
requested_at = models.DateTimeField(auto_now_add=True)
|
|
resolved_at = models.DateTimeField(null=True, blank=True)
|
|
resolved_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"Withdrawal request #{self.id} for seller {self.seller_user_id} - {self.status}"
|
|
|
|
class RefundRecord(models.Model):
|
|
admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
|
customer_user_id = models.IntegerField()
|
|
order_id = models.CharField(max_length=100)
|
|
phonepe_original_txn_id = models.CharField(max_length=100)
|
|
phonepe_refund_txn_id = models.CharField(max_length=100, unique=True)
|
|
refund_amount = models.DecimalField(max_digits=10, decimal_places=2)
|
|
status = models.CharField(max_length=50, default='initiated') # initiated, processed, failed
|
|
admin_note = models.TextField(blank=True, null=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"Refund {self.phonepe_refund_txn_id} for order {self.order_id} - {self.status}"
|
|
|
|
class ReturnPickup(models.Model):
|
|
admin = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
|
|
customer_user_id = models.IntegerField()
|
|
order_id = models.CharField(max_length=100)
|
|
pickup_address = models.TextField()
|
|
shadowfax_return_awb = models.CharField(max_length=100, blank=True, null=True)
|
|
qc_enabled = models.BooleanField(default=True)
|
|
label_url = models.URLField(max_length=500, blank=True, null=True)
|
|
pickup_scheduled_date = models.CharField(max_length=100, blank=True, null=True)
|
|
status = models.CharField(max_length=50, default='created') # created, pickup_scheduled, picked_up, qc_passed, returned_to_seller
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
def __str__(self):
|
|
return f"Return {self.shadowfax_return_awb} for order {self.order_id} - {self.status}"
|