crmbackend/crm/models.py
vickytechkey 05e1a1a149
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 38s
initial commit
2026-08-15 19:22:16 +05:30

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}"