diff --git a/core/models.py b/core/models.py index 8158635..4e3e959 100644 --- a/core/models.py +++ b/core/models.py @@ -191,6 +191,29 @@ class Parcel(models.Model): def save(self, *args, **kwargs): if not self.tracking_number: self.tracking_number = str(uuid.uuid4().hex[:10]).upper() + + # Calculate Distance and Price if Lat/Lng provided and price is 0 (or always update to ensure accuracy) + # We only recalculate if status is pending or if it's a new object to avoid changing history for completed trips + is_new = self.pk is None + if (is_new or self.status == 'pending') and self.pickup_lat and self.pickup_lng and self.delivery_lat and self.delivery_lng: + # Local import to avoid circular dependency + from .pricing import calculate_haversine_distance, get_pricing_breakdown + + # Calculate Distance + dist = calculate_haversine_distance( + self.pickup_lat, self.pickup_lng, + self.delivery_lat, self.delivery_lng + ) + self.distance_km = dist + + # Calculate Price + breakdown = get_pricing_breakdown(self.distance_km, self.weight) + if not breakdown.get('error'): + self.price = breakdown['price'] + self.platform_fee = breakdown['platform_fee'] + self.platform_fee_percentage = breakdown['platform_fee_percentage'] + self.driver_amount = breakdown['driver_amount'] + super().save(*args, **kwargs) def __str__(self): diff --git a/core/notifications.py b/core/notifications.py index dd62817..43f5159 100644 --- a/core/notifications.py +++ b/core/notifications.py @@ -38,13 +38,13 @@ DEFAULT_TEMPLATES = { }, 'shipment_created_shipper': { 'description': 'Sent to Shipper when they create a shipment', - 'variables': '{{ name }}, {{ description }}, {{ tracking_number }}, {{ status }}', + 'variables': '{{ name }}, {{ description }}, {{ tracking_number }}, {{ status }}, {{ distance }}, {{ price }}', 'subject_en': 'Shipment Request Received - {{ tracking_number }}', 'subject_ar': 'تم استلام طلب الشحنة - {{ tracking_number }}', - 'email_body_en': "Hello {{ name }},\n\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}\n\nPlease proceed to payment to make it visible to drivers.", - 'email_body_ar': "مرحباً {{ name }}،\n\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}\n\nيرجى متابعة الدفع لجعلها مرئية للسائقين.", - 'whatsapp_body_en': "Hello {{ name }},\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nStatus: {{ status }}\nPlease proceed to payment.", - 'whatsapp_body_ar': "مرحباً {{ name }}،\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالحالة: {{ status }}\nيرجى الدفع.", + 'email_body_en': "Hello {{ name }},\n\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nDistance: {{ distance }} km\nPrice: {{ price }} OMR\nStatus: {{ status }}\n\nPlease proceed to payment to make it visible to drivers.", + 'email_body_ar': "مرحباً {{ name }}،\n\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع\nالحالة: {{ status }}\n\nيرجى متابعة الدفع لجعلها مرئية للسائقين.", + 'whatsapp_body_en': "Hello {{ name }}\nYour shipment request for '{{ description }}' has been received.\nTracking Number: {{ tracking_number }}\nDistance: {{ distance }} km\nPrice: {{ price }} OMR\nStatus: {{ status }}\nPlease proceed to payment.", + 'whatsapp_body_ar': "مرحباً {{ name }}،\nتم استلام طلب الشحنة '{{ description }}'.\nرقم التتبع: {{ tracking_number }}\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع\nالحالة: {{ status }}\nيرجى الدفع.", }, 'payment_success_shipper': { 'description': 'Sent to Shipper after payment', @@ -88,13 +88,13 @@ DEFAULT_TEMPLATES = { }, 'driver_pickup_driver': { 'description': 'Sent to Driver upon acceptance', - 'variables': '{{ tracking_number }}, {{ shipper_name }}, {{ pickup_address }}, {{ delivery_address }}, {{ price }}', + 'variables': '{{ tracking_number }}, {{ shipper_name }}, {{ pickup_address }}, {{ delivery_address }}, {{ price }}, {{ distance }}', 'subject_en': 'Shipment Accepted - {{ tracking_number }}', 'subject_ar': 'تم قبول الشحنة - {{ tracking_number }}', - 'email_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nPrice: {{ price }} OMR', - 'email_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالسعر: {{ price }} ر.ع', - 'whatsapp_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nPrice/Bid: {{ price }} OMR', - 'whatsapp_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالسعر: {{ price }} ر.ع', + 'email_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nDistance: {{ distance }} km\nPrice: {{ price }} OMR', + 'email_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع', + 'whatsapp_body_en': 'You have successfully accepted Shipment {{ tracking_number }}.\nShipper: {{ shipper_name }}\nPickup: {{ pickup_address }}\nDelivery: {{ delivery_address }}\nDistance: {{ distance }} km\nPrice/Bid: {{ price }} OMR', + 'whatsapp_body_ar': 'لقد قبلت الشحنة {{ tracking_number }} بنجاح.\nالشاحن: {{ shipper_name }}\nالاستلام: {{ pickup_address }}\nالتوصيل: {{ delivery_address }}\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع', }, 'shipment_status_update': { 'description': 'Sent on general status change (In Transit, Delivered)', @@ -108,13 +108,13 @@ DEFAULT_TEMPLATES = { }, 'admin_alert_driver_accept': { 'description': 'Sent to Admin when driver accepts shipment', - 'variables': '{{ driver_name }}, {{ car_plate_number }}, {{ tracking_number }}, {{ shipper_name }}, {{ price }}', + 'variables': '{{ driver_name }}, {{ car_plate_number }}, {{ tracking_number }}, {{ shipper_name }}, {{ price }}, {{ distance }}', 'subject_en': 'Shipment Accepted ({{ tracking_number }})', 'subject_ar': 'تم قبول الشحنة ({{ tracking_number }})', - 'email_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nPrice: {{ price }} OMR', - 'email_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالسعر: {{ price }} ر.ع', - 'whatsapp_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nPrice: {{ price }} OMR', - 'whatsapp_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالسعر: {{ price }} ر.ع', + 'email_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nDistance: {{ distance }} km\nPrice: {{ price }} OMR', + 'email_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع', + 'whatsapp_body_en': 'Driver {{ driver_name }} ({{ car_plate_number }}) accepted shipment {{ tracking_number }} from {{ shipper_name }}.\nDistance: {{ distance }} km\nPrice: {{ price }} OMR', + 'whatsapp_body_ar': 'قام السائق {{ driver_name }} ({{ car_plate_number }}) بقبول الشحنة {{ tracking_number }} من {{ shipper_name }}.\nالمسافة: {{ distance }} كم\nالسعر: {{ price }} ر.ع', }, 'contact_form_admin': { 'description': 'Sent to Admin when contact form is submitted', diff --git a/core/templates/core/driver_dashboard.html b/core/templates/core/driver_dashboard.html index e732c42..6962256 100644 --- a/core/templates/core/driver_dashboard.html +++ b/core/templates/core/driver_dashboard.html @@ -66,6 +66,7 @@
{% trans "Delivery" %}: {{ parcel.delivery_governate.name }} / {{ parcel.delivery_city.name }}
| + | Description الوصف | @@ -204,6 +204,10 @@ Tracking No رقم التتبع ++ Distance + المسافة + | Weight الوزن @@ -221,13 +225,14 @@ {{ parcel.description|truncatechars:50 }} | {{ parcel.tracking_number }} | +{{ parcel.distance_km }} km | {{ parcel.weight }} kg | {{ parcel.price }} OMR / ر.ع. | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + | TOTAL / الإجمالي | {{ parcel.price }} OMR / ر.ع. | diff --git a/core/templates/core/shipper_dashboard.html b/core/templates/core/shipper_dashboard.html index 2f6dfc2..ffc725c 100644 --- a/core/templates/core/shipper_dashboard.html +++ b/core/templates/core/shipper_dashboard.html @@ -55,7 +55,8 @@{% trans "Tracking ID" %} | {% trans "Description" %} | {% trans "Carrier" %} | +{% trans "Distance" %} | {% trans "Bid/Price" %} | {% trans "Status" %} | {% trans "Action" %} | @@ -256,6 +261,7 @@ - {% endif %} +{{ parcel.distance_km }} km | {{ parcel.price }} OMR | @@ -310,6 +316,7 @@ | {% trans "Tracking ID" %} | {% trans "Description" %} | {% trans "Carrier" %} | +{% trans "Distance" %} | {% trans "Bid/Price" %} | {% trans "Status" %} | {% trans "Action" %} | @@ -328,6 +335,7 @@ - {% endif %} +{{ parcel.distance_km }} km | {{ parcel.price }} OMR | diff --git a/core/whatsapp_utils.py b/core/whatsapp_utils.py index 07d5ef0..0829850 100644 --- a/core/whatsapp_utils.py +++ b/core/whatsapp_utils.py @@ -147,7 +147,9 @@ def notify_shipment_created(parcel): 'name': shipper_name, 'description': parcel.description, 'tracking_number': parcel.tracking_number, - 'status': parcel.get_status_display() + 'status': parcel.get_status_display(), + 'distance': parcel.distance_km, + 'price': parcel.price } # Render for Shipper (check user language preference? For now assume session/request unavailable so maybe default or EN, @@ -241,7 +243,8 @@ def notify_driver_assigned(parcel): 'shipper_name': shipper_name, 'pickup_address': parcel.pickup_address, 'delivery_address': parcel.delivery_address, - 'price': parcel.price + 'price': parcel.price, + 'distance': parcel.distance_km } subj_d, email_d, wa_d = get_notification_content('driver_pickup_driver', context_driver) @@ -257,7 +260,8 @@ def notify_driver_assigned(parcel): 'car_plate_number': car_plate, 'tracking_number': parcel.tracking_number, 'shipper_name': shipper_name, - 'price': parcel.price + 'price': parcel.price, + 'distance': parcel.distance_km } notify_admin_alert('admin_alert_driver_accept', context_admin) @@ -274,4 +278,4 @@ def notify_status_change(parcel): if parcel.shipper.email: send_html_email(subject=subj, message=email_msg, recipient_list=[parcel.shipper.email], title=subj) - send_whatsapp_message(parcel.receiver_phone, wa_msg) + send_whatsapp_message(parcel.receiver_phone, wa_msg) \ No newline at end of file | |||||