105 lines
4.8 KiB
Python
105 lines
4.8 KiB
Python
from django.db import models
|
||
|
||
class ActivityLog(models.Model):
|
||
SERVICE_CHOICES = [
|
||
('FORWARD', 'Forward Logistics'),
|
||
('REVERSE', 'Reverse Logistics'),
|
||
('WEBHOOK', 'Webhook Event'),
|
||
]
|
||
|
||
STATUS_CHOICES = [
|
||
('SUCCESS', 'Success (2xx)'),
|
||
('ERROR', 'Error (4xx/5xx)'),
|
||
('WARNING', 'Warning'),
|
||
]
|
||
|
||
service_type = models.CharField(max_length=20, choices=SERVICE_CHOICES, default='FORWARD')
|
||
action_name = models.CharField(max_length=100)
|
||
endpoint_url = models.CharField(max_length=500)
|
||
http_method = models.CharField(max_length=10, default='POST')
|
||
request_headers = models.TextField(blank=True, default='')
|
||
request_body = models.TextField(blank=True, default='')
|
||
response_status_code = models.IntegerField(default=200)
|
||
response_body = models.TextField(blank=True, default='')
|
||
execution_time_ms = models.FloatField(default=0.0)
|
||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='SUCCESS')
|
||
timestamp = models.DateTimeField(auto_now_add=True)
|
||
notes = models.TextField(blank=True, default='')
|
||
|
||
class Meta:
|
||
ordering = ['-timestamp']
|
||
|
||
def __str__(self):
|
||
return f"[{self.service_type}] {self.action_name} - {self.response_status_code} ({self.timestamp.strftime('%H:%M:%S')})"
|
||
|
||
|
||
class RiderAssignment(models.Model):
|
||
awb_number = models.CharField(max_length=100, db_index=True)
|
||
client_order_id = models.CharField(max_length=100, blank=True, default='')
|
||
rider_name = models.CharField(max_length=150)
|
||
rider_phone = models.CharField(max_length=30)
|
||
status = models.CharField(max_length=50, default='out_for_delivery')
|
||
latitude = models.FloatField(blank=True, null=True)
|
||
longitude = models.FloatField(blank=True, null=True)
|
||
raw_webhook_payload = models.TextField(blank=True, default='')
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
updated_at = models.DateTimeField(auto_now=True)
|
||
|
||
class Meta:
|
||
ordering = ['-updated_at']
|
||
|
||
def __str__(self):
|
||
return f"Rider {self.rider_name} ({self.rider_phone}) - AWB: {self.awb_number} [{self.status}]"
|
||
|
||
|
||
class PickupSchedule(models.Model):
|
||
STATUS_CHOICES = [
|
||
('SCHEDULED', 'Pickup Scheduled'),
|
||
('CONFIRMED', 'Confirmed by Carrier'),
|
||
('IN_TRANSIT', 'Picked Up / In Transit'),
|
||
('CANCELLED', 'Cancelled'),
|
||
]
|
||
|
||
tracking_id = models.CharField(max_length=100, db_index=True)
|
||
client_order_id = models.CharField(max_length=100, blank=True, default='', db_index=True)
|
||
carrier = models.CharField(max_length=50, default='DELHIVERY', db_index=True)
|
||
carrier_display = models.CharField(max_length=100, default='Delhivery Logistics')
|
||
pickup_id = models.CharField(max_length=100, blank=True, default='', db_index=True)
|
||
pickup_date = models.CharField(max_length=20) # YYYY-MM-DD
|
||
pickup_time = models.CharField(max_length=50, default='14:00:00')
|
||
pickup_slot = models.CharField(max_length=100, blank=True, default='') # e.g. Afternoon Slot (2:00 PM – 5:00 PM)
|
||
pickup_location = models.CharField(max_length=150, blank=True, default='')
|
||
status = models.CharField(max_length=50, choices=STATUS_CHOICES, default='SCHEDULED')
|
||
expected_package_count = models.IntegerField(default=1)
|
||
expected_delivery_date = models.CharField(max_length=100, blank=True, null=True, default='')
|
||
notes = models.TextField(blank=True, default='')
|
||
raw_response = models.JSONField(default=dict, blank=True)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
updated_at = models.DateTimeField(auto_now=True)
|
||
|
||
class Meta:
|
||
ordering = ['-updated_at']
|
||
|
||
def __str__(self):
|
||
return f"[{self.carrier}] Pickup {self.pickup_id or 'Pending'} - AWB: {self.tracking_id} on {self.pickup_date} ({self.pickup_time})"
|
||
|
||
|
||
class ShipmentTracking(models.Model):
|
||
tracking_id = models.CharField(max_length=100, unique=True, db_index=True)
|
||
client_order_id = models.CharField(max_length=100, blank=True, default='', db_index=True)
|
||
carrier = models.CharField(max_length=50, default='DELHIVERY', db_index=True)
|
||
current_status = models.CharField(max_length=100, default='in_transit')
|
||
expected_delivery_date = models.CharField(max_length=100, blank=True, null=True, default='')
|
||
picked_up_date = models.CharField(max_length=100, blank=True, null=True, default='')
|
||
origin = models.CharField(max_length=150, blank=True, default='')
|
||
destination = models.CharField(max_length=150, blank=True, default='')
|
||
raw_payload = models.JSONField(default=dict, blank=True)
|
||
created_at = models.DateTimeField(auto_now_add=True)
|
||
updated_at = models.DateTimeField(auto_now=True)
|
||
|
||
class Meta:
|
||
ordering = ['-updated_at']
|
||
|
||
def __str__(self):
|
||
return f"Shipment {self.tracking_id} [{self.carrier}] - ETA: {self.expected_delivery_date or 'N/A'}"
|
||
|