shippingservice/shipping/models.py
vignesh 8ea3df3fab
All checks were successful
Deploy Beta (NATIVE) / deploy (push) Successful in 34s
feat(tracking): store logistics ETA internally in ShipmentTracking and PickupSchedule database
2026-10-14 21:51:31 +05:30

105 lines
4.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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