adding bids
This commit is contained in:
parent
08e8aa82d4
commit
3cf59feab0
Binary file not shown.
Binary file not shown.
@ -184,7 +184,7 @@ class ParcelForm(forms.ModelForm):
|
|||||||
labels = {
|
labels = {
|
||||||
'description': _('Package Description'),
|
'description': _('Package Description'),
|
||||||
'weight': _('Weight (kg)'),
|
'weight': _('Weight (kg)'),
|
||||||
'price': _('Shipping Price (OMR)'),
|
'price': _('Your Offer Price (Bid) (OMR)'),
|
||||||
'pickup_country': _('Pickup Country'),
|
'pickup_country': _('Pickup Country'),
|
||||||
'pickup_governate': _('Pickup Governate'),
|
'pickup_governate': _('Pickup Governate'),
|
||||||
'pickup_city': _('Pickup City'),
|
'pickup_city': _('Pickup City'),
|
||||||
|
|||||||
@ -26,10 +26,17 @@
|
|||||||
<h5 class="card-title">{{ parcel.description|truncatechars:30 }}</h5>
|
<h5 class="card-title">{{ parcel.description|truncatechars:30 }}</h5>
|
||||||
<p class="card-text mb-1 small"><strong>{% trans "Pickup" %}:</strong> {{ parcel.pickup_address }}</p>
|
<p class="card-text mb-1 small"><strong>{% trans "Pickup" %}:</strong> {{ parcel.pickup_address }}</p>
|
||||||
<p class="card-text mb-3 small"><strong>{% trans "Delivery" %}:</strong> {{ parcel.delivery_address }}</p>
|
<p class="card-text mb-3 small"><strong>{% trans "Delivery" %}:</strong> {{ parcel.delivery_address }}</p>
|
||||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
|
||||||
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
<span class="text-muted small"><strong>{% trans "Weight" %}:</strong> {{ parcel.weight }} kg</span>
|
<span class="text-muted small"><strong>{% trans "Weight" %}:</strong> {{ parcel.weight }} kg</span>
|
||||||
<span class="text-primary fw-bold">{{ parcel.price }} OMR</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Bid/Price Highlight -->
|
||||||
|
<div class="bg-light p-2 rounded text-center mb-3 border border-primary border-opacity-25">
|
||||||
|
<small class="text-uppercase text-muted fw-bold" style="font-size: 0.7rem;">{% trans "Shipper's Offer (Bid)" %}</small>
|
||||||
|
<div class="text-primary fw-bold fs-4">{{ parcel.price }} <span class="fs-6">OMR</span></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<form action="{% url 'accept_parcel' parcel.id %}" method="POST">
|
<form action="{% url 'accept_parcel' parcel.id %}" method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<button type="submit" class="btn btn-masarx-primary w-100">{% trans "Accept Shipment" %}</button>
|
<button type="submit" class="btn btn-masarx-primary w-100">{% trans "Accept Shipment" %}</button>
|
||||||
|
|||||||
@ -130,6 +130,29 @@ def send_whatsapp_message_detailed(phone_number, message):
|
|||||||
logger.error(error_msg)
|
logger.error(error_msg)
|
||||||
return False, error_msg
|
return False, error_msg
|
||||||
|
|
||||||
|
def notify_admin(subject, message):
|
||||||
|
"""Notifies the admin via Email and WhatsApp (if configured in PlatformProfile)."""
|
||||||
|
# Email
|
||||||
|
try:
|
||||||
|
if hasattr(settings, 'CONTACT_EMAIL_TO') and settings.CONTACT_EMAIL_TO:
|
||||||
|
send_html_email(
|
||||||
|
subject=f"Admin Alert: {subject}",
|
||||||
|
message=message,
|
||||||
|
recipient_list=settings.CONTACT_EMAIL_TO,
|
||||||
|
title="Admin Alert"
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Failed to notify admin via email: {e}")
|
||||||
|
|
||||||
|
# WhatsApp
|
||||||
|
try:
|
||||||
|
profile = PlatformProfile.objects.first()
|
||||||
|
if profile and profile.phone_number:
|
||||||
|
# Assuming profile.phone_number is a valid WhatsApp number for Admin alerts
|
||||||
|
send_whatsapp_message(profile.phone_number, f"ADMIN ALERT: {subject}\n{message}")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
def notify_shipment_created(parcel):
|
def notify_shipment_created(parcel):
|
||||||
"""Notifies the shipper that the shipment request was received via WhatsApp and Email."""
|
"""Notifies the shipper that the shipment request was received via WhatsApp and Email."""
|
||||||
shipper_name = parcel.shipper.get_full_name() or parcel.shipper.username
|
shipper_name = parcel.shipper.get_full_name() or parcel.shipper.username
|
||||||
@ -185,7 +208,7 @@ Your shipment is now visible to available drivers."""
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Failed to send payment email to {parcel.shipper.email}: {e}")
|
logger.error(f"Failed to send payment email to {parcel.shipper.email}: {e}")
|
||||||
|
|
||||||
# Notify Receiver (WhatsApp only usually, but good to have logic if email exists in future)
|
# Notify Receiver
|
||||||
receiver_msg = f"""Hello {parcel.receiver_name},
|
receiver_msg = f"""Hello {parcel.receiver_name},
|
||||||
|
|
||||||
A shipment is coming your way from {shipper_name}.
|
A shipment is coming your way from {shipper_name}.
|
||||||
@ -194,26 +217,59 @@ Status: {parcel.get_status_display()}"""
|
|||||||
send_whatsapp_message(parcel.receiver_phone, receiver_msg)
|
send_whatsapp_message(parcel.receiver_phone, receiver_msg)
|
||||||
|
|
||||||
def notify_driver_assigned(parcel):
|
def notify_driver_assigned(parcel):
|
||||||
"""Notifies the shipper and receiver that a driver has picked up the parcel."""
|
"""Notifies the shipper, receiver, driver, and admin that a driver has picked up the parcel."""
|
||||||
driver_name = parcel.carrier.get_full_name() or parcel.carrier.username
|
driver_name = parcel.carrier.get_full_name() or parcel.carrier.username
|
||||||
msg = f"""Shipment {parcel.tracking_number} has been picked up by {driver_name}.
|
shipper_name = parcel.shipper.get_full_name() or parcel.shipper.username
|
||||||
|
|
||||||
|
# 1. Notify Shipper
|
||||||
|
msg_shipper = f"""Shipment {parcel.tracking_number} has been picked up by {driver_name}.
|
||||||
Status: {parcel.get_status_display()}"""
|
Status: {parcel.get_status_display()}"""
|
||||||
|
|
||||||
if hasattr(parcel.shipper, 'profile') and parcel.shipper.profile.phone_number:
|
if hasattr(parcel.shipper, 'profile') and parcel.shipper.profile.phone_number:
|
||||||
send_whatsapp_message(parcel.shipper.profile.phone_number, msg)
|
send_whatsapp_message(parcel.shipper.profile.phone_number, msg_shipper)
|
||||||
|
|
||||||
if parcel.shipper.email:
|
if parcel.shipper.email:
|
||||||
try:
|
try:
|
||||||
send_html_email(
|
send_html_email(
|
||||||
subject='Driver Assigned - ' + parcel.tracking_number,
|
subject='Driver Assigned - ' + parcel.tracking_number,
|
||||||
message=msg,
|
message=msg_shipper,
|
||||||
recipient_list=[parcel.shipper.email],
|
recipient_list=[parcel.shipper.email],
|
||||||
title='Driver Assigned'
|
title='Driver Assigned'
|
||||||
)
|
)
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
send_whatsapp_message(parcel.receiver_phone, msg)
|
# 2. Notify Receiver
|
||||||
|
msg_receiver = f"""Shipment {parcel.tracking_number} from {shipper_name} is on the way (Picked up).
|
||||||
|
Driver: {driver_name}"""
|
||||||
|
send_whatsapp_message(parcel.receiver_phone, msg_receiver)
|
||||||
|
|
||||||
|
# 3. Notify Driver (Confirmation)
|
||||||
|
msg_driver = f"""You have successfully accepted Shipment {parcel.tracking_number}.
|
||||||
|
Shipper: {shipper_name}
|
||||||
|
Pickup: {parcel.pickup_address}
|
||||||
|
Delivery: {parcel.delivery_address}
|
||||||
|
Price/Bid: {parcel.price} OMR"""
|
||||||
|
|
||||||
|
if hasattr(parcel.carrier, 'profile') and parcel.carrier.profile.phone_number:
|
||||||
|
send_whatsapp_message(parcel.carrier.profile.phone_number, msg_driver)
|
||||||
|
|
||||||
|
if parcel.carrier.email:
|
||||||
|
try:
|
||||||
|
send_html_email(
|
||||||
|
subject='Shipment Accepted - ' + parcel.tracking_number,
|
||||||
|
message=msg_driver,
|
||||||
|
recipient_list=[parcel.carrier.email],
|
||||||
|
title='Shipment Accepted'
|
||||||
|
)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# 4. Notify Admin
|
||||||
|
notify_admin(
|
||||||
|
subject=f"Shipment Accepted ({parcel.tracking_number})",
|
||||||
|
message=f"Driver {driver_name} accepted shipment {parcel.tracking_number} from {shipper_name}.\nPrice: {parcel.price} OMR"
|
||||||
|
)
|
||||||
|
|
||||||
def notify_status_change(parcel):
|
def notify_status_change(parcel):
|
||||||
"""Notifies parties about general status updates (In Transit, Delivered)."""
|
"""Notifies parties about general status updates (In Transit, Delivered)."""
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user