Ë
    Jtªjá" ã                   óP  — d dl m Z  d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ	 d dl
mZmZ d dlmZmZ d dlmZmZ d dlmZ d dlmZmZ d d	lmZmZ d d
lmZ d dlmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 d dl7m8Z8m9Z9 d dl:m;Z;m<Z<m=Z=m>Z> d dl?m@Z@mAZAmBZBmCZC d dlDmEZE d dlFmGZG d dlHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZP d dlQmRZR d dlSmTZTmUZU ddlVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZb ddlcmdZdmeZe ddlfmgZg ddlhmiZi ddljmkZk ddlmlZlmmZmmnZnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZxmyZymzZzm{Z{m|Z|m}Z}m~Z~mZm€Z€m�Z�m‚Z‚mƒZƒm„Z„m…Z…m†Z†m‡Z‡mˆZˆm‰Z‰mŠZŠm‹Z‹mŒZŒm�Z�mŽZŽm�Z�m�Z�m‘Z‘m’Z’m“Z“m”Z”m•Z•m–Z–m—Z—m˜Z˜m™Z™  e«       Zš e�j6                  d «      Zœd!„ Z�d"d#œd$„Zžd"d#œd%„ZŸd"dd&œd'„Z d(„ Z¡d)„ Z¢d*„ Z£e.�jH                  �jJ                  e.�jH                  �jL                  e.�jH                  �jN                  fZ¨d+„ Z©d,„ Zªd-„ Z«d.„ Z¬d/„ Z­d0„ Z®e/�jH                  �j^                  e/�jH                  �j`                  he/�jH                  �j`                  e/�jH                  �jb                  he/�jH                  �jb                  e/�jH                  �jd                  he/�jH                  �jd                  e/�jH                  �jf                  he/�jH                  �jf                  e/�jH                  �jh                  he/�jH                  �jh                   eµ«       e/�jH                  �jl                  e/�jH                  �jn                  hiZ¸d1„ Z¹d2„ Zºdµd3„Z»d4„ Z¼d5„ Z½d6„ Z¾d7„ Z¿d8„ ZÀdµd9„ZÁd:„ ZÂd;„ ZÃd<„ ZÄd=„ ZÅd>„ ZÆd?„ ZÇd@„ ZÈ edAg«       eeg«      dB„ «       «       ZÉ edCg«       eeg«      dD„ «       «       ZÊ edCg«       eeg«      dE„ «       «       ZËd¶dF„ZÌ edCg«       eeg«      dG„ «       «       ZÍ edCg«       eeg«      dH„ «       «       ZÎ edCg«       eeg«      dI„ «       «       ZÏ edCg«       eeg«      dJ„ «       «       ZÐ G dK„ dLe«      ZÑ G dM„ dNe�j¤                  «      ZÓdO„ ZÔdP„ ZÕdQ„ ZÖ edCg«       eee[g«      dR„ «       «       Z× G dS„ dTe�j¤                  «      ZØ G dU„ dVe�j²                  «      ZÚ G dW„ dXe�j¶                  «      ZÜ G dY„ dZe�jº                  «      ZÞ edCg«       eee[g«      d[„ «       «       Zß edCg«       eee[g«      d\„ «       «       Zà edCg«       eee[g«      d]„ «       «       Zá edAg«       eee]e^g«      d^„ «       «       Zâ edCg«       eee]e^g«      d_„ «       «       Zã G d`„ dae�j¶                  «      Zä G db„ dce�jº                  «      Zå edAg«       eeeXe^g«      dd„ «       «       Zæ edAg«       eeeXe^g«      de„ «       «       Zç edAg«       eeeXe^g«      df„ «       «       Zèdg„ Zédh„ Zêdi„ Zëdj„ Zìdk„ Zí edAg«       eeeXe^g«      dl„ «       «       Zîdm„ Zïdn„ Zðdo„ Zñ edAg«       eeeYg«      dp„ «       «       Zò edAg«       eeeYg«      dq„ «       «       Zó edAg«       eeeYg«      dr„ «       «       Zô edAg«       eeeWg«      ds„ «       «       Zõ edAg«       eeeWg«      dt„ «       «       Zö edAg«       eeeWg«      du„ «       «       Z÷ G dv„ dwe�j¶                  «      Zø edAg«       eeg«      dx„ «       «       Zù edCg«       eeg«      dy„ «       «       Zú edAdCg«       eeg«      dz„ «       «       Zû edCg«       eee[g«      d{„ «       «       Zü edCg«       eee[g«      d|„ «       «       Zý edAg«       eee[g«      d}„ «       «       Zþ edAg«       eee[g«      d~„ «       «       Zÿ edCg«       eee[g«      d„ «       «       �Z  edAg«       eee[g«      d€„ «       «       �Z edAg«       eeg«      d�„ «       «       �Z edCg«       eeg«      d‚„ «       «       �Z edAg«       eeg«      dƒ„ «       «       �Z G d„„ d…e«      �Z G d†„ d‡e�j¤                  «      �Zdµdˆ„�Zd‰„ �ZdŠ„ �Z	d‹„ �Z
dŒ„ �Zd�„ �ZdŽ„ �Zddd�œd�„�Zd‘„ �Zd’„ �Zd“„ �Z edAg«       eee]e^g«      d”„ «       «       �Zd•„ �Zdd–œd—„�Zd˜„ �Zd™„ �Z edAg«       eee]e^g«      dš„ «       «       �Z edAg«       eee]g«      d›„ «       «       �Z G dœ„ d�e�j¤                  «      �Z G dž„ dŸe�j4                  «      �Z edCg«       eee]g«      d „ «       «       �Z edCg«       eeeXe^g«      d¡„ «       «       �Z edAdCg«       eeeXg«      d¢„ «       «       �Z eg d£¢«       eeeXg«      d¤„ «       «       �Z edAdCg«       eeeXg«      d¥„ «       «       �Z  edAg«       eeeXg«      d¦„ «       «       �Z! G d§„ d¨e�j¤                  «      �Z" ed©g«       eeeZg«      dª„ «       «       �Z# ed©g«       eeeZg«      d«„ «       «       �Z$ edAd©g«       eeeZg«      d¬„ «       «       �Z% edCg«       eee]g«      d­„ «       «       �Z& ed©g«       eee]g«      d®„ «       «       �Z' edAdCg«       eee]g«      d¯„ «       «       �Z( edAg«       eee]g«      d°„ «       «       �Z) edAg«       eee]g«      d±„ «       «       �Z* edAg«       eee]g«      d²„ «       «       �Z+ edCg«       eee]e^g«      d³„ «       «       �Z, edCg«       eee]e^g«      d´„ «       «       �Z-y)·é    )ÚdatetimeN)Úsettings)ÚauthenticateÚget_user_model)ÚIntegrityErrorÚmodels)ÚPrefetchÚQ)Útimezone)ÚgenericsÚserializers)Úapi_viewÚpermission_classes)ÚAPIView)ÚAllowAnyÚIsAuthenticated)ÚToken)	ÚUserRoleÚShipperProfileÚTransporterProfileÚTransporterDriverLinkÚKYCDocumentÚVehicleÚVehicleDocumentÚPlatformSettingsÚPasswordResetOTP)
ÚShipmentÚBidÚTripÚTripLocationÚConversationÚMessageÚProofOfDeliveryÚPODPhotoÚFavoriteTransporterÚRateRequest)Ú%enqueue_shipment_publish_side_effectsÚprepare_shipment_for_publish)Ú&extract_flat_shipment_validation_errorÚnormalize_country_codeÚ!transporter_load_search_radius_kmÚzone_search_radius_km)ÚLOAD_TYPE_COUNTRY_TO_COUNTRYÚparse_load_type_queryÚ!shipment_matches_load_type_filterÚtransporter_can_access_shipment)Úcurrency_for_shipment)Úcountry_code_for_point)Úfind_matching_vehicleÚmatching_vehicle_typeÚparse_required_country_codeÚ*shipment_matches_transporter_vehicle_typesÚ$transporter_verified_active_vehiclesÚvehicle_capacity_tonsÚvehicle_matches_required_typeÚvehicle_type_list)ÚPayment)Ú!ensure_invoice_for_completed_tripÚsettlement_amount_for_bidé   )ÚIsFleetDriverTransporterÚIsFleetOwnerTransporterÚIsIndividualDriverTransporterÚIsPlatformAdminÚ	IsShipperÚIsShipperVerifiedÚIsTransporterÚIsTransporterVerified)Úapi_response)Úensure_upload_dir)Úget_latest_device_positionÚget_latest_positions_map)Únotify_users)Útrip_progress_notify_user_ids)Úrecord_trip_status).ÚShipperRegisterSerializerÚShipperProfileSerializerÚTransporterRegisterSerializerÚTransporterProfileSerializerÚ#TransporterDocumentUploadSerializerÚ!transporter_doc_types_for_accountÚKYCDocumentSerializerÚKYCDocumentUploadSerializerÚShipmentSerializerÚ&TransporterAvailableShipmentSerializerÚShipmentCreateUpdateSerializerÚShipmentPriceEstimateSerializerÚ ShipperDriverLocationsSerializerÚBidListSerializerÚBidDetailSerializerÚBidCounterSerializerÚTransporterBidSubmitSerializerÚTripListSerializerÚTripDetailSerializerÚShipperTripListSerializerÚShipperTripDetailSerializerÚTransporterTripDetailSerializerÚ"TransporterCompletedTripSerializerÚTripLocationSerializerÚMessageSerializerÚMessageCreateSerializerÚPODSerializerÚVehicleSerializerÚVehicleDriverAssignSerializerÚVehicleDocumentSerializerÚVehicleDocumentUploadSerializerÚVehicleDocumentReviewSerializerÚVehicleVerificationSerializerÚPlatformSettingsSerializerÚDriverTripStatusSerializerÚTripAssignDriverSerializerÚFleetDriverCreateSerializerÚFleetDriverUpdateSerializerÚFleetDriverSerializerÚRateRequestSerializerÚRateRequestRejectSerializerÚsave_avatar_and_get_urlÚupsert_driver_kyc_documentsÚTRANSPORTER_DRIVER_DOC_TYPESÚ$get_shipper_favorite_transporter_idsÚresolve_trips_assigned_vehiclesÚapic                 ó  — d}t        j                  || z
  «      }t        j                  ||z
  «      }t        j                  |dz  «      dz  t        j                  t        j                  | «      «      t        j                  t        j                  |«      «      z  t        j                  |dz  «      dz  z  z   }dt        j                  t        j
                  |«      t        j
                  d|z
  «      «      z  }||z  S )Ng     ã¸@é   r>   )ÚmathÚradiansÚsinÚcosÚatan2Úsqrt)	Úlat1Úlon1Úlat2Úlon2Ú	radius_kmÚdlatÚdlonÚaÚcs	            ú#/var/www/html/truck-me/api/views.pyÚ_haversine_kmr�   �   sÈ   € Ø€IÜ�<‰<˜˜t™Ó$€DÜ�<‰<˜˜t™Ó$€Dä�‰�˜‘Ó˜aÑÜ
�(‰(”4—<‘< Ó%Ó
&¬¯©´$·,±,¸tÓ2DÓ)EÑ
EÌÏÉÐQUÐXYÑQYÓHZÐ^_ÑH_Ñ
_ñ	`ð ð 	
ŒD�J‰J”t—y‘y “|¤T§Y¡Y¨q°1©uÓ%5Ó6Ñ6€AØ�q‰=Ðó    F©Ú
owner_onlyc                ó.  — |r+| j                   j                  dd¬«      j                  «       S t        j                  j                  dd¬«      j                  t        j                  | ¬«      t        j                  | ¬«      z  «      j                  «       S )NT©Úis_verifiedÚ	is_active©Úowner©Úassigned_driver)Úfleet_vehiclesÚfilterÚexistsr   Úobjectsr   r
   )Úuserr’   s     rŽ   Ú!_user_has_verified_active_vehicler    ›   sv   € ÙØ×"Ñ"×)Ñ)°dÀdÐ)ÓK×RÑRÓTÐTÜ�?‰?×!Ñ!ØØð "ó ÷ �fŒV�X‰X˜DÔ!¤F§H¡H¸TÔ$BÑBÓCÇFÁFÃHðMr�   c                ó   ‡‡— ddl mŠ t        j                  j	                  dd¬«      }|r|j	                  | ¬«      }n<|j	                  t        j                  | ¬«      t        j                  | ¬«      z  «      }t        ˆˆfd„|D «       «      S )Nr   )r9   Tr”   r—   r™   c              3   ó0   •K  — | ]  } ‰|‰«      –— Œ y ­w©N© )Ú.0Úvr9   Úvehicle_type_requireds     €€rŽ   ú	<genexpr>z6_user_has_matching_verified_vehicle.<locals>.<genexpr>¬   s   øè ø€ ÒSÈ1Ñ,¨QÐ0E×FÑSùs   ƒ)Úcore.load_discoveryr9   r   rž   rœ   r   r
   Úany)rŸ   r§   r’   Úqsr9   s    `  @rŽ   Ú#_user_has_matching_verified_vehicler¬   ¤   si   ù€ ÝAä	�‰×	Ñ	¨D¸DÐ	Ó	A€BÙØ�Y‰Y˜TˆYÓ"‰à�Y‰Y”v—x‘x dÔ+¬f¯h©hÀtÔ.LÑLÓMˆÜÔSÐPRÔSÓSÐSr�   ©r’   r§   c                óR  — g }t        | «      }t        |«      }	|D �]=  }
|
j                  }|j                  sŒ|rt        |||¬«      sŒ.t	        ||¬«      sŒ<t        |
j                  xs d«      j                  «       }|sŒf|j                  |«      }|s	 t        |«      }|sŒˆ	 t        |d   «      }t        |d   «      }t        ||	||«      }||kD  rŒ¹d}	 |j                  j                  xs d}|j!                  |j"                  |j$                  |j&                  |j(                  ||
j*                  xs d|
j                  t-        |d«      ||dœdœ	«       �Œ@ |j/                  d„ ¬	«       |S # t        $ r d }Y ŒÞw xY w# t        t        f$ r Y �Œyw xY w# t        $ r d}Y Œ´w xY w)
Nr‘   Ú ÚlatitudeÚ	longitudeé   ©ÚlatÚlon)	Útransporter_idÚemailÚ
first_nameÚ	last_nameÚphoneÚcompany_nameÚtc_idÚdistance_kmÚpositionc                 ó   — | d   S ©Nr½   r¤   )Úxs    rŽ   ú<lambda>z(_drivers_within_radius.<locals>.<lambda>ñ   s   € ˜a Ñ.€ r�   ©Úkey)ÚfloatrŸ   r–   r¬   r    Ústrr¼   ÚstripÚgetrI   Ú	ExceptionÚ	TypeErrorÚ
ValueErrorr�   Úrolerº   ÚappendÚidr·   r¸   r¹   r»   ÚroundÚsort)Úref_latÚref_lonr‰   ÚprofilesÚpositions_mapr’   r§   ÚnearbyÚ	ref_lat_fÚ	ref_lon_fÚprofilerŸ   r¼   Úposr´   rµ   Údistrº   s                     rŽ   Ú_drivers_within_radiusrÛ   ¯   s¾  € ð €FÜ�g“€IÜ�g“€Iàó 2
ˆØ�|‰|ˆØ�~Š~ØÙ Ü6ØØ%Ø%õð
 Ü2°4ÀJÕOØÜ�W—]‘]Ò( bÓ)×0Ñ0Ó2ˆÙØà×Ñ Ó&ˆÙðÜ0°Ó7�ñ Øð	Ü˜˜J™Ó(ˆCÜ˜˜KÑ(Ó)ˆCô ˜Y¨	°3¸Ó<ˆØ�)ÒØØˆð	Ø—I‘I—O‘OÒ) rˆEð 	�‰à"&§'¡'ØŸ™Ø"Ÿo™oØ!Ÿ^™^ØØ '× 4Ñ 4Ò :¸Ø Ÿ™Ü$ T¨1›~Ø$'°Ñ4ñ
ö	
ðM2
ðh ‡K�KÑ.€KÔ/Ø€MøôA ò Ø’ðûô œ:Ð&ò 	Úð	ûô ò 	ØŠEð	ús6   ÂE1Â$FÃFÅ1E?Å>E?ÆFÆFÆF&Æ%F&c                  ó  — t         j                  j                  t         j                  j                  t         j                  j
                  fd¬«      j                  d¬«      j                  d¬«      j                  dd«      S )NT)Úaccount_type__inÚdocuments_verified©Útc_id__isnullr¯   ©r¼   rŸ   Ú
user__role)r   rž   rœ   ÚAccountTypeÚDRIVERÚTRANSPORTER_DRIVERÚexcludeÚselect_relatedr¤   r�   rŽ   Ú!_shipper_driver_profiles_querysetrè   õ   sn   € ä×"Ñ"×)Ñ)ä"×.Ñ.×5Ñ5Ü"×.Ñ.×AÑAðð  $ð 	*ó 	
÷ 
‰˜tˆÓ	$ß	‰�rˆÓ	ß	‰˜ Ó	-ðr�   c                 ó
  — | �| dk(  ryt        | «      j                  «       }t        j                  d|«      }|sy	 t	        |j                  d«      «      }|j                  «       }t        t        j                  d|«      «      }t        t        t        dd«      «      j                  «       j                  «       }d|v r|dz  S d	|v r|S d
|v r|dz  dz  S |s|dk(  r|dz  S |S |dk(  r|dz  S |S # t        t        f$ r Y yw xY w)a8  
    Return normalized shipment weight in *tons* for compatibility checks.

    - If weight_text includes units:
      - kg -> tons
      - ton(s) -> as-is
      - lb(s) -> lbs->kg->tons
    - If weight_text is a bare number (no unit letters), we treat it as
      WEIGHT_NUMERIC_DEFAULT_UNIT (default: kg).
    Nr¯   ú(\d+(?:\.\d+)?)r>   z[a-zA-Z]ÚWEIGHT_NUMERIC_DEFAULT_UNITÚkgg     @�@ÚtonÚlbgøŠn½¦Ý?)rÆ   rÇ   ÚreÚsearchrÅ   ÚgrouprÊ   rË   ÚlowerÚboolÚgetattrÚdjango_settings)Úweight_textÚ
weight_strÚmatchÚvalueÚ	unit_textÚhas_lettersÚdefault_units          rŽ   Ú_extract_weight_valuerý     s'  € ð Ð˜k¨RÒ/Øä�[Ó!×'Ñ'Ó)€JÜ�I‰IÐ(¨*Ó5€EÙØðÜ�e—k‘k !“nÓ%ˆð × Ñ Ó"€IÜ”r—y‘y ¨iÓ8Ó9€KÜ”wœÐ0MÈtÓTÓU×[Ñ[Ó]×cÑcÓe€Lð ˆyÑØ�v‰~ÐØ�	ÑØˆØˆyÑØ˜Ñ  FÑ*Ð*ñ Ø˜4ÒØ˜6‘>Ð!Øˆð �tÒØ�v‰~ÐØ€Løô1 ”zÐ"ò Ùðús   ¼C0 Ã0DÄDc                 óB  — | j                   t        j                  j                  k7  ryt        j
                  j                  | t        j                  j                  ¬«      j                  «       ryt        j
                  j                  | ¬«      j                  «       ryy)NT)ÚshipmentÚstatus©rÿ   F)
r   r   ÚStatusÚ	PUBLISHEDr   rž   rœ   ÚACCEPTEDr�   r   r  s    rŽ   Ú_is_bid_lockedr  4  sl   € Ø‡�œ(Ÿ/™/×3Ñ3Ò3ØÜ
‡{�{×Ñ 8´C·J±J×4GÑ4GÐÓH×OÑOÔQØÜ‡|�|×Ñ HÐÓ-×4Ñ4Ô6ØØr�   c                 óŠ   — t         j                  j                  | |t        ¬«      j	                  dd«      j                  «       S )N)rÿ   r¶   Ú
status__inú-updated_atú-id)r   rž   rœ   ÚACTIVE_BID_STATUSESÚorder_byÚfirst©rÿ   r¶   s     rŽ   Ú_get_active_bidr  E  s<   € ä�‰×ÑØØ)Ü*ð 	ó 	
÷
 
‰�- Ó	'ß	‰‹ðr�   c                 ó®   — | j                   | j                  | j                  j                  t	        | j
                  «      t        | j                  «      dœS )N)Úbid_idÚtrip_idÚ	unique_idÚagreed_priceÚcurrency)Úaccepted_bid_idrÎ   rÿ   r  rÆ   r  r1   ©Útrips    rŽ   Ú_bid_accept_response_datar  Q  sC   € à×&Ñ&Ø—7‘7Ø—]‘]×,Ñ,Ü˜D×-Ñ-Ó.Ü)¨$¯-©-Ó8ñð r�   c                 óZ   — | €yt        | «      j                  «       j                  «       dv S )NF)Ú1ÚtrueÚyesÚon)rÆ   rÇ   rò   )rù   s    rŽ   Ú_truthy_query_paramr  [  s,   € Ø€}ØÜˆu‹:×ÑÓ×#Ñ#Ó%Ð)CÐCÐCr�   c                 óÖ   — | sy t        j                  dt        | «      «      }t        |«      dk  ry 	 t	        d„ |d d D «       «      }|d   |d   |d   fS # t
        t        f$ r Y y w xY w)Nrê   r²   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr£   )rÅ   )r¥   rÁ   s     rŽ   r¨   z,_extract_dimension_triple.<locals>.<genexpr>h  s   è ø€ Ò1 1”e˜A—hÑ1ùs   ‚r   r>   r~   )rï   ÚfindallrÆ   ÚlenÚsortedrÊ   rË   )ÚtextÚnumsÚvalss      rŽ   Ú_extract_dimension_tripler'  a  sv   € ÙØÜ�:‰:Ð(¬#¨d«)Ó4€DÜ
ˆ4ƒy�1‚}ØðÜÑ1¨¨R¨a¨Ô1Ó1ˆØ�A‰w˜˜Q™  a¡Ð(Ð(øÜ”zÐ"ò Ùðús   ³"A ÁA(Á'A(c                 ó"  — | j                   �| j                  �| j                  €y 	 t        t	        | j                   «      t	        | j                  «      t	        | j                  «      g«      }|d   |d   |d   fS # t
        t        f$ r Y y w xY w)Nr   r>   r~   )Úmax_length_mÚmax_width_mÚmax_height_mr#  rÅ   rÊ   rË   )Úvehicler&  s     rŽ   Ú_vehicle_max_dims_sortedr-  n  s—   € Ø×ÑÐ# w×':Ñ':Ð'BÀg×FZÑFZÐFbØðÜÜ�'×&Ñ&Ó'Ü�'×%Ñ%Ó&Ü�'×&Ñ&Ó'ð
ó ˆð
 �A‰w˜˜Q™  a¡Ð(Ð(øÜ”zÐ"ò Ùðús   §AA< Á<BÂBc                 óŠ   — t        | j                  «      }t        |«      }|�|€yt        ||«      D ]  \  }}||dz   kD  sŒ y y)NTg•Ö&è.>F)r'  Ú
dimensionsr-  Úzip)rÿ   r,  Ús_dimsÚv_dimsÚsvÚvvs         rŽ   Ú_dims_compatibler5  |  sU   € Ü& x×':Ñ':Ó;€FÜ% gÓ.€FØ€~˜˜ØÜ�f˜fÓ%ò ‰ˆˆBØ��T‘	‹>Ùðð r�   c           
      ór  — | j                   }t        j                  j                  t        j                  j                  t        j                  j
                  t        j                  j
                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  t        j                  j                  i}|j                  |«      }|€y ||_
        |j                  ddg¬«       y )Nr   Ú
updated_at©Úupdate_fields)rÿ   r   r  ÚEN_ROUTEr   ÚLOADEDÚ
IN_TRANSITÚ	DELIVEREDÚ	COMPLETEDrÈ   r   Úsave)r  Únew_trip_statusrÿ   ÚmappingÚtargets        rŽ   Ú_sync_shipment_status_from_triprC  ’  sÁ   € Ø�}‰}€Hä�‰×ÑœhŸo™o×6Ñ6Ü�‰×ÑœHŸO™O×2Ñ2Ü�‰×Ñ¤§¡× :Ñ :Ü�‰×ÑœxŸ™×8Ñ8Ü�‰×ÑœxŸ™×8Ñ8ð€Gð �[‰[˜Ó)€FØ€~ØØ€H„OØ‡M�M ¨<Ð 8€MÕ9r�   c                ó8   — t        t        | |«      ||||¬«       y )N©ÚtitleÚbody)rK   rL   )r  ÚactorÚ
event_typeÚpayloadrF  rG  s         rŽ   Ú_notify_trip_progressrK  ¢  s    € ÜÜ% d¨EÓ2ØØØØör�   c                 óÔ   — t         j                  j                  | | j                  |d|i¬«      \  }}|r3|j                  |j
                  k7  r||_        |j                  dg¬«       |S )Nr  )rÿ   ÚshipperÚtransporterÚdefaultsr8  )r!   rž   Úget_or_createrM  r  rÎ   r  r?  )rÿ   rN  r  ÚconvÚ_s        rŽ   Ú'_get_or_create_negotiation_conversationrS  ¬  sg   € Ü×"Ñ"×0Ñ0ØØ× Ñ ØØ˜$�ð	 1ó �G€Dˆ!ñ �—‘ §¡Ò'ØˆŒ	Ø�	‰	  ˆ	Ô)Ø€Kr�   c                 óä   — t        | dd «      }|�|j                  S | j                  rIt        j                  j                  | j                  ¬«      j                  dd¬«      j                  «       S y )Nr  ©ÚpkÚassigned_driver_idT©Úflat)rô   rW  r  r   rž   rœ   Úvalues_listr  )Úconversationr  s     rŽ   Ú _conversation_assigned_driver_idr\  ¹  sf   € Ü�< ¨Ó.€DØÐØ×&Ñ&Ð&Ø×Òä�L‰L×Ñ <×#7Ñ#7ÐÓ8ß‰[Ð-°Dˆ[Ó9ß‰U‹Wð	
ð
 r�   c                 óš   — | j                   |j                  |j                  fv ryt        |«      }t	        |xr | j                   |k(  «      S )NT)rÎ   Ú
shipper_idr¶   r\  ró   )rŸ   r[  rW  s      rŽ   Ú_user_can_access_conversationr_  Æ  sH   € Ø‡w�w�<×*Ñ*¨L×,GÑ,GÐHÑHØÜ9¸,ÓGÐÜÐ"ÒD t§w¡wÐ2DÑ'DÓEÐEr�   c                 óJ  — t        «       }| j                  r*| j                  |k7  r|j                  | j                  «       | j                  r*| j                  |k7  r|j                  | j                  «       t	        | «      }|r||k7  r|j                  |«       t        |«      S )zVNotify shipper, fleet owner/transporter, and assigned fleet driver (excluding sender).)Úsetr^  Úaddr¶   r\  Úlist)r[  Ú	sender_idÚrecipient_idsrW  s       rŽ   Ú#_conversation_message_recipient_idsrf  Í  s�   € ä“E€MØ×Ò <×#:Ñ#:¸iÒ#GØ×Ñ˜,×1Ñ1Ô2Ø×"Ò" |×'BÑ'BÀiÒ'OØ×Ñ˜,×5Ñ5Ô6Ü9¸,ÓGÐÙÐ0°IÒ=Ø×ÑÐ,Ô-Ü�ÓÐr�   c                 óv  — |j                   | j                  k(  rU| j                  }d}t        |dd «      }|r|j                  nd|r|j
                  nd |rt        |j                  «      nddœ}nl| j                  }d}t        |dd «      }|r|j                  nd|r|j
                  nd |rt        |j                  «      nd|rt        |j                  «      nddœ}d}	 |j                  j                  xs d}|j                   |j                  |j                  |j                   |||d	œS # t        $ r d}Y Œ?w xY w)
NÚTRANSPORTERÚtransporter_profiler¯   F)r»   Úaccount_typerÞ   ÚSHIPPERÚshipper_profile)r»   rj  Úkyc_verifiedÚcredit_approved)rÎ   r·   r¸   r¹   rº   rÌ   rØ   )rÎ   r^  rN  rô   r»   rj  ró   rÞ   rM  rm  rn  rÌ   rº   rÉ   r·   r¸   r¹   )r[  ÚviewerÚotherrÌ   rØ   Úprofile_datarº   s          rŽ   Ú_chat_counterparty_payloadrr  Ú  s6  € Ø‡y�y�L×+Ñ+Ò+Ø×(Ñ(ˆØˆÜ˜%Ð!6¸Ó=ˆá4;˜G×0Ò0ÀÙ4;˜G×0Ò0ÀÙFM¤$ w×'AÑ'AÔ"BÐSXñ
‰ð ×$Ñ$ˆØˆÜ˜%Ð!2°DÓ9ˆá4;˜G×0Ò0ÀÙ4;˜G×0Ò0ÀÙ:AœD ×!5Ñ!5Ô6ÀuÙ@Gœt G×$;Ñ$;Ô<ÈUñ	
ˆð €EðØ—
‘
× Ñ Ò& Bˆð �h‰hØ—‘Ø×&Ñ&Ø—_‘_ØØØñð øô ò ØŠðús   ÃD* Ä*D8Ä7D8c                 ó6   — | j                   xs | j                  S r£   )r  rÎ   r  s    rŽ   Ú_shipment_labelrt  ÿ  s   € Ø×ÑÒ, §¡Ð,r�   c                 ób  — | j                   }t        | j                  «      t        | j                  «      t        | j                  «      t        |j
                  xs d«      t        |«      t        | j                  «      dœ}|r|j                  |«       t        | j                  g||||¬«       y)zLPush + in-app notification to the transporter/individual driver on this bid.r¯   )Úshipment_idr  r¶   r  r  ÚamountrE  N)
rÿ   rÆ   rv  rÎ   r¶   r  r1   rw  ÚupdaterK   )ÚbidrI  rF  rG  Úextrarÿ   rJ  s          rŽ   Ú&_notify_transporter_shipper_bid_actionr{    sŽ   € à�|‰|€Hä˜3Ÿ?™?Ó+Ü�c—f‘f“+Ü˜c×0Ñ0Ó1Ü˜×+Ñ+Ò1¨rÓ2Ü)¨(Ó3Ü�c—j‘j“/ñ€Gñ Ø�‰�uÔÜØ	×	Ñ	ÐØØØØör�   c                 óø   — t        | dd«      }|sy|j                  t        j                  j                  k(  ry|j                  t        j                  j
                  t        j                  j                  fv r| S y)z>Individual / fleet-linked drivers execute the trip themselves.ri  N)rô   rj  r   rã   ÚFLEET_OWNERrä   rå   )rN  rØ   s     rŽ   Ú%_trip_assigned_driver_for_transporterr~    sq   € ä�kÐ#8¸$Ó?€GÙØØ×ÑÔ1×=Ñ=×IÑIÒIØØ×ÑÜ×&Ñ&×-Ñ-Ü×&Ñ&×9Ñ9ð ñ ð ÐØr�   c                 ó¬  — | j                   }|j                  }|j                  «       xs |j                  }t	        |j
                  gdt        | j                  «      t        |j                  «      t        |j                  «      t        |j                  «      t        | j                  «      dœd|› d|j                  xs |j                  › d�¬«       y )NÚbid_accepted)r  rv  r  r¶   r  zTransporter assigned to loadz accepted your load #ú.rE  )
rÿ   rN  Úget_full_namer·   rK   r^  rÆ   rÎ   r  r  )r  ry  rÿ   rN  Úlabels        rŽ   Ú)_notify_shipper_transporter_assigned_tripr„  (  s«   € Ø�}‰}€HØ—/‘/€KØ×%Ñ%Ó'Ò<¨;×+<Ñ+<€EÜØ	×	Ñ	ÐØä˜4Ÿ7™7“|Ü˜xŸ{™{Ó+Ü˜#Ÿ&™&“kÜ! +§.¡.Ó1Ü × 1Ñ 1Ó2ñ	
ð -ØˆwÐ+¨H×,>Ñ,>Ò,MÀ(Ç+Á+Ð+NÈaÐPör�   c                 ó°   — t        | «      j                  }|j                  |d<   |j                  j                  |d<   t        |j                  «      |d<   |S )Nr  r  r  )r\   ÚdatarÎ   rÿ   r  rÆ   r  )ry  r  r†  s      rŽ   Ú#_transporter_bid_response_with_tripr‡  ;  sM   € Ü˜sÓ#×(Ñ(€DØ—g‘g€Dˆ�OØŸ™×/Ñ/€DˆÑÜ˜t×0Ñ0Ó1€DˆÑØ€Kr�   c                 ó4   — t        | «      }t        || «       |S )uP   Transporter/individual driver accepted terms â€” assign trip and notify shipper.)Ú_accept_bid_and_create_tripr„  )ry  r  s     rŽ   Ú(_create_trip_from_transporter_bid_acceptrŠ  C  s   € ä& sÓ+€DÜ-¨d°CÔ8Ø€Kr�   c                 ó^  — | j                   t        j                  j                  k(  rt	        d«      ‚| j                   t        j                  j
                  t        j                  j                  fvrt	        d«      ‚| j                  }|j                   t        j                  j                  k7  rt	        d«      ‚t        j                  j                  t        | j                  ¬«      t        | j                  ¬«      z  dd¬«      }|j                  «       st	        d«      ‚t!        | «      }t#        | j                  «      }t        j                  j$                  | _         | j'                  d	d
g¬«       t        j                  j(                  |_         |j'                  d	d
g¬«       t*        j                  j-                  || | j                  ||t*        j                  j(                  ¬«      }t/        |t*        j                  j(                  «       t1        || j                  |¬«       |S )Nz@Transporter must respond to the counter-offer before acceptance.zBid cannot be accepted.z#Shipment is not in published state.r—   r™   Tr”   zBTransporter has no eligible verified active vehicle for this load.r   r7  r8  )rÿ   Úaccepted_bidrN  rš   r  r   r  )r   r   r  Ú	COUNTEREDrË   ÚPENDINGÚAGREEDrÿ   r   r  r   rž   rœ   r
   rN  r�   r=   r~  r  r?  ÚASSIGNEDr   ÚcreaterM   rS  )ry  rÿ   Úeligible_vehiclesr  rš   r  s         rŽ   r‰  r‰  J  s˜  € Ø
‡z�z”S—Z‘Z×)Ñ)Ò)ÜÐ[Ó\Ð\Ø
‡z�zœ#Ÿ*™*×,Ñ,¬c¯j©j×.?Ñ.?Ð@Ñ@ÜÐ2Ó3Ð3Ø�|‰|€HØ‡�œ(Ÿ/™/×3Ñ3Ò3ÜÐ>Ó?Ð?ÜŸ™×.Ñ.Ü	�—‘Ô ¤1°S·_±_Ô#EÑEØØð /ó Ðð
 ×#Ñ#Ô%ÜÐ]Ó^Ð^ä,¨SÓ1€LÜ;¸C¿O¹OÓL€OÜ—‘×$Ñ$€C„JØ‡H�H˜H lÐ3€HÔ4Ü—o‘o×.Ñ.€H„OØ‡M�M ¨<Ð 8€MÔ9Ü�<‰<×ÑØØØ—O‘OØ'Ø!Ü�{‰{×#Ñ#ð ó €Dô �tœTŸ[™[×1Ñ1Ô2Ü+¨H°c·o±oÈDÕQØ€Kr�   c                 óT  — t         j                  }| j                  d«      }| j                  d«      }|r|�|€y| j                  d«      }|�Í|}t        |t        «      rR	 t        j                  |j                  dd«      «      }t        j                  |«      rt        j                  |«      n|}t        j                  |«      st        j                  |«      }t        j                  «       |z
  j                  «       }|t         j                  kD  ry|d	k  ry
y # t        $ r Y yw xY w)Nr´   rµ   zAlat and lon are required when TRIP_STATUS_REQUIRE_GPS is enabled.Úrecorded_atÚZú+00:00z.recorded_at must be a valid ISO-8601 datetime.z+recorded_at is too old for this transition.iˆÿÿÿz(recorded_at cannot be far in the future.)rõ   ÚTRIP_STATUS_REQUIRE_GPSrÈ   Ú
isinstancerÆ   r   ÚfromisoformatÚreplacer   Úis_naiveÚ
make_awarerË   Úis_awareÚnowÚtotal_secondsÚ$TRIP_STATUS_MAX_LOCATION_AGE_SECONDS)Úrequest_dataÚrequire_gpsr´   rµ   r”  ÚraÚages          rŽ   Ú_validate_trip_status_gps_timer¥  m  s  € Ü!×9Ñ9€KØ
×
Ñ
˜5Ó
!€CØ
×
Ñ
˜5Ó
!€CÙØˆ;˜#˜+ØVØ×"Ñ" =Ó1€KØÐØˆÜ�bœ#ÔðHÜ×+Ñ+¨B¯J©J°s¸HÓ,EÓF�Ü08×0AÑ0AÀ"Ô0E”X×(Ñ(¨Ô,È2�ô × Ñ  Ô$Ü×$Ñ$ RÓ(ˆBÜ�|‰|‹~ Ñ"×1Ñ1Ó3ˆØ”×EÑEÒEØ@Ø�Š:Ø=Øøô ò HÙGðHús   Á AD Ä	D'Ä&D'c                 ó¶  — 	 | j                   j                   }|t        j                  j                  k(  ry|t        j                  j
                  k(  ry|t        j                  j                  k7  r|S 	 | j                  }|j                  t        j                  j                  k(  ry|j                  t        j                  j                  k(  ry|j                  t        j                  j                  k(  r1t        j                  j!                  | d¬«      j#                  «       ryy	y# t        j                  $ r Y yw xY w# t        j                  $ r Y yw xY w)
zÎ
    Client-facing persona for routing (transporter sub-roles).
    Values: SHIPPER, ADMIN, TRANSPORTER_FLEET_OWNER, TRANSPORTER_FLEET_DRIVER,
    TRANSPORTER_INDIVIDUAL_DRIVER, TRANSPORTER (fallback).
    Nrk  ÚADMINrh  ÚTRANSPORTER_FLEET_OWNERÚTRANSPORTER_FLEET_DRIVERT)Údriverr–   ÚTRANSPORTER_INDIVIDUAL_DRIVER)rÌ   r   ÚDoesNotExistÚRolerk  r§  rh  ri  r   rj  rã   r}  rå   rä   r   rž   rœ   r�   )rŸ   rÌ   rØ   s      rŽ   Ú_login_persona_typer®  ‡  s  € ðØ�y‰y�~‰~ˆð Œx�}‰}×$Ñ$Ò$ØØŒx�}‰}×"Ñ"Ò"ØØŒx�}‰}×(Ñ(Ò(ØˆðØ×*Ñ*ˆð ×ÑÔ1×=Ñ=×IÑIÒIØ(Ø×ÑÔ1×=Ñ=×PÑPÒPØ)Ø×ÑÔ1×=Ñ=×DÑDÒDÜ ×(Ñ(×/Ñ/°tÀtÐ/ÓL×SÑSÔUØ-Ø.Øøô) × Ñ ò Ùðûô ×*Ñ*ò Ùðús#   ‚D) Á4E Ä)D?Ä>D?ÅEÅEÚGETc                 óz   — ddl m}  |«       }|j                  d«      st        ddd¬«      S t        dd	d
|i¬«      S )zAPublic Firebase web/mobile client config (not the Admin SDK key).r   )Úget_firebase_client_configÚ	projectIdi÷  z)Firebase client config is not configured.zNot configured.©ÚerroréÈ   zFirebase client config.Úfirebase©r†  )ÚLoadboard.firebase_configr±  rÈ   rG   )Úrequestr±  Úconfigs      rŽ   Úfirebase_client_configr»  ¦  sB   € õ Eá'Ó)€FØ�:‰:�kÔ"Ü˜CÐ!LÐTeÔfÐfÜ˜Ð6¸jÈ&Ð=QÔRÐRr�   ÚPOSTc                 ó
  — | j                   j                  d«      xs dj                  «       j                  «       }| j                   j                  d«      }|st	        ddd¬«      S |st	        ddd	¬«      S t        | ||¬
«      }|st	        ddd¬«      S |j                  st	        ddd¬«      S t        j                  j                  |¬«      \  }}d}d}d}d}		 |j                  j                  }|t        j                  j                  k(  rq	 |j                  }
|
j                   }|
j                   t"        j$                  j&                  t"        j$                  j(                  fv r|
j*                  }|
j,                  }	t	        dd|j.                  |j0                  |j2                  |j4                  |j6                  |t9        |«      |||	dœ
¬«      S # t        j                  $ r Y Œ÷w xY w# t"        j                  $ r Y Œ‚w xY w)z;Login with email and password. Returns token and user info.r·   r¯   Úpasswordé�  úEmail is required.úMissing email.r³  zPassword is required.úMissing password.)Úusernamer¾  i‘  zInvalid email or password.zInvalid credentials.zAccount is disabled.úAccount disabled.©rŸ   Nrµ  zLogin successful.)
ÚtokenÚuser_idr·   r¸   r¹   rÌ   Úpersona_typerj  r¼   Útc_u_idr·  )r†  rÈ   rÇ   rò   rG   r   r–   r   rž   rP  rÌ   r   r¬  r­  rh  ri  rj  r   rã   rä   rå   r¼   rÉ  rÄ   rÎ   r·   r¸   r¹   r®  )r¹  r·   r¾  rŸ   rÆ  rR  rÌ   Útransporter_account_typer¼   rÉ  rØ   s              rŽ   Ú
auth_loginrË  ³  sß  € ð �\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5×;Ñ;Ó=€EØ�|‰|×Ñ 
Ó+€HÙÜ˜CÐ!5Ð=MÔNÐNÙÜ˜CÐ!8Ð@SÔTÐTÜ˜¨%¸(ÔC€DÙÜ˜CÐ!=ÐE[Ô\Ð\Ø�>Š>Ü˜CÐ!7Ð?RÔSÐSÜ�}‰}×*Ñ*°Ð*Ó5�H€Eˆ1Ø€DØ#ÐØ€EØ€GðØ�y‰y�~‰~ˆð Œx�}‰}×(Ñ(Ò(ð
	Ø×.Ñ.ˆGØ'.×';Ñ';Ð$Ø×#Ñ#Ü"×.Ñ.×5Ñ5Ü"×.Ñ.×AÑAð(ñ ð  Ÿ™�Ø!Ÿ/™/�ô ˜Ð0Ø—‘Ø—7‘7Ø—‘Ø—o‘oØ—^‘^ØÜ+¨DÓ1Ø0ØØñ8ô ð øô × Ñ ò Ùðûô "×.Ñ.ò 	Ùð	ús%   ÃG ÄA0G, ÇG)Ç(G)Ç,HÈHc                 ó‚   — 	 | j                   j                  j                  «        t	        dd«      S # t        $ r Y Œw xY w)z!Logout: delete the current token.rµ  zLogged out successfully.)rŸ   Ú
auth_tokenÚdeleterÉ   rG   ©r¹  s    rŽ   Úauth_logoutrÐ  å  sA   € ðØ�‰×Ñ×&Ñ&Ô(ô ˜Ð7Ó8Ð8øô ò Ùðús   ‚$2 ²	>½>c                 ó\  — d}| j                   › d| j                  › �j                  «       xs | j                  }d|› d|› d|› d�}t	        t
        dd«      }	 d	d
lm}  ||||| j                  gd¬«       y# t        $ r+}t        j                  d| j                  |«       Y d}~yd}~ww xY w)zDSend password reset OTP email using configured Django email backend.z!Your Truck Me Password Reset Codeú zHello zV,

We received a request to reset your Truck Me password.

Your verification code is: z

This code will expire in z™ minutes. Please do not share this code with anyone.

If you did not request a password reset, please ignore this email.

Best regards,
The Truck Me TeamÚDEFAULT_FROM_EMAILzno-reply@truckme.comr   )Ú	send_mailF)Úfail_silentlyTz-Failed to send password reset email to %s: %sN)r¸   r¹   rÇ   r·   rô   rõ   Údjango.core.mailrÔ  rÉ   ÚloggerÚwarning)	rŸ   Úotp_codeÚexpires_minutesÚsubjectÚnameÚmessageÚ
from_emailrÔ  Úexcs	            rŽ   Ú_send_password_reset_otp_emailrà  ñ  sº   € à1€GØ�o‰oÐ˜a §¡Ð/Ð0×6Ñ6Ó8ÒF¸D¿J¹J€Dà
��ð &à&. Zð 0$Ø$3Ð#4ð 5ð	ð ô œÐ*>Ð@VÓW€JðÝ.Ù�'˜7 J°·±°ÈEÕRØøÜò Ü�‰ÐFÈÏ
É
ÐTWÔXÜûðús   ÁA7 Á7	B+Â !B&Â&B+c                 ó4  — | j                   j                  d«      xs dj                  «       j                  «       }|st	        ddd¬«      S t
        j                  j                  t        |¬«      t        |¬«      z  «      j                  «       }|st	        d	d
d¬«      S |j                  st	        ddd¬«      S t        j                  d«      dz   › }t        j                  d«      }t        j                  j                  |d¬«      j                  d¬«       t!        j"                  «       t!        j$                  d¬«      z   }t        j                  j'                  ||j(                  |||¬«       t+        ||d¬«       t	        ddd|j(                  i¬«      S )z�
    Request password reset OTP.
    Covers shippers, fleet owners, individual drivers, and transporter drivers.
    Body: {"email": "user@example.com"}
    r·   r¯   r¿  rÀ  rÁ  r³  ©Úemail__iexact©Úusername__iexacté”  ú)No account found with this email address.úUser not found.zThis account is disabled.rÄ  i » i † é    F©rŸ   Úis_usedT)rë  é   )Úminutes)rŸ   r·   ÚotprÆ  Ú
expires_at)rÚ  rµ  z0Password reset code has been sent to your email.r·  )r†  rÈ   rÇ   rò   rG   ÚUserrž   rœ   r
   r  r–   ÚsecretsÚ	randbelowÚtoken_urlsafer   rx  r   rž  Ú	timedeltar‘  r·   rà  )r¹  r·   rŸ   rÙ  Úreset_tokenrï  s         rŽ   Úauth_forgot_passwordrö    sb  € ð �\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5×;Ñ;Ó=€EÙÜ˜CÐ!5Ð=MÔNÐNä�<‰<×Ñœq¨uÔ5¼È5Ô8QÑQÓR×XÑXÓZ€DÙÜ˜CÐ!LÐTeÔfÐfà�>Š>Ü˜CÐ!<ÐDWÔXÐXä×#Ñ# FÓ+¨fÑ4Ð5€HÜ×'Ñ'¨Ó+€Kô ×Ñ×#Ñ#¨°uÐ#Ó=×DÑDÈTÐDÔRä—‘“¤(×"4Ñ"4¸RÔ"@Ñ@€JÜ×Ñ×#Ñ#ØØ�j‰jØØØð $ô ô # 4¨À2ÕFä˜ÐOØ�—‘ðWô ð r�   c                 ó   — | j                   j                  d«      xs dj                  «       j                  «       }| j                   j                  d«      xs | j                   j                  d«      xs dj                  «       }|st	        ddd¬«      S |st	        dd	d
¬«      S t
        j                  j                  t        |¬«      t        |¬«      z  «      j                  «       }|st	        ddd¬«      S t        j                  j                  ||d¬«      j                  d«      j                  «       }|r!|j                  t        j                  «       k  rt	        ddd¬«      S t	        dd|j                  |j                   ddœ¬«      S )ze
    Verify 6-digit password reset OTP.
    Body: {"email": "user@example.com", "otp": "123456"}
    r·   r¯   rî  Úcoder¿  rÀ  rÁ  r³  zVerification code is required.zMissing OTP.râ  rä  ræ  rç  rè  F)rŸ   rî  rë  ú-created_atú%Invalid or expired verification code.zInvalid OTP.rµ  z(Verification code verified successfully.T)r·   rõ  Úverifiedr·  )r†  rÈ   rÇ   rò   rG   rð  rž   rœ   r
   r  r   r  rï  r   rž  r·   rÆ  )r¹  r·   rÙ  rŸ   Ú
otp_records        rŽ   Úauth_verify_reset_otprý  1  sY  € ð �\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5×;Ñ;Ó=€EØ—‘× Ñ  Ó'ÒI¨7¯<©<×+;Ñ+;¸FÓ+CÒIÀr×PÑPÓR€HáÜ˜CÐ!5Ð=MÔNÐNÙÜ˜CÐ!AÈÔXÐXä�<‰<×Ñœq¨uÔ5¼È5Ô8QÑQÓR×XÑXÓZ€DÙÜ˜CÐ!LÐTeÔfÐfä!×)Ñ)×0Ñ0ØØØð 1ó ÷ �hˆ}ÓŸe™e›gð	 ñ ˜×.Ñ.´(·,±,³.Ò@Ü˜CÐ!HÐP^Ô_Ð_ä˜ÐGØ—‘Ø!×'Ñ'ØñOô ð r�   c                 ó   — | j                   j                  d«      xs dj                  «       j                  «       }| j                   j                  d«      xs | j                   j                  d«      xs dj                  «       }| j                   j                  d«      xs dj                  «       }| j                   j                  d«      xs | j                   j                  d«      }|st	        dd	d
¬«      S |s|st	        ddd¬«      S |st	        ddd¬«      S t        t        |«      «      dk  rt	        ddd¬«      S t        j                  j                  t        |¬«      t        |¬«      z  «      j                  «       }|st	        ddd¬«      S t        |d¬«      }|r|t        |¬«      z  }|r|t        |¬«      z  }t        j                  j                  |«      j                  d«      j                  «       }|r!|j                  t        j                   «       k  rt	        ddd¬«      S |j#                  |«       |j%                  dg¬«       d |_        |j%                  d!g¬«       t(        j                  j                  |¬"«      j+                  «        t(        j                  j-                  |¬"«      \  }}	d#}
d#}	 |j.                  j.                  }
|
t0        j4                  j6                  k(  r	 |j8                  }|j:                  }t	        d$d%|j>                  |j@                  |jB                  |
tE        |«      |d&œ¬'«      S # t0        j2                  $ r Y Œ‡w xY w# t<        j2                  $ r Y Œjw xY w)(a  
    Reset password with verified OTP or reset_token.
    Body: {"email": "user@example.com", "otp": "123456", "new_password": "NewSecurePassword123"}
       or {"email": "user@example.com", "reset_token": "...", "new_password": "NewSecurePassword123"}
    r·   r¯   rî  rø  rõ  Únew_passwordr¾  r¿  rÀ  rÁ  r³  z-Verification code or reset_token is required.zMissing verification.zNew password is required.rÂ  é   z,Password must be at least 8 characters long.zPassword too short.râ  rä  ræ  rç  rè  Frê  )rî  )rÆ  rù  rú  zInvalid verification.r8  Trë  rÅ  Nrµ  z%Password has been reset successfully.)rÆ  rÇ  r·   rÌ   rÈ  rj  r·  )#r†  rÈ   rÇ   rò   rG   r"  rÆ   rð  rž   rœ   r
   r  r   r  rï  r   rž  Úset_passwordr?  rë  r   rÎ  rP  rÌ   r   r¬  r­  rh  ri  rj  r   rÄ   rÎ   r·   r®  )r¹  r·   rÙ  rõ  rÿ  rŸ   Úqueryrü  rÆ  rR  rÌ   rÊ  rØ   s                rŽ   Úauth_reset_passwordr  T  s  € ð �\‰\×Ñ˜gÓ&Ò,¨"×3Ñ3Ó5×;Ñ;Ó=€EØ—‘× Ñ  Ó'ÒI¨7¯<©<×+;Ñ+;¸FÓ+CÒIÀr×PÑPÓR€HØ—<‘<×#Ñ# MÓ2Ò8°b×?Ñ?ÓA€KØ—<‘<×#Ñ# NÓ3ÒS°w·|±|×7GÑ7GÈ
Ó7S€LáÜ˜CÐ!5Ð=MÔNÐNÙ™KÜ˜CÐ!PÐXoÔpÐpÙÜ˜CÐ!<ÐDWÔXÐXÜ
Œ3ˆ|ÓÓ Ò!Ü˜CÐ!OÐWlÔmÐmä�<‰<×Ñœq¨uÔ5¼È5Ô8QÑQÓR×XÑXÓZ€DÙÜ˜CÐ!LÐTeÔfÐfä�4 Ô'€EÙØ”�x”Ñ ˆÙØ”˜Ô%Ñ%ˆä!×)Ñ)×0Ñ0°Ó7×@Ñ@ÀÓO×UÑUÓW€Já˜×.Ñ.´(·,±,³.Ò@Ü˜CÐ!HÐPgÔhÐhð 	×Ñ�lÔ#Ø‡I�I˜Z˜L€IÔ)ð €JÔØ‡O�O 9 +€OÔ.ô 
‡M�M×Ñ˜dÐÓ#×*Ñ*Ô,Ü�}‰}×*Ñ*°Ð*Ó5�H€Eˆ1à€DØ#ÐðØ�y‰y�~‰~ˆð Œx�}‰}×(Ñ(Ò(ð	Ø×.Ñ.ˆGØ'.×';Ñ';Ð$ô ˜ÐDØ—‘Ø—7‘7Ø—‘ØÜ+¨DÓ1Ø0ñLô ð øô × Ñ ò Ùðûô "×.Ñ.ò 	Ùð	ús$   ËM Ë:M' ÍM$Í#M$Í'M=Í<M=c                 óD  — t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j                  «       }t        j                  j                  |¬«      \  }}t        dd|j                  |j                  |j                  dœ¬«      S )	Nr·  r¿  úValidation failed.r³  rÅ  éÉ   z Shipper registered successfully.©rÆ  rÇ  r·   )rN   r†  Úis_validrG   Úerrorsr?  r   rž   rP  rÄ   rÎ   r·   ©r¹  ÚserrŸ   rÆ  rR  s        rŽ   Úshipper_registerr  ž  s‚   € ô $¨¯©Ô
6€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ�8‰8‹:€DÜ�}‰}×*Ñ*°Ð*Ó5�H€Eˆ1Ü˜Ð?Ø—‘Ø—7‘7Ø—‘ñGô ð r�   c                   ó    — e Zd ZeegZd„ Zd„ Zy)ÚShipperProfileViewc                 óÄ   — 	 |j                   j                  }t        |«      }t	        dd|j                  ¬«      S # t        j                  $ r t	        ddd¬«      cY S w xY w)Nræ  úShipper profile not found.ú
Not found.r³  rµ  úProfile retrieved successfully.r·  )rŸ   rl  r   r¬  rG   rO   r†  ©Úselfr¹  rØ   r  s       rŽ   rÈ   zShipperProfileView.get±  s`   € ð	WØ—l‘l×2Ñ2ˆGô ' wÓ/ˆÜ˜CÐ!BÈÏÉÔRÐRøô ×*Ñ*ò 	WÜ Ð%AÈÔVÒVð	Wús   ‚; »!AÁAc                 óN  — 	 |j                   j                  }t        ||j                  d¬«      }|j                  «       st	        dd|j                  ¬«      S |j                  «        t	        d	d
|j                  ¬«      S # t        j                  $ r t	        ddd¬«      cY S w xY w)Nræ  r  r  r³  T©r†  Úpartialr¿  r  rµ  úProfile updated successfully.r·  )
rŸ   rl  r   r¬  rG   rO   r†  r  r	  r?  r  s       rŽ   ÚpatchzShipperProfileView.patch¹  sŽ   € ð	WØ—l‘l×2Ñ2ˆGô ' w°W·\±\È4ÔPˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØ�‰Œ
Ü˜CÐ!@ÀsÇxÁxÔPÐPøô ×*Ñ*ò 	WÜ Ð%AÈÔVÒVð	Wús   ‚B  Â !B$Â#B$N)Ú__name__Ú
__module__Ú__qualname__r   rC   r   rÈ   r  r¤   r�   rŽ   r  r  ®  s   „ Ø)¨9Ð5ÐòSó	Qr�   r  c                   ó&   — e Zd ZeegZd„ Zd„ Zd„ Zy)ÚKYCDocumentListCreatec                 óˆ   — t         j                  j                  | j                  j                  ¬«      j                  d«      S )NrÅ  ú-submitted_at)r   rž   rœ   r¹  rŸ   r  ©r  s    rŽ   Úget_querysetz"KYCDocumentListCreate.get_querysetÉ  s1   € Ü×"Ñ"×)Ñ)¨t¯|©|×/@Ñ/@Ð)ÓA×JÑJÈ?Ó[Ð[r�   c                 ór   — | j                  «       }t        |dd|i¬«      }t        dd|j                  ¬«      S )NTr¹  ©ÚmanyÚcontextrµ  z%KYC documents retrieved successfully.r·  ©r"  rT   rG   r†  ©r  r¹  ÚargsÚkwargsr«   r  s         rŽ   rc  zKYCDocumentListCreate.listÌ  s7   € Ø×ÑÓ ˆÜ# B¨T¸IÀwÐ;OÔPˆÜ˜CÐ!HÈsÏxÉxÔXÐXr�   c           	      ó:  — t        |j                  ||j                  dœ¬«      }|j                  «       st	        dd|j
                  ¬«      S dt        j                  «       j                  d«      › �}t        |«       |j                  |j                  ¬«      }	 |j                  j                  }|j                  s,t        j                  «       |_        |j                  d	g¬
«       t	        ddt        |d|i¬«      j                  ¬«      S # t        $ r Y Œ0w xY w)N©r¹  rŸ   ©r†  r&  r¿  r  r³  úkyc/ú%Y/%m/%drÅ  Úkyc_submitted_atr8  r  z#KYC document uploaded successfully.r¹  ©r&  r·  )rU   r†  rŸ   r  rG   r	  r   rž  ÚstrftimerH   r?  rl  r0  rÉ   rT   )r  r¹  r)  r*  r  Úkyc_relÚdocrØ   s           rŽ   r‘  zKYCDocumentListCreate.createÑ  só   € Ü)Ø—‘Ø '°·±Ñ>ô
ˆð �|‰|Œ~Ü Ð%9ÀÇÁÔLÐLàœŸ™›×0Ñ0°Ó<Ð=Ð>ˆÜ˜'Ô"Ø�h‰h˜GŸL™LˆhÓ)ˆð	Ø—l‘l×2Ñ2ˆGØ×+Ò+Ü+3¯<©<«>�Ô(Ø—‘Ð,>Ð+?�Ô@ô ØØ1Ü& s°YÀÐ4HÔI×NÑNô
ð 	
øô ò 	Ùð	ús   ÂAD Ä	DÄDN©	r  r  r  r   rC   r   r"  rc  r‘  r¤   r�   rŽ   r  r  Æ  s   „ Ø)¨9Ð5Ðò\òYó

r�   r  c                 ó|   — t        | j                  «      }|rt        dd|¬«      S t        dd| j                  ¬«      S ©Nr¿  r  r³  )r)   r	  rG   )Ú
serializerÚ
flat_errors     rŽ   Ú#_shipment_validation_error_responser:  ë  s;   € Ü7¸
×8IÑ8IÓJ€JÙÜ˜CÐ!5¸ZÔHÐHÜ˜Ð1¸×9JÑ9JÔKÐKr�   c                 óP   — t        | j                  «      }|rt        dd|¬«      S | ‚r7  )r)   ÚdetailrG   )rß  r9  s     rŽ   Ú(_shipment_save_validation_error_responser=  ò  s(   € Ü7¸¿
¹
ÓC€JÙÜ˜CÐ!5¸ZÔHÐHØ
€Ir�   c                 óÊ  — | j                   j                  d«      }|t        j                  j                  k7  s'|j
                  t        j                  j                  k7  ryt        |«      \  }}|s,t        |t        «      rt        dd|¬«      S t        dd|¬«      S t        j                  j                  |_        |j                  dg¬«       t        |j                  «       y)zNPublish when request includes status=PUBLISHED; side effects run after commit.r   Nr¿  r  r³  zCannot publish shipment.r8  )r†  rÈ   r   r  r  r   ÚDRAFTr(   r˜  rÆ   rG   r?  r'   rV  )r¹  rÿ   Ú
new_statusÚokÚpublish_errorss        rŽ   Ú_publish_shipment_if_requestedrC  ù  s¬   € à—‘×!Ñ! (Ó+€JØ”X—_‘_×.Ñ.Ò.°(·/±/ÄXÇ_Á_×EZÑEZÒ2ZØÜ5°hÓ?Ñ€BˆÙÜ�n¤cÔ*Ü Ð%9ÀÔPÐPÜ˜CÐ!;À>ÔRÐRÜ—o‘o×/Ñ/€H„OØ‡M�M  
€MÔ+Ü)¨(¯+©+Ô6Ør�   c                 ó  — t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S 	 |j                  «       }t        dd|¬«      S # t        $ r!}t        ddt        |«      ¬«      cY d}~S d}~ww xY w)	z¿
    Preview suggested price before creating a shipment.
    Same-country uses zone km rates; cross-border uses directional freight-route min_freight.
    Does not create a shipment row.
    r·  r¿  r  r³  zCould not calculate price.Nrµ  z(Suggested price calculated successfully.)rY   r†  r  rG   r	  ÚestimaterË   rÆ   )r¹  r  r†  rß  s       rŽ   Úshipper_shipment_estimate_pricerF  	  sz   € ô *¨w¯|©|Ô
<€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHðOØ�|‰|‹~ˆô ˜ÐGÈdÔSÐSøô ò OÜ˜CÐ!=ÄSÈÃXÔNÕNûðOús   Á A Á	BÁ'BÁ=BÂBc                   ó&   — e Zd ZeegZd„ Zd„ Zd„ Zy)ÚShipmentListCreatec                 óÚ   — t         j                  j                  | j                  j                  t         j
                  j                  ¬«      j                  dd«      j                  d«      S )N)rM  r   r  Ú	trip__podÚtrip__pod__photos)	r   rž   rœ   r¹  rŸ   r  r  rç   Úprefetch_relatedr!  s    rŽ   r"  zShipmentListCreate.get_queryset  sT   € ä×Ñ×#Ñ#ØŸ™×)Ñ)Ü—‘×0Ñ0ð $ó ÷ ‰^˜F KÓ0ßÑÐ1Ó2ð	
r�   c                 ór   — | j                  «       }t        |dd|i¬«      }t        dd|j                  ¬«      S )NTr¹  r$  rµ  z!Shipments retrieved successfully.r·  )r"  rV   rG   r†  r(  s         rŽ   rc  zShipmentListCreate.list(  s7   € Ø×ÑÓ ˆÜ  ¨$¸ÀGÐ8LÔMˆÜ˜CÐ!DÈ3Ï8É8ÔTÐTr�   c           	      ó„  — t        |j                  d|i¬«      }|j                  «       st        |«      S 	 |j	                  |j
                  ¬«      }t        ||«      }|r|S |j                  «        t        ddt        |d|i¬«      j                  ¬«      S # t        j                  $ r}t        |«      cY d }~S d }~ww xY w)Nr¹  r-  ©rM  r  zShipment created successfully.r1  r·  )rX   r†  r  r:  r?  rŸ   r   ÚValidationErrorr=  rC  Úrefresh_from_dbrG   rV   )r  r¹  r)  r*  r  rÿ   rß  Úpublish_errors           rŽ   r‘  zShipmentListCreate.create-  s¶   € Ü,°'·,±,ÈÐT[ÐH\Ô]ˆØ�|‰|Œ~Ü6°sÓ;Ð;ð	AØ—x‘x¨¯©�xÓ5ˆHô 7°wÀÓIˆÙØ Ð Ø× Ñ Ô"ÜØØ,Ü# H°yÀ'Ð6JÔK×PÑPô
ð 	
øô ×*Ñ*ò 	AÜ;¸CÓ@Õ@ûð	Aús   ¶B ÂB?Â*
B:Â4B?Â:B?Nr5  r¤   r�   rŽ   rH  rH    s   „ Ø)¨9Ð5Ðò
òUó

r�   rH  c                   ó,   — e Zd ZeegZd„ Zd„ Zd„ Zd„ Z	y)ÚShipmentDetailc                 ó¨   — t         j                  j                  | j                  j                  ¬«      j                  dd«      j                  d«      S )NrO  r  rJ  rK  )r   rž   rœ   r¹  rŸ   rç   rL  r!  s    rŽ   r"  zShipmentDetail.get_querysetC  s@   € ä×Ñ×#Ñ#¨D¯L©L×,=Ñ,=Ð#Ó>ß‰^˜F KÓ0ßÑÐ1Ó2ð	
r�   c           	      ól   — | j                  «       }t        ddt        |d|i¬«      j                  ¬«      S )Nrµ  z Shipment retrieved successfully.r¹  r1  r·  )Ú
get_objectrG   rV   r†  ©r  r¹  r)  r*  Úinstances        rŽ   ÚretrievezShipmentDetail.retrieveJ  s6   € Ø—?‘?Ó$ˆÜØØ.Ü# H°yÀ'Ð6JÔK×PÑPô
ð 	
r�   c           	      ó´  — |j                  dd«      }| j                  «       }t        ||j                  |d|i¬«      }|j	                  «       st        |«      S 	 |j                  «       }t        ||«      }	|	r|	S |j                  «        t        ddt        |d|i¬«      j                  ¬«      S # t        j                  $ r}t        |«      cY d }~S d }~ww xY w)	Nr  Fr¹  ©r†  r  r&  rµ  zShipment updated successfully.r1  r·  )ÚpoprW  rX   r†  r  r:  r?  r   rP  r=  rC  rQ  rG   rV   )
r  r¹  r)  r*  r  rY  r  Úupdatedrß  rR  s
             rŽ   rx  zShipmentDetail.updateS  sÔ   € Ø—*‘*˜Y¨Ó.ˆØ—?‘?Ó$ˆÜ,ØØ—‘ØØ Ð(ô	
ˆð �|‰|Œ~Ü6°sÓ;Ð;ð	AØ—h‘h“jˆGô 7°wÀÓHˆÙØ Ð Ø×ÑÔ!ÜØØ,Ü# G°iÀÐ5IÔJ×OÑOô
ð 	
øô ×*Ñ*ò 	AÜ;¸CÓ@Õ@ûð	Aús   ÁB/ Â/CÃ
CÃCÃCc                 óÄ   — | j                  «       }|j                  t        j                  j                  k7  rt        ddd¬«      S |j                  «        t        dd«      S )Nr¿  z Can only delete draft shipments.zInvalid operation.r³  rµ  zShipment deleted successfully.)rW  r   r   r  r?  rG   rÎ  rX  s        rŽ   ÚdestroyzShipmentDetail.destroyl  sM   € Ø—?‘?Ó$ˆØ�?‰?œhŸo™o×3Ñ3Ò3Ü Ð%GÐOcÔdÐdØ�‰ÔÜ˜CÐ!AÓBÐBr�   N)
r  r  r  r   rC   r   r"  rZ  rx  r`  r¤   r�   rŽ   rT  rT  @  s"   „ Ø)¨9Ð5Ðò
ò
ò
ó2Cr�   rT  c                   ó    — e Zd ZeegZd„ Zd„ Zy)ÚShipmentBidListc                 ó¦   — t         j                  j                  | j                  d   | j                  j
                  ¬«      j                  dd«      S )NÚshipment_pk)rv  Úshipment__shipperrÿ   rN  )r   rž   rœ   r*  r¹  rŸ   rç   r!  s    rŽ   r"  zShipmentBidList.get_querysetx  sE   € Ü�{‰{×!Ñ!ØŸ™ MÑ2Ø"Ÿl™l×/Ñ/ð "ó 
÷ ‰.˜ ]Ó
3ð	4r�   c                 ól   — | j                  «       }t        |d¬«      }t        dd|j                  ¬«      S )NT©r%  rµ  zBids retrieved successfully.r·  )r"  r[   rG   r†  r(  s         rŽ   rc  zShipmentBidList.list~  s0   € Ø×ÑÓ ˆÜ ¨Ô.ˆÜ˜CÐ!?ÀcÇhÁhÔOÐOr�   N©r  r  r  r   rC   r   r"  rc  r¤   r�   rŽ   rb  rb  u  s   „ Ø)¨9Ð5Ðò4óPr�   rb  c                   ó    — e Zd ZeegZd„ Zd„ Zy)Ú	BidDetailc                 óŠ   — t         j                  j                  | j                  j                  ¬«      j                  dd«      S )N©re  rÿ   rN  )r   rž   rœ   r¹  rŸ   rç   r!  s    rŽ   r"  zBidDetail.get_queryset‡  s3   € Ü�{‰{×!Ñ!°D·L±L×4EÑ4EÐ!ÓF×UÑUÐV`ÐboÓpÐpr�   c                 ód   — | j                  «       }t        ddt        |«      j                  ¬«      S )Nrµ  zBid retrieved successfully.r·  )rW  rG   r\   r†  rX  s        rŽ   rZ  zBidDetail.retrieveŠ  s+   € Ø—?‘?Ó$ˆÜ˜CÐ!>ÔEXÐYaÓEb×EgÑEgÔhÐhr�   N©r  r  r  r   rC   r   r"  rZ  r¤   r�   rŽ   rj  rj  „  s   „ Ø)¨9Ð5Ðòqóir�   rj  c           
      ó  — 	 t         j                  j                  d«      j                  || j                  ¬«      }	 t        |«      }t        |j                  «      }t        |d	d
d|› d�t        |j                  «      t        |j                  «      dœ«       t        ddt        |«      ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        dt        |«      d¬«      cY d }~S d }~ww xY w)Nrÿ   ©rV  re  ræ  úBid not found.r  r³  r¿  úBid acceptance failed.r€  úBid acceptedú'The shipper accepted your bid on load #r�  )r  r  rµ  úBid accepted and trip created.r·  )r   rž   rç   rÈ   rŸ   r¬  rG   r‰  rË   rÆ   rt  rÿ   r{  rÎ   r  r  )r¹  rV  ry  r  rß  rƒ  s         rŽ   Ú
bid_acceptrv  �  sû   € ðGÜ�k‰k×(Ñ(¨Ó4×8Ñ8¸BÐRY×R^ÑR^Ð8Ó_ˆðKÜ*¨3Ó/ˆô ˜CŸL™LÓ)€EÜ*ØØØØ
1°%°¸Ð:ä˜4Ÿ7™7“|Ü × 1Ñ 1Ó2ñ	
ô	ô ØØ(Ü& tÓ,ôð øô# ×Ñò GÜ˜CÐ!1¸ÔFÒFðGûô ò KÜ˜C¤ S£Ð1IÔJÕJûðKús.   ‚:B0 ½C Â0!CÃCÃ	DÃ C<Ã6DÃ<Dc           
      óÚ  — 	 t         j                  j                  d«      j                  || j                  ¬«      }t        |j                  «      rt        ddd	¬«      S |j                  t         j                  j                  k7  rt        dd
d¬«      S t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j                   d   |_        |j                   j                  dd«      xs |j$                  |_        t         j                  j&                  |_	        |j)                  g d¢¬«       t+        |j                  |j,                  «       t/        |j                  «      }t1        |ddd|› d�dt3        |j"                  «      i«       t        ddt5        |«      j                  ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w)Nrÿ   rp  ræ  rq  r  r³  r¿  z$Bid is locked after load acceptance.úBid locked.z#Only pending bids can be countered.zInvalid bid status.r·  r  Úcounter_amountrÝ  r¯   )ry  rÝ  r   r8  Úbid_counteredzCounter-offer receivedz&A shipper countered your bid on load #r�  rµ  zCounter-offer sent.)r   rž   rç   rÈ   rŸ   r¬  rG   r  rÿ   r   r  rŽ  r]   r†  r  r	  Úvalidated_datary  rÝ  r�  r?  rS  rN  rt  r{  rÆ   r\   )r¹  rV  ry  r  rƒ  s        rŽ   Úbid_counterr|  ¬  s˜  € ðGÜ�k‰k×(Ñ(¨Ó4×8Ñ8¸BÐRY×R^ÑR^Ð8Ó_ˆô �c—l‘lÔ#Ü˜CÐ!GÈ}Ô]Ð]Ø
‡z�z”S—Z‘Z×'Ñ'Ò'ÜØØ1Ø'ô
ð 	
ô
  G§L¡LÔ
1€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ×+Ñ+Ð,<Ñ=€CÔØ×$Ñ$×(Ñ(¨°BÓ7ÒF¸3¿;¹;€C„KÜ—‘×%Ñ%€C„JØ‡H�HÒB€HÔCÜ+¨C¯L©L¸#¿/¹/ÔJÜ˜CŸL™LÓ)€EÜ*ØØØ Ø
0°°°qÐ9Ø	œ3˜s×1Ñ1Ó2Ð3ôô ˜Ð2Ô9LÈSÓ9Q×9VÑ9VÔWÐWøô5 ×Ñò GÜ˜CÐ!1¸ÔFÒFðGúó   ‚:G Ç!G*Ç)G*c                 óÚ  — 	 t         j                  j                  d«      j                  || j                  ¬«      }|j                  t         j                  j                  k(  st        |j                  «      rt        ddd	¬«      S |j                  t         j                  j                  k(  rt        dd
d¬«      S | j                  j                  d«      xs | j                  j                  d«      xs dj                  «       }|r;||_        t         j                  j                  |_        |j!                  g d¢¬«       n3t         j                  j                  |_        |j!                  ddg¬«       t#        |j                  «      }|rd|ind }t%        |ddd|› d�|«       t        ddt'        |«      j                  ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w)Nrÿ   rp  ræ  rq  r  r³  r¿  z-Cannot reject an accepted bid or locked load.rx  zBid is already rejected.zAlready rejected.ÚreasonrÝ  r¯   ©r   rÝ  r7  r8  r   r7  Úbid_rejectedúBid rejectedúYour bid on load #ú was rejected by the shipper.rµ  úBid rejected successfully.r·  )r   rž   rç   rÈ   rŸ   r¬  rG   r   r  r  r  rÿ   ÚREJECTEDr†  rÇ   rÝ  r?  rt  r{  r\   )r¹  rV  ry  r  rƒ  Úreject_extras         rŽ   Ú
bid_rejectrˆ  Î  s—  € ðGÜ�k‰k×(Ñ(¨Ó4×8Ñ8¸BÐRY×R^ÑR^Ð8Ó_ˆð ‡z�z”S—Z‘Z×(Ñ(Ò(¬N¸3¿<¹<Ô,HÜ˜CÐ!PÐXeÔfÐfØ
‡z�z”S—Z‘Z×(Ñ(Ò(Ü˜CÐ!;ÐCVÔWÐWà�l‰l×Ñ˜xÓ(ÒM¨G¯L©L×,<Ñ,<¸YÓ,GÒMÈ2×TÑTÓV€FÙØˆŒÜ—Z‘Z×(Ñ(ˆŒ
Ø�‰ÒBˆÕCä—Z‘Z×(Ñ(ˆŒ
Ø�‰ ¨,Ð7ˆÔ8ä˜CŸL™LÓ)€EÙ)/�H˜fÑ%°T€LÜ*ØØØØ
˜U˜GÐ#@ÐAØôô ˜Ð9Ô@SÐTWÓ@X×@]Ñ@]Ô^Ð^øô3 ×Ñò GÜ˜CÐ!1¸ÔFÒFðGúr}  c                 óŠ  — 	 t         j                  j                  |¬«      }t
        j                  j                  || j                  ¬«      j                  dd«      j                  d	«      }t        j                  j                  || j                  ¬«      j                  dd
ddddddddd«      j                  d«      j                  «       }t	        ddt        |«      j                  t        |d¬«      j                  |rt!        |«      j                  nd dœ¬«      S # t         j                  $ r t	        ddd¬«      cY S w xY w)NrU  ræ  úShipment not found.r  r³  )rÿ   rN  rN  rÿ   rù  re  Úshipment__shipper__roleÚ"shipment__shipper__shipper_profilerŒ  Úaccepted_bid__transporterÚ transporter__transporter_profilerš   Úassigned_driver__roleÚ$assigned_driver__transporter_profileÚstatus_recordsrµ  z#Bid history retrieved successfully.Trg  )rÿ   Úbidsr  r·  )r   rž   rÈ   r¬  rG   r   rœ   rŸ   rç   r  r   rL  r  rV   r†  r[   rc   )r¹  rd  rÿ   r’  r  s        rŽ   Útransporter_load_bid_historyr“  ð  s/  € ðLÜ×#Ñ#×'Ñ'¨;Ð'Ó7ˆô 	�‰×Ñ H¸'¿,¹,ÐÓGß	‰˜ zÓ	2ß	‰�-Ó	 ð 	ô 	�‰×Ñ X¸7¿<¹<ÐÓHß	‰ØØØ%Ø0ØØ'ØØ.ØØ#Ø2ó

÷ 
Ñ	Ð*Ó	+ß	‰‹ð! 	ô$ ØØ-ä*¨8Ó4×9Ñ9Ü% d°Ô6×;Ñ;ÙBFÔ3°DÓ9×>Ò>ÈDñ
ôð øô3 × Ñ ò LÜ˜CÐ!6¸lÔKÒKðLús   ‚ D Ä!EÅEc                 óà  — 	 t         j                  j                  |¬«      }t        |«      rt	        ddd¬«      S 	 | j                  j                  }t        ||«      st	        d
dd¬«      S |j                  t        j                  j                  k(  rJt        j                  j                  | j                  dd¬«      j                  «       }|st	        ddd¬«      S t!        | j                  |j                  «      }|st	        ddd¬«      S t#        ||«      st	        ddd¬«      S t%        | j&                  ¬«      }|j)                  «       st	        dd|j*                  ¬«      S |j,                  d   }|j,                  j                  d«      }|j,                  j                  d«      xs dj/                  «       }	t1        || j                  j2                  «      }
|t$        j4                  k(  �r|
rÑ|
j6                  t8        j:                  j<                  k(  rª|
j>                  €t	        ddd¬«      S |
j>                  |
_         d |
_        t8        j:                  jB                  |
_        |	xs d|
_"        |
jG                  g d¢¬«       tI        || j                  «       	 tK        |
«      }t	        d!d"tQ        |
|«      ¬«      S |
r5|
j6                  t8        j:                  jB                  k(  rt	        dd#d$¬«      S |jR                  €t	        dd%d&¬«      S |jR                  }|	xs d'}|
rK||
_         d |
_        t8        j:                  jT                  |
_        ||
_"        |
jG                  g d¢¬«       |
}nFt8        j                  jW                  || j                  |t8        j:                  jT                  |¬(«      }tI        || j                  «       	 tK        |«      }t	        d!d)tQ        ||«      ¬«      S |
r5|
j6                  t8        j:                  jB                  k(  rt	        dd#d$¬«      S |}|	xs d*}|
rO||
_         d |
_        t8        j:                  jT                  |
_        ||
_"        |
jG                  g d¢¬«       |
}d!}d+}nJt8        j                  jW                  || j                  |t8        j:                  jT                  |¬(«      }d,}d-}tI        || j                  «       tY        |jZ                  gd.tO        |j2                  «      tO        |j2                  «      d/œd0d1¬2«       t	        ||t]        |«      j&                  ¬«      S # t         j                  $ r t	        ddd¬«      cY S w xY w# t        j                  $ r t	        dd	d¬«      cY S w xY w# tL        $ r!}t	        dtO        |«      d ¬«      cY d }~S d }~ww xY w# tL        $ r!}t	        dtO        |«      d ¬«      cY d }~S d }~ww xY w)3NrU  ræ  rŠ  r  r³  r¿  z(Bidding is locked after load acceptance.rx  úTransporter profile not found.é“  z=This load type is not available for your transporter profile.zLoad type mismatch.T)rN  r–   Údriver__is_activez6Add at least one fleet driver before bidding on loads.zMissing fleet driver.z:A verified active vehicle is required to bid on this load.z Missing verified active vehicle.z+No verified vehicle matches this load type.zVehicle type mismatch.r·  r  Úactionrw  rÝ  r¯   z,Counter-offer amount is missing on this bid.zInvalid counter.zAccepted shipper counter-offer.)rw  ry  r   rÝ  r7  r8  rr  rµ  z)Counter-offer accepted and trip assigned.z+Bid is already agreed and trip is assigned.zTrip already assigned.z3Shipper proposed rate is unavailable for this load.zMissing suggested_price.zAccepted shipper proposed rate.)rÿ   rN  rw  r   rÝ  z)Proposed rate accepted and trip assigned.zSubmitted counter-offer.zBid updated successfully.r  zBid submitted successfully.Únew_bid)rv  r  zNew bidz+A transporter submitted a bid on your load.rE  )/r   rž   rÈ   r¬  rG   r  rŸ   ri  r   r0   rj  rã   r}  r   rœ   r�   r7   r6   r^   r†  r  r	  r{  rÇ   r  rÎ   ÚACTION_ACCEPTr   r   r  r�  ry  rw  r�  rÝ  r?  rS  rŠ  rË   rÆ   r‡  Úsuggested_pricerŽ  r‘  rK   r^  r\   )r¹  rd  rÿ   rØ   Úhas_own_driverr›   r  r˜  rw  rÝ  Ú
active_bidr  rß  Ú
bid_amountÚbid_messagery  Ústatus_codeÚresponse_messages                     rŽ   Útransporter_submit_bidr¢    sŒ  € ðLÜ×#Ñ#×'Ñ'¨;Ð'Ó7ˆô �hÔÜ˜CÐ!KÐS`ÔaÐaðWØ—,‘,×2Ñ2ˆô +¨7°HÔ=ÜØØKØ'ô
ð 	
ð ×ÑÔ1×=Ñ=×IÑIÒIÜ.×6Ñ6×=Ñ=ØŸ™ØØ"ð >ó 
÷ ‰&‹(ð	 	ñ
 ÜØØHØ-ôð ô :¸'¿,¹,È×H\ÑH\Ó]€NÙÜØØHØ4ô
ð 	
ô
 6°hÀÔOÜØØ9Ø*ô
ð 	
ô )¨g¯l©lÔ
;€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×Ñ Ñ)€FØ×Ñ×#Ñ# HÓ-€FØ×!Ñ!×%Ñ% iÓ0Ò6°B×=Ñ=Ó?€GÜ  ¨7¯<©<¯?©?Ó;€JàÔ/×=Ñ=Ó=Ù˜*×+Ñ+¬s¯z©z×/CÑ/CÒCØ×(Ñ(Ð0Ü#ØØBØ,ôð ð
 !+× 9Ñ 9ˆJÔØ(,ˆJÔ%Ü #§
¡
× 1Ñ 1ˆJÔØ!(Ò!MÐ,MˆJÔØ�O‰OÒ*iˆOÔjÜ3°H¸g¿l¹lÔKðSÜ?À
ÓK�ô  ØØ;Ü8¸ÀTÓJôð ñ ˜*×+Ñ+¬s¯z©z×/@Ñ/@Ò@ÜØØ=Ø.ôð ð ×#Ñ#Ð+ÜØØEØ0ôð ð
 ×-Ñ-ˆ
ØÒBÐ!BˆÙØ *ˆJÔØ(,ˆJÔ%Ü #§
¡
× 2Ñ 2ˆJÔØ!,ˆJÔØ�O‰OÒ*iˆOÔjØ‰Cä—+‘+×$Ñ$Ø!Ø#ŸL™LØ!Ü—z‘z×)Ñ)Ø#ð %ó ˆCô 	0°¸'¿,¹,ÔGð	OÜ;¸CÓ@ˆDô ØØ7Ü4°S¸$Ó?ô
ð 	
ñ ˜*×+Ñ+¬s¯z©z×/@Ñ/@Ò@ÜØØ=Ø.ôð ð
 ˆ
ØÒ;Ð!;ˆÙØ *ˆJÔØ(,ˆJÔ%Ü #§
¡
× 2Ñ 2ˆJÔØ!,ˆJÔØ�O‰OÒ*iˆOÔjØˆCØˆKØ:Ñä—+‘+×$Ñ$Ø!Ø#ŸL™LØ!Ü—z‘z×)Ñ)Ø#ð %ó ˆCð ˆKØ<Ðä+¨H°g·l±lÔCÜØ	×	Ñ	ÐØÜ˜HŸK™KÓ(´C¸¿¹³KÑ@ØØ:õô ØØÜ  Ó%×*Ñ*ôð øôw × Ñ ò LÜ˜CÐ!6¸lÔKÒKðLûô ×*Ñ*ò WÜ˜CÐ!AÈÔVÒVðWûô| ò SÜ# C¬¨S«Ð9QÔRÕRûðSûôR ò 	OÜ ¤S¨£XÐ5MÔNÕNûð	Oús^   ‚ U ¼U/ Ê V ÏW Õ!U,Õ+U,Õ/!VÖVÖ	W ÖV;Ö5W Ö;W ×	W-×W(×"W-×(W-c                   ó    — e Zd ZeegZd„ Zd„ Zy)ÚTripListc                 ó¸   — t         j                  j                  | j                  j                  ¬«      j                  dddddddd	d
«	      j                  dd«      S )Nrl  rÿ   rN  Útransporter__rolerŽ  rš   r�  r�  ÚreviewÚpodr‘  Úpod__photos©r   rž   rœ   r¹  rŸ   rç   rL  r!  s    rŽ   r"  zTripList.get_querysetÄ  s[   € ä�L‰L×Ñ°$·,±,×2CÑ2CÐÓDß‰^ØØØ#Ø2Ø!Ø'Ø6ØØó
÷ ÑÐ.°Ó>ð	
r�   c                 ó®   — t        |«       t        | j                  «       «      }t        |d|t	        |«      dœ¬«      }t        dd|j                  ¬«      S )NT©r¹  Úassigned_vehicles_by_trip_idr$  rµ  úTrips retrieved successfully.r·  )rz   rc  r"  ra   r{   rG   r†  )r  r¹  r)  r*  Útripsr  s         rŽ   rc  zTripList.listÕ  sT   € ä,¨WÔ5Ü�T×&Ñ&Ó(Ó)ˆÜ'ØØà"Ü0OÐPUÓ0Vñô
ˆô ˜CÐ!@ÀsÇxÁxÔPÐPr�   Nrh  r¤   r�   rŽ   r¤  r¤  Á  s   „ Ø)¨9Ð5Ðò
ó"Qr�   r¤  c                   ó    — e Zd ZeegZd„ Zd„ Zy)Ú
TripDetailc                 ó¼   — t         j                  j                  | j                  j                  ¬«      j                  dddddddd	d
dd«      j                  dd«      S )Nrl  rÿ   rN  r¦  rŽ  rš   r�  r�  r§  rŒ  r�  r¨  r‘  r©  rª  r!  s    rŽ   r"  zTripDetail.get_querysetç  sa   € ä�L‰L×Ñ°$·,±,×2CÑ2CÐÓDß‰^ØØØ#Ø2Ø!Ø'Ø6ØØØ+Øó÷ ÑÐ.°Ó>ð	
r�   c                 óœ   — t        |«       | j                  «       }t        ||t        |g«      dœ¬«      }t	        dd|j
                  ¬«      S )Nr¬  r1  rµ  úTrip retrieved successfully.r·  )rz   rW  rb   r{   rG   r†  )r  r¹  r)  r*  rY  r  s         rŽ   rZ  zTripDetail.retrieveú  sM   € Ü,¨WÔ5Ø—?‘?Ó$ˆÜ)Øà"Ü0OÐQYÐPZÓ0[ñô
ˆô ˜CÐ!?ÀcÇhÁhÔOÐOr�   Nrn  r¤   r�   rŽ   r±  r±  ä  s   „ Ø)¨9Ð5Ðò
ó&
Pr�   r±  c                 óÞ   — t         j                  j                  | j                  ¬«      j	                  dddd«      j                  d«      }t        ddt        |d	¬
«      j                  ¬«      S )N©rN  rÿ   rŒ  rN  rš   r‘  rµ  r®  Trg  r·  ©	r   rž   rœ   rŸ   rç   rL  rG   r_   r†  ©r¹  r«   s     rŽ   Útransporter_trips_myr¹  	  se   € ô 
�‰×	Ñ	¨¯©Ð	Ó	6×	EÑ	EØ�N MÐ3Dó
çÑÐ'Ó(ð ô ˜Ð<ÔCUÐVXÐ_cÔCd×CiÑCiÔjÐjr�   c                 óà   — t         j                  j                  | j                  d¬«      j	                  dddd«      j                  d«      }t        dd	t        |d
¬«      j                  ¬«      S )NF)rN  Úassigned_driver__isnullrÿ   rŒ  rN  rš   r‘  rµ  r®  Trg  r·  r·  r¸  s     rŽ   Útransporter_trips_assignedr¼    sg   € ô 
�‰×	Ñ	¨¯©ÈuÐ	Ó	U×	dÑ	dØ�N MÐ3Dó
çÑÐ'Ó(ð ô ˜Ð<ÔCUÐVXÐ_cÔCd×CiÑCiÔjÐjr�   c                 ó  — t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  h}t         j                  j                  | j                  |¬«      j                  dddd«      j                  d«      }t        ddt        |d	¬
«      j                  ¬«      S )N©rN  r  rÿ   rŒ  rN  rš   r‘  rµ  r®  Trg  r·  )r   r  r:  ÚARRIVED_PICKUPr;  r<  ÚARRIVED_DELIVERYr=  rž   rœ   rŸ   rç   rL  rG   r_   r†  ©r¹  Úactiver«   s      rŽ   Útransporter_trips_activerÃ    s¾   € ô 	�‰×ÑÜ�‰×"Ñ"Ü�‰×ÑÜ�‰×ÑÜ�‰×$Ñ$Ü�‰×Ñð€Fô 
�‰×	Ñ	¨¯©À&Ð	Ó	I×	XÑ	XØ�N MÐ3Dó
çÑÐ'Ó(ð ô ˜Ð<ÔCUÐVXÐ_cÔCd×CiÑCiÔjÐjr�   c                  ót   — t         j                  j                  ddddddddd	d
dd«      j                  d«      S )Nrÿ   re  r‹  rŒ  rŒ  r�  Úaccepted_bid__shipmentrN  rŽ  rš   r�  r�  r‘  )r   rž   rç   rL  r¤   r�   rŽ   Ú_trip_detail_querysetrÆ  ,  sK   € Ü�<‰<×&Ñ&ØØØ!Ø,ØØ#Ø ØØ*ØØØ.ó÷ ÑÐ'Ó(ð)r�   c                 ó  — | j                   xs | j                  }|sy	 |j                  }t        |j                  xs d«      j                  «       }|||j                  xs dfS # t        j                  $ r |ddfcY S w xY w)zQAssigned fleet driver if set, otherwise the trip transporter (individual driver).)Nr¯   Nr¯   N)	rš   rN  ri  r   r¬  rÆ   r¼   rÇ   rÉ  )r  rª  rØ   r¼   s       rŽ   Ú_resolve_trip_driver_traccarrÈ  =  s†   € à×!Ñ!Ò5 T×%5Ñ%5€FÙØð Ø×,Ñ,ˆô �—‘Ò# Ó$×*Ñ*Ó,€EØ�5˜'Ÿ/™/Ò1¨TÐ1Ð1øô ×*Ñ*ò  Ø�r˜4ÐÒð ús   ŸA% Á%B Á?B c           
      óÒ   — | sy t        | dd «      }t        | dd «      }| j                  | j                  | j                  | j                  t        |dd«      xs dt        |dd «      dœS )NrÌ   ri  rº   r¯   rj  )rÎ   r·   r¸   r¹   rº   rj  )rô   rÎ   r·   r¸   r¹   )rª  rÌ   rØ   s      rŽ   Ú_trip_driver_summaryrÊ  J  sl   € ÙØÜ�6˜6 4Ó(€DÜ�fÐ3°TÓ:€Gà�i‰iØ—‘Ø×'Ñ'Ø×%Ñ%Ü˜˜w¨Ó+Ò1¨rÜ ¨¸Ó>ñð r�   c                 ó”   — t        |j                  dd «      | j                  k(  ry| j                  |j                  |j                  fv S )Nr^  T)rô   rÿ   rÎ   r¶   rW  )rŸ   r  s     rŽ   Ú%_user_can_access_trip_driver_locationrÌ  Y  s>   € Üˆt�}‰}˜l¨DÓ1°T·W±WÒ<ØØ�7‰7�t×*Ñ*¨D×,CÑ,CÐDÐDÐDr�   c                óÀ  — t        «       j                  | j                  t        j                  j
                  ¬«      j                  t        dt        j                  j                  t        j                  j                  ¬«      j                  d«      ¬«      «      j                  d«      }t        |dd| i¬	«      j                  }t        d
|t!        |«      |dœ¬«      S )zhCompleted trips for trip.transporter with payment settlement summary (fleet owner or individual driver).©rN  r   Úpayments©r   r	  )Úquerysetr  Tr¹  r$  rµ  ©Úcountr¯  r·  )rÆ  rœ   rŸ   r   r  r>  rL  r	   r;   rž   ræ   ÚFAILEDr  rd   r†  rG   r"  )r¹  rÝ  r«   r†  s       rŽ   Ú&_completed_trips_with_payment_responserÕ  _  s¬   € ô 	Óß	‰˜GŸL™L´·±×1FÑ1FˆÓ	Gß	Ñ	ÜØÜ Ÿ™×0Ñ0¼¿¹×8MÑ8MÐ0ÓN×WÑWÐX]Ó^ôó

÷ 
‰�-Ó	 ð ô .¨b°tÀiÐQXÐEYÔZ×_Ñ_€DÜ˜˜W´S¸³YÈÑ+NÔOÐOr�   c                 ó   — t        | d¬«      S )Nú'Completed trips retrieved successfully.©rÝ  ©rÕ  rÏ  s    rŽ   Útransporter_trips_completedrÚ  p  s   € ô 2ØØ9ôð r�   c                 ó6   — t        «       j                  | ¬«      S )Nr™   )rÆ  rœ   rÅ  s    rŽ   Ú_fleet_driver_trip_querysetrÜ  y  s   € Ü Ó"×)Ñ)¸$Ð)Ó?Ð?r�   c                  ó2  — t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  hS )u<   Started through delivered â€” not assigned/completed/closed.)r   r  r:  r¿  r;  r<  rÀ  r=  r¤   r�   rŽ   Ú'_individual_driver_in_progress_statusesrÞ  }  s\   € ô 	�‰×ÑÜ�‰×"Ñ"Ü�‰×ÑÜ�‰×ÑÜ�‰×$Ñ$Ü�‰×Ñðð r�   c                ó<  — t        |t        «      r&t        «       j                  | j                  |¬«      }n%t        «       j                  | j                  |¬«      }|j                  d«      }t        |d¬«      j                  }t        d|t        |«      |dœ¬«      S )	NrÎ  r¾  r  Trg  rµ  rÒ  r·  )
r˜  rÆ   rÆ  rœ   rŸ   r  rc   r†  rG   r"  )r¹  ÚstatusesrÝ  r«   r†  s        rŽ   Ú%_individual_driver_trip_list_responserá  ‰  s}   € Ü�(œCÔ Ü"Ó$×+Ñ+¸¿¹ÈXÐ+ÓV‰ä"Ó$×+Ñ+¸¿¹ÐQYÐ+ÓZˆØ	�‰�]Ó	#€BÜ*¨2°DÔ9×>Ñ>€DÜ˜˜W´S¸³YÈÑ+NÔOÐOr�   c                 óN   — t        | t        j                  j                  d¬«      S )z=Individual driver: won trips not started yet (ASSIGNED only).z&Assigned trips retrieved successfully.©rà  rÝ  )rá  r   r  r�  rÏ  s    rŽ   Ú individual_driver_trips_assignedrä  “  s$   € ô 1ØÜ—‘×%Ñ%Ø8ôð r�   c                 ó.   — t        | t        «       d¬«      S )zPIndividual driver: trips they won (Trip.transporter) that are still in progress.z$Active trips retrieved successfully.rã  )rá  rÞ  rÏ  s    rŽ   Úindividual_driver_trips_activeræ  ž  s   € ô 1ØÜ8Ó:Ø6ôð r�   c                 ó   — t        | d¬«      S )zVIndividual driver: won trips that are completed (includes payment settlement summary).r×  rØ  rÙ  rÏ  s    rŽ   Ú!individual_driver_trips_completedrè  ©  s   € ô 2ØØ9ôð r�   c                 óÂ   — t        | j                  «      j                  t        j                  j
                  ¬«      }t        ddt        |d¬«      j                  ¬«      S ©NrÐ  rµ  r®  Trg  r·  )	rÜ  rŸ   rœ   r   r  r�  rG   rc   r†  r¸  s     rŽ   Údriver_trips_assignedrë  ³  sM   € ô 
% W§\¡\Ó	2×	9Ñ	9ÄÇÁ×AUÑAUÐ	9Ó	V€BÜØØ'Ü,¨R°dÔ;×@Ñ@ôð r�   c                 óÂ  — t         j                  j                  t         j                  j                  t         j                  j                  t         j                  j
                  t         j                  j                  t         j                  j                  h}t        | j                  «      j                  |¬«      }t        ddt        |d¬«      j                  ¬«      S )N)r  rµ  r®  Trg  r·  )r   r  r:  r¿  r;  r<  rÀ  r=  rÜ  rŸ   rœ   rG   rc   r†  rÁ  s      rŽ   Údriver_trips_activerí  ¾  sš   € ô 	�‰×ÑÜ�‰×"Ñ"Ü�‰×ÑÜ�‰×ÑÜ�‰×$Ñ$Ü�‰×Ñð€Fô 
% W§\¡\Ó	2×	9Ñ	9ÀVÐ	9Ó	L€BÜØØ'Ü,¨R°dÔ;×@Ñ@ôð r�   c                 óÂ   — t        | j                  «      j                  t        j                  j
                  ¬«      }t        ddt        |d¬«      j                  ¬«      S rê  )	rÜ  rŸ   rœ   r   r  r>  rG   rc   r†  r¸  s     rŽ   Údriver_trips_completedrï  Ñ  sM   € ô 
% W§\¡\Ó	2×	9Ñ	9ÄÇÁ×AVÑAVÐ	9Ó	W€BÜØØ'Ü,¨R°dÔ;×@Ñ@ôð r�   c                   ó    — e Zd ZeegZd„ Zd„ Zy)ÚTripLocationListc                 óª   — t         j                  j                  | j                  d   | j                  j
                  ¬«      j                  d«      d d S )NÚtrip_pk)r  Útrip__shipment__shipperz-recorded_atéd   )r    rž   rœ   r*  r¹  rŸ   r  r!  s    rŽ   r"  zTripLocationList.get_querysetà  sN   € Ü×#Ñ#×*Ñ*Ø—K‘K 	Ñ*Ø$(§L¡L×$5Ñ$5ð +ó 
÷ ‰(�>Ó
" 4 Cð)ð 	)r�   c                 ól   — | j                  «       }t        |d¬«      }t        dd|j                  ¬«      S )NTrg  rµ  z!Locations retrieved successfully.r·  )r"  re   rG   r†  r(  s         rŽ   rc  zTripLocationList.listæ  s0   € Ø×ÑÓ ˆÜ$ R¨dÔ3ˆÜ˜CÐ!DÈ3Ï8É8ÔTÐTr�   Nrh  r¤   r�   rŽ   rñ  rñ  Ý  s   „ Ø)¨9Ð5Ðò)óUr�   rñ  c                 óØ  — t         j                  j                  t        | j                  ¬«      t        | j                  ¬«      z  t        | j                  ¬«      z  «      j                  dddddd	d
dd«	      j                  «       j                  d«      }|D �cg c]¸  }|j                  |j                  |j                  |j                  |j                  |j                  r|j                  j                  nd t        || j                  «      |j                   j                  d«      j#                  dd¬«      j%                  «       |j&                  dœ	‘Œº }}t)        dd|¬«      S c c}w )NrO  r¶  )Útrip__assigned_driverrÿ   r  rø  rM  Úshipper__roleÚshipper__shipper_profilerN  r¦  rŽ  rù  Ú
created_atTrX  )	rÎ   rv  r  r^  r¶   rW  ÚcounterpartyÚlast_message_atrû  rµ  zChats retrieved successfully.r·  )r!   rž   rœ   r
   rŸ   rç   Údistinctr  rÎ   rv  r  r^  r¶   r  rW  rr  ÚmessagesrZ  r  rû  rG   )r¹  r«   r�   r†  s       rŽ   Ú	chat_listr   í  s9  € ô 
×	Ñ	×	$Ñ	$Ü	�'—,‘,ÔÜ
˜Ÿ™Ô
%ñ	&ä
 '§,¡,Ô
/ñ	0ó
÷ �nØØØØØØ"ØØØ*ó
÷ �hƒj—‘˜-Ó(ð ð6 öð ð —$‘$ØŸ=™=Ø—y‘yØŸ,™,Ø×.Ñ.Ø?@¿yºy !§&¡&×";Ò";ÈdÜ6°q¸'¿,¹,ÓGØ Ÿz™z×2Ñ2°=ÓA×MÑMÈlÐaeÐMÓf×lÑlÓnØŸ,™,ó
	
ð€Dð ô ˜Ð<À4ÔHÐHùòs   ÂB=E'c                 ó0  — | j                   j                  d«      }| j                   j                  d«      }|r|st        ddd¬«      S 	 t        j                  j                  |¬«      }	 t        |«      }t        j                  j                  ||| j                  ¬«      j                  «       }| j                  j                  |j                  |fvr|st        ddd¬«      S t        j                  j                  ||¬«      j                  «       s=t        j                  j                  ||¬«      j                  «       st        ddd¬«      S 	 t         j                  j                  |¬«      }t        j                  j                  ||¬«      j#                  d«      j%                  «       }t'        |||¬«      }t        dd|j                  |j(                  |j*                  |j                  |j,                  |r|j.                  nd t1        || j                  «      dœ¬«      S # t        j
                  $ r t        dd	d
¬«      cY S w xY w# t        t        f$ r t        ddd¬«      cY S w xY w# t         j
                  $ r t        ddd
¬«      cY S w xY w)Nrv  r¶   r¿  z,shipment_id and transporter_id are required.úMissing fields.r³  rU  ræ  rŠ  r  z"transporter_id must be an integer.zInvalid transporter_id.)rÿ   r¶   rš   r–  zYou cannot access this chat.ú
Forbidden.r  z8No bid or trip found for this shipment/transporter pair.zInvalid chat context.úTransporter not found.r	  r  rµ  zChat ready.)Úconversation_idrv  r  r^  r¶   rW  rü  r·  )r†  rÈ   rG   r   rž   r¬  ÚintrÊ   rË   r   rœ   rŸ   r�   rÎ   r^  r   rð  r  r  rS  rv  r  r¶   rW  rr  )	r¹  rv  r¶   rÿ   Útransporter_id_intÚis_assigned_driverrN  r  rQ  s	            rŽ   Úchat_open_or_creater	    s[  € ð —,‘,×"Ñ" =Ó1€KØ—\‘\×%Ñ%Ð&6Ó7€NÙ™nÜ˜CÐ!OÐWhÔiÐiðLÜ×#Ñ#×'Ñ'¨;Ð'Ó7ˆðhÜ  Ó0Ðô Ÿ™×,Ñ,ØØ)ØŸ™ð -ó ÷ �fƒhð	 ð
 ‡|�|‡�˜x×2Ñ2Ð4FÐGÑGÑPbÜ˜CÐ!?À|ÔTÐTä�‰×Ñ HÐ=OÐÓP×WÑWÔYÜ�<‰<×Ñ¨ÐASÐÓT×[Ñ[Ô]ä˜CÐ![ÐczÔ{Ð{ðOÜ—l‘l×&Ñ&Ð*<Ð&Ó=ˆô 	�‰×Ñ XÐ>PÐÓQß	‰�%‹ß	‰‹ð 	ô
 3°8¸[ÈtÔT€DÜØØà#Ÿw™wØ×+Ñ+Ø—|‘|ØŸ/™/Ø"×1Ñ1Ù=A $×"9Ò"9ÀtÜ6°t¸W¿\¹\ÓJñ
ôð øô; × Ñ ò LÜ˜CÐ!6¸lÔKÒKðLûô ”zÐ"ò hÜ˜CÐ!EÐMfÔgÒgðhûô" ×Ñò OÜ˜CÐ!9ÀÔNÒNðOús6   Á
 H' Á+I Å I1 È'!IÉ
IÉI.É-I.É1!JÊJc           	      ó¦  — 	 t         j                  j                  dd«      j                  |¬«      }t        | j                  |«      st        dd	d
¬«      S | j                  dk(  rF|j                  j                  dddd«      }t        |dd| i¬«      }t        dd|j                  ¬«      S t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j                  j                  d«      xs t         j"                  j$                  }|t         j"                  j&                  k(  r1t)        j*                  «       j-                  d«      }t/        d|› �«       |j1                  || j                  ¬«      }t         j                  j                  dddd«      j                  |j2                  ¬«      }t5        || j                  j6                  «      }|�rt9        |j6                  «      |j:                  rt9        |j:                  «      nd|j<                  rt9        |j<                  «      ndt9        |j6                  «      t9        | j                  j6                  «      t9        |j>                  «      ddœ}	|j>                  t         j"                  j&                  k(  rd}
n'|j@                  xs djC                  «       }|r|d d  nd!}
tE        |di |	¥d"tG        jH                  |	«      d#œ¥d"|
¬$«       t        d%d&t        |d| i¬'«      j                  ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w)(Nrÿ   r  rU  ræ  úConversation not found.r  r³  r–  z$You cannot access this conversation.r  r¯  ÚsenderÚsender__shipper_profileÚsender__transporter_profiler[  Tr¹  r$  rµ  z Messages retrieved successfully.r·  r¿  r  Úmessage_typer/  zmessages/voice/)r[  r  r¯   Únew_message)r  rv  r  Ú
message_idrd  Úchat_message_typerI  zYou received a voice message.éx   zYou received a new message.zNew Message)ÚtypeÚtagrE  r  zMessage sent successfully.r1  )%r!   rž   rç   rÈ   r¬  rG   r_  rŸ   Úmethodrÿ  rf   r†  rg   r  r	  r{  r"   ÚMessageTypeÚTEXTÚVOICEr   rž  r2  rH   r?  rV  rf  rÎ   rÆ   rv  r  r  r$  rÇ   rK   ÚjsonÚdumps)r¹  r  rQ  rÿ  r  ÚvtypeÚ	date_pathÚmsgre  Útag_payloadÚ	push_bodyr$  s               rŽ   Úchat_messagesr!  E  sÒ  € ðPÜ×#Ñ#×2Ñ2°:¸vÓF×JÑJÈoÐJÓ^ˆô )¨¯©°tÔ<Ü˜CÐ!GÈ|Ô\Ð\Ø‡~�~˜Òà�M‰M×(Ñ(ØØ)Ø-Øó	ð 	ô   ¨t¸iÈÐ=QÔRˆÜ˜CÐ!CÈ#Ï(É(ÔSÐSä
! w§|¡|Ô
4€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ×Ñ×"Ñ" >Ó2ÒN´g×6IÑ6I×6NÑ6N€EØ”×#Ñ#×)Ñ)Ò)Ü—L‘L“N×+Ñ+¨JÓ7ˆ	Ü˜O¨I¨;Ð7Ô8Ø
�(‰( ¨W¯\©\ˆ(Ó
:€Cä�‰×&Ñ&ØØ%Ø)Øó		
÷ 
‰�—‘ˆ‹ð ô 8¸¸g¿l¹l¿o¹oÓN€MÚä" 4§7¡7›|Ø48×4DÒ4Dœ3˜t×/Ñ/Ô0È"Ø,0¯LªL”s˜4Ÿ<™<Ô(¸bÜ˜cŸf™f›+Ü˜WŸ\™\Ÿ_™_Ó-Ü!$ S×%5Ñ%5Ó!6Ø'ñ
ˆð ×Ñœw×2Ñ2×8Ñ8Ò8Ø7‰Ià—H‘H’N ×)Ñ)Ó+ˆDÙ'+˜˜d˜s™Ð1NˆIÜØØðØðð &Ü—z‘z +Ó.ò	ð  Øõ	
ô ØØ$Ü˜s¨Y¸Ð,@ÔA×FÑFôð øô{ ×$Ñ$ò PÜ˜CÐ!:À,ÔOÒOðPús   ‚0L, Ì,!MÍMc                 ót  — 	 t         j                  j                  d«      j                  || j                  ¬«      }t        |j                  |j                  «      }|st        ddd	¬«      S 	 t        j                  j                  d«      j                  |j                  ¬
«      }	 t        |«      }t        |j                  «      }t!        |ddd|› d�t        |j"                  «      t        |j$                  «      t        |j"                  «      dœ«       t'        |«      }|j"                  |d<   t        dd|¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t        j
                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        dt        |«      d¬«      cY d }~S d }~ww xY w)Nrÿ   ©rV  rM  ræ  r  r  r³  r¿  ú"No active bid found for this chat.úNo active bid.rU  rq  rr  r€  rs  rt  r�  )r  r  r  r  rµ  ru  r·  )r!   rž   rç   rÈ   rŸ   r¬  rG   r  rÿ   r¶   r   rV  r‰  rË   rÆ   rt  r{  rÎ   r  r  )r¹  r  rQ  ry  r  rß  rƒ  r†  s           rŽ   Úchat_accept_bidr&  Ž  sœ  € ðPÜ×#Ñ#×2Ñ2°:Ó>×BÑBÀoÐ_f×_kÑ_kÐBÓlˆô ˜$Ÿ-™-¨×)<Ñ)<Ó
=€CÙÜ˜CÐ!EÐM]Ô^Ð^ðGÜ�k‰k×(Ñ(¨Ó4×8Ñ8¸C¿F¹FÐ8ÓCˆðKÜ*¨3Ó/ˆô ˜DŸM™MÓ*€EÜ*ØØØØ
1°%°¸Ð:ä˜4Ÿ7™7“|Ü × 1Ñ 1Ó2Ü" 4§7¡7›|ñ	
ô
ô % TÓ*€DØ"Ÿg™g€DÐ	ÑÜØØ(Øôð øô7 ×$Ñ$ò PÜ˜CÐ!:À,ÔOÒOðPûô ×Ñò GÜ˜CÐ!1¸ÔFÒFðGûô ò KÜ˜C¤ S£Ð1IÔJÕJûðKúsA   ‚:D? Á-9E& Â'F Ä?!E#Å"E#Å&!F
Æ	F
Æ	F7ÆF2Æ,F7Æ2F7c                 óÔ  — 	 t         j                  j                  d«      j                  || j                  ¬«      }t        |j                  |j                  «      }|st        ddd	¬«      S t        |j                  «      rt        dd
d¬«      S | j                  j                  d«      xs | j                  j                  d«      xs dj                  «       }|r;||_        t        j                  j                   |_        |j%                  g d¢¬«       n3t        j                  j                   |_        |j%                  ddg¬«       t'        |j                  «      }|r|t)        |j*                  «      dœndt)        |j*                  «      i}t-        |ddd|› d�|«       t        ddt/        |«      j                  ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w)Nrÿ   r#  ræ  r  r  r³  r¿  r$  r%  z%Cannot reject a bid on a locked load.rx  r  rÝ  r¯   r€  r8  r   r7  )r  r  r  r�  r‚  rƒ  r„  rµ  r…  r·  )r!   rž   rç   rÈ   rŸ   r¬  rG   r  rÿ   r¶   r  r†  rÇ   rÝ  r   r  r†  r   r?  rt  rÆ   rÎ   r{  r\   )r¹  r  rQ  ry  r  rƒ  r‡  s          rŽ   Úchat_reject_bidr(  µ  s¢  € ðPÜ×#Ñ#×2Ñ2°:Ó>×BÑBÀoÐ_f×_kÑ_kÐBÓlˆô ˜$Ÿ-™-¨×)<Ñ)<Ó
=€CÙÜ˜CÐ!EÐM]Ô^Ð^Ü�d—m‘mÔ$Ü˜CÐ!HÐP]Ô^Ð^à�l‰l×Ñ˜xÓ(ÒM¨G¯L©L×,<Ñ,<¸YÓ,GÒMÈ2×TÑTÓV€FÙØˆŒÜ—Z‘Z×(Ñ(ˆŒ
Ø�‰ÒBˆÕCä—Z‘Z×(Ñ(ˆŒ
Ø�‰ ¨,Ð7ˆÔ8ä˜DŸM™MÓ*€EÙJP˜f¼¸T¿W¹W»ÒFÐWhÔjmÐnr×nuÑnuÓjvÐVw€LÜ*ØØØØ
˜U˜GÐ#@ÐAØôô ˜Ð9Ô@SÐTWÓ@X×@]Ñ@]Ô^Ð^øô5 ×$Ñ$ò PÜ˜CÐ!:À,ÔOÒOðPús   ‚:G Ç!G'Ç&G'c           	      ój  — t         j                  j                  || j                  ¬«      j	                  «       st        ddd¬«      S 	 t        j                  j                  |¬«      }t        dd	t        |d
| i¬«      j                  ¬«      S # t        j                  $ r t        ddd¬«      cY S w xY w)Nrp  ræ  úTrip not found.r  r³  )r  úPOD not yet submitted.rµ  úPOD retrieved successfully.r¹  r1  r·  )r   rž   rœ   rŸ   r�   rG   r#   rÈ   r¬  rh   r†  )r¹  ró  r¨  s      rŽ   Útrip_podr-  Ù  s¦   € ô �<‰<×Ñ '¸W¿\¹\ÐÓJ×QÑQÔSÜ˜CÐ!2¸,ÔGÐGðOÜ×%Ñ%×)Ñ)°'Ð)Ó:ˆô ˜Ð:ÄÈsÐ]fÐhoÐ\pÔAq×AvÑAvÔwÐwøô ×'Ñ'ò OÜ˜CÐ!9ÀÔNÒNðOús   Á	 B Â!B2Â1B2c           
      óÐ  — 	 t         j                  j                  || j                  ¬«      }|j                  }|j                  }|�|€t        ddd¬«      S 	 t        «       }t        j                  j                  d
¬«      j                  d
¬«      j                  d¬«      j                  dd«      j                  d«      }t!        |«      }t!        |«      }	d}
t#        ||	|
||d
¬«      }t        dd|j$                  |
||	dœt'        |«      |dœ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        dd	t        |«      ¬«      cY d }~S d }~ww xY w)Nr#  ræ  rŠ  r  r³  r¿  zAShipment pickup coordinates are required to fetch nearby drivers.zMissing coordinates.ú.Unable to fetch drivers location from Traccar.T)rÞ   rß   r¯   rá   rŸ   râ   Úuser__fleet_vehiclesg      @r‘   rµ  z;Nearby verified active transporters retrieved successfully.r³   )rv  r‰   Ú	referencerÓ  Údriversr·  )r   rž   rÈ   rŸ   r¬  rG   Ú
pickup_latÚ
pickup_lonrJ   rË   rÆ   r   rœ   ræ   rç   rL  rÅ   rÛ   rÎ   r"  )r¹  rd  rÿ   rÑ   rÒ   rÔ   rß  rÓ   rÖ   r×   r‰   rÕ   s               rŽ   Úshipper_shipment_nearby_driversr5  å  sy  € ðLÜ×#Ñ#×'Ñ'¨;ÀÇÁÐ'ÓMˆð ×!Ñ!€GØ×!Ñ!€GØ€˜'˜/ÜØØOØ(ô
ð 	
ðcÜ0Ó2ˆô
 	×"Ñ"×)Ñ)¸TÐ)ÓBß	‰˜tˆÓ	$ß	‰�rˆÓ	ß	‰˜ Ó	-ß	Ñ	Ð0Ó	1ð ô �g“€IÜ�g“€IØ€IÜ#ØØØØØØô€Fô ØØEà#Ÿ;™;Ø"Ø!*°9Ñ=Ü˜“[Øñ
ô
ð 
øôK × Ñ ò LÜ˜CÐ!6¸lÔKÒKðLûô ò cÜ˜CÐ!QÔY\Ð]`ÓYaÔbÕbûðcús/   ‚+D Á
D; Ä!D8Ä7D8Ä;	E%ÅE ÅE%Å E%c                 óö  — t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j
                  d   }|j
                  d   }t        |j
                  d   «      }t        |j
                  d   «      }	 t        j                  j                  || j                  ¬	«      }|j                  }t        |«      \  }}		 t        «       }
t#        «       }t%        |||||
d|¬«      }t        dd|j&                  ||||	||dœt)        |«      |dœ¬«      S # t        j                  $ r t        d
dd¬«      cY S w xY w# t        $ r!}t        ddt!        |«      ¬«      cY d }~S d }~ww xY w)Nr·  r¿  r  r³  Úcountry_coderv  r´   Úlngr#  ræ  rŠ  r  r/  Fr­   rµ  z(Driver locations retrieved successfully.r³   )rv  r§   r7  r‰   Úradius_sourcer1  rÓ  r2  )rZ   r†  r  rG   r	  r{  rÅ   r   rž   rÈ   rŸ   r¬  r§   r,   rJ   rË   rÆ   rè   rÛ   rÎ   r"  )r¹  r  r7  rv  rÖ   r×   rÿ   r§   r‰   r9  rÔ   rß  rÓ   rÕ   s                 rŽ   Úshipper_driver_locationsr:    s„  € ô +°·±Ô
=€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×%Ñ% nÑ5€LØ×$Ñ$ ]Ñ3€KÜ�c×(Ñ(¨Ñ/Ó0€IÜ�c×(Ñ(¨Ñ/Ó0€IðLÜ×#Ñ#×'Ñ'¨;ÀÇÁÐ'ÓMˆð %×:Ñ:ÐÜ4°\ÓBÑ€Iˆ}ðcÜ0Ó2ˆô 1Ó2€HÜ#ØØØØØØØ3ô€Fô ØØ2à#Ÿ;™;Ø%:Ø(Ø"Ø*Ø!*°9Ñ=Ü˜“[Øñ	
ôð øô- × Ñ ò LÜ˜CÐ!6¸lÔKÒKðLûô ò cÜ˜CÐ!QÔY\Ð]`ÓYaÔbÕbûðcús0   Â+D' Ã
E Ä'!EÅ
EÅ	E8ÅE3Å-E8Å3E8c           
      óö  — 	 t         j                  j                  |t        j                  j
                  ¬«      }	 |j                  }t        |j                  xs d«      j                  «       }|st        dd	d
¬«      S 	 t        |«      }|j                  d«      }|j                  d«      }|�|€t        ddd¬«      S t        dd|j                  |t!        |«      t!        |«      dœ|j                  d«      dœ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w# t        j                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        ddt        |«      ¬«      cY d }~S d }~ww xY w)N)rV  Ú
role__roleræ  r  r  r³  r•  r¯   r¿  ú)Driver tracking device is not configured.ú%Missing tc_id on transporter profile.ú-Unable to fetch driver location from Traccar.r°   r±   úDriver location is invalid.úMissing latitude/longitude.rµ  z4Transporter current location retrieved successfully.r³   Úraw)r¶   r¼   r¾   rB  r·  )rð  rž   rÈ   r   r­  rh  r¬  rG   ri  r   rÆ   r¼   rÇ   rI   rË   rÎ   rÅ   )	r¹  r¶   rN  rØ   r¼   r¾   rß  r´   rµ   s	            rŽ   Ú$shipper_transporter_current_locationrC  P  st  € ðOÜ—l‘l×&Ñ&¨.ÄXÇ]Á]×E^ÑE^Ð&Ó_ˆðWØ×1Ñ1ˆô �—‘Ò# Ó$×*Ñ*Ó,€EÙÜØØ7Ø9ô
ð 	
ðbÜ-¨eÓ4ˆð �,‰,�zÓ
"€CØ
�,‰,�{Ó
#€CØ
€{�c�kÜ˜CÐ!>ÐFcÔdÐdäØØ>à)Ÿn™nØÜ % c£
´5¸³:Ñ>Ø—<‘< Ó&ñ	
ô	ð 	øô5 ×Ñò OÜ˜CÐ!9ÀÔNÒNðOûô
 ×*Ñ*ò WÜ˜CÐ!AÈÔVÒVðWûô ò bÜ˜CÐ!PÔX[Ð\_ÓX`ÔaÕaûðbús@   ‚9D  ¼D' Â E Ä !D$Ä#D$Ä'!EÅ
EÅ	E8ÅE3Å-E8Å3E8c                 ó<  — 	 t        «       j                  |¬«      }t        | j                  |«      st	        ddd¬«      S t        |«      \  }}}|st	        ddd¬«      S |st	        dd	d
¬«      S 	 t        |«      }|j                  d«      }|j                  d«      }	|�|	€t	        ddd¬«      S |j                  d«      xs i }
|
j                  d«      xs |
j                  d«      }t	        dd|j                  t        |dd«      r|j                  j                  ndt        |«      ||t!        |«      t!        |	«      dœ||
dœ¬«      S # t        j                  $ r t	        ddd¬«      cY S w xY w# t        $ r!}t	        ddt        |«      ¬«      cY d}~S d}~ww xY w)zº
    Latest Traccar position for the trip's assigned driver (or transporter when unassigned).
    Accessible to the shipment shipper, fleet owner (transporter), and assigned driver.
    rU  ræ  r*  r  r³  r¿  zTrip has no driver assigned.zMissing driver.r=  ú Missing tc_id on driver profile.r?  Nr°   r±   r@  rA  rB  ÚfixTimeÚ
deviceTimerµ  ú/Driver current location retrieved successfully.rÿ   r³   )r  r  rª  r¼   rÉ  r¾   r”  rB  r·  )rÆ  rÈ   r   r¬  rG   rÌ  rŸ   rÈ  rI   rË   rÆ   rÎ   rô   rÿ   r  rÊ  rÅ   )r¹  ró  r  rª  r¼   rÉ  r¾   rß  r´   rµ   rB  r”  s               rŽ   Útrip_driver_current_locationrI  {  s¤  € ðHÜ$Ó&×*Ñ*¨gÐ*Ó6ˆô 1°·±¸tÔDÜ˜CÐ!2¸,ÔGÐGä9¸$Ó?Ñ€FˆE�7ÙÜ˜CÐ!?ÐGXÔYÐYÙÜØØ7Ø4ô
ð 	
ðbÜ-¨eÓ4ˆð �,‰,�zÓ
"€CØ
�,‰,�{Ó
#€CØ
€{�c�kÜ˜CÐ!>ÐFcÔdÐdà
�,‰,�uÓ
Ò
# €CØ—'‘'˜)Ó$Ò=¨¯©°Ó(=€KäØØ9à—w‘wÜ4;¸DÀ*ÈdÔ4S˜Ÿ™×0Ò0ÐY]Ü*¨6Ó2ØØÜ % c£
´5¸³:Ñ>Ø&Øñ	
ôð øô; ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô$ ò bÜ˜CÐ!PÔX[Ð\_ÓX`ÔaÕaûðbús/   ‚E
 Á0E1 Å
!E.Å-E.Å1	FÅ:FÆFÆFc                 óJ  — t        | j                  d| i¬«      }|j                  «       st        dd|j                  ¬«      S |j                  «       }t        j                  j                  |¬«      \  }}t        dd|j                  |j                  |j                  d	œ¬
«      S )Nr¹  r-  r¿  r  r³  rÅ  r  z$Transporter registered successfully.r  r·  )rP   r†  r  rG   r	  r?  r   rž   rP  rÄ   rÎ   r·   r
  s        rŽ   Útransporter_registerrK  ²  s‰   € ô (¨W¯\©\ÀIÈwÐCWÔ
X€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ�8‰8‹:€DÜ�}‰}×*Ñ*°Ð*Ó5�H€Eˆ1Ü˜ÐCØ—‘Ø—7‘7Ø—‘ñKô ð r�   c                 ób   — ddl m} t        dd|D ��cg c]
  \  }}||dœ‘Œ c}}¬«      S c c}}w )zDGulf countries for the fleet-owner / driver GCC ID country dropdown.r   )ÚGCC_COUNTRY_CHOICESrµ  z%GCC countries retrieved successfully.)rø  rÜ  r·  )Úcore.countriesrM  rG   )r¹  rM  rø  rÜ  s       rŽ   Útransporter_gcc_countriesrO  Á  s@   € õ 3äØØ/ð 2÷
á��dð  4Ó(ó
ôð ùó
s   “+c                   ó&   — e Zd ZeegZd„ Zd„ Zd„ Zy)ÚTransporterProfileViewc                 ób   — t         j                  j                  dd«      j                  |¬«      S )NrŸ   râ   rÅ  )r   rž   rç   rÈ   )r  rŸ   s     rŽ   Ú_get_profilez#TransporterProfileView._get_profileÕ  s(   € ä×&Ñ&×5Ñ5°f¸lÓKß‰S�dˆS‹^ð	
r�   c                 óÖ   — 	 | j                  |j                  «      }t        |d|i¬«      }t	        dd|j                  ¬	«      S # t        j                  $ r t	        ddd¬«      cY S w xY w)
Nræ  r•  r  r³  r¹  r1  rµ  r  r·  )rS  rŸ   r   r¬  rG   rQ   r†  r  s       rŽ   rÈ   zTransporterProfileView.getÛ  sl   € ð	[Ø×'Ñ'¨¯©Ó5ˆGô +¨7¸YÈÐ<PÔQˆÜ˜CÐ!BÈÏÉÔRÐRøô "×.Ñ.ò 	[Ü Ð%EÈ\ÔZÒZð	[ús   ‚A Á!A(Á'A(c                 ó^  — 	 | j                  |j                  «      }t        ||j                  dd|i¬«      }|j                  «       st	        dd	|j                  ¬«      S |j                  «        t	        d
d|j                  ¬«      S # t        j                  $ r t	        ddd¬«      cY S w xY w)Nræ  r•  r  r³  Tr¹  r\  r¿  r  rµ  r  r·  )
rS  rŸ   r   r¬  rG   rQ   r†  r  r	  r?  r  s       rŽ   r  zTransporterProfileView.patchã  sŸ   € ð	[Ø×'Ñ'¨¯©Ó5ˆGô +Ø˜'Ÿ,™,°¸yÈ'Ð>Rô
ˆð �|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØ�‰Œ
Ü˜CÐ!@ÀsÇxÁxÔPÐPøô "×.Ñ.ò 	[Ü Ð%EÈ\ÔZÒZð	[ús   ‚B Â!B,Â+B,N)	r  r  r  r   rE   r   rS  rÈ   r  r¤   r�   rŽ   rQ  rQ  Ò  s   „ Ø)¨=Ð9Ðò
òSóQr�   rQ  c                   ó,   — e Zd ZeegZd„ Zd„ Zd„ Zd„ Z	y)ÚTransporterDocumentListCreatec                 óè   — 	 | j                   j                  j                  j                  }t        |«      S # t        j
                  $ r' t        j                  j                  }Y t        |«      S w xY wr£   )	r¹  rŸ   ri  rj  r   r¬  rã   rä   rS   )r  rj  s     rŽ   Ú_allowed_doc_typesz0TransporterDocumentListCreate._allowed_doc_typesõ  se   € ð	AØŸ<™<×,Ñ,×@Ñ@×MÑMˆLô 1°Ó>Ð>øô "×.Ñ.ò 	AÜ-×9Ñ9×@Ñ@‰LÜ0°Ó>Ð>ð	Aús   ‚*7 ·-A1Á0A1c                 ó¦   — t         j                  j                  | j                  j                  | j                  «       ¬«      j                  d«      S )N©rŸ   Údocument_type__inr   )r   rž   rœ   r¹  rŸ   rY  r  r!  s    rŽ   r"  z*TransporterDocumentListCreate.get_querysetü  sE   € Ü×"Ñ"×)Ñ)Ø—‘×"Ñ"Ø"×5Ñ5Ó7ð *ó 
÷ ‰(�?Ó
#ð	$r�   c                 ór   — | j                  «       }t        |dd|i¬«      }t        dd|j                  ¬«      S )NTr¹  r$  rµ  z!Documents retrieved successfully.r·  r'  r(  s         rŽ   rc  z"TransporterDocumentListCreate.list	  s7   € Ø×ÑÓ ˆÜ# B¨T¸IÀwÐ;OÔPˆÜ˜CÐ!DÈ3Ï8É8ÔTÐTr�   c           	      ó~  — t        |j                  ||j                  dœ¬«      }|j                  «       st	        dd|j
                  ¬«      S dt        j                  «       j                  d«      › �}t        |«       |j                  |j                  ¬«      }t	        d	d
t        |d|i¬«      j                  ¬«      S )Nr,  r-  r¿  r  r³  r.  r/  rÅ  r  zDocument uploaded successfully.r¹  r1  r·  )rR   r†  rŸ   r  rG   r	  r   rž  r2  rH   r?  rT   )r  r¹  r)  r*  r  r3  r4  s          rŽ   r‘  z$TransporterDocumentListCreate.create	  s    € Ü1Ø—‘Ø '°·±Ñ>ô
ˆð �|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØœŸ™›×0Ñ0°Ó<Ð=Ð>ˆÜ˜'Ô"Ø�h‰h˜GŸL™LˆhÓ)ˆÜØØ-Ü& s°YÀÐ4HÔI×NÑNô
ð 	
r�   N)
r  r  r  r   rE   r   rY  r"  rc  r‘  r¤   r�   rŽ   rW  rW  ò  s"   „ Ø)¨=Ð9Ðò?ò$òUó

r�   rW  c                 ó  — t        | xs d«      j                  «       } | sy|�|j                  | «      }n	 t        | «      }|sy	 t        |d   «      t        |d   «      fS # t        $ r Y yw xY w# t        t        t        f$ r Y yw xY w)zALive Traccar lat/lon for a device id. Returns (lat, lon) or None.r¯   Nr°   r±   )	rÆ   rÇ   rÈ   rI   rÉ   rÅ   rÊ   rË   ÚKeyError)r¼   rÔ   rÙ   s      rŽ   Ú_latest_traccar_lat_lonra  	  s�   € ä�’˜"Ó×$Ñ$Ó&€EÙØØÐ Ø×Ñ Ó&‰ð	Ü,¨UÓ3ˆCñ ØðÜ�S˜‘_Ó%¤u¨S°Ñ-=Ó'>Ð>Ð>øô ò 	Ùð	ûô ”z¤8Ð,ò Ùðús#   ¶A! ÁA0 Á!	A-Á,A-Á0BÂBc                 óÌ   — t         j                  j                  | d¬«      j                  ddd«      D �cg c]$  }|j                  j
                  r|j                  ‘Œ& c}S c c}w )NT©rN  r–   rª  Údriver__roleÚdriver__transporter_profile)r   rž   rœ   rç   rª  r–   )r˜   Úlinks     rŽ   Ú_fleet_linked_driversrg  ,	  sd   € ô *×1Ñ1×8Ñ8ØØð 9ó 
÷ ‰.˜ >Ð3PÓ
Qöàð �;‰;× Ò ð 	�‹òð ùò s   µ)A!c                 óˆ   — t        | «      D ]  }	 |j                  j                  r yŒ y# t        j                  $ r Y Œ4w xY w)NTF)rg  ri  rÞ   r   r¬  ©r˜   rª  s     rŽ   Ú_fleet_has_approved_driverrj  7	  sQ   € Ü'¨Ó.ò ˆð	Ø×)Ñ)×<Ò<Ùð =ðð øô "×.Ñ.ò 	Ùð	ús   �+«AÁ Ac                 ób   — t         j                  j                  | dd¬«      j                  «       S )NT)r˜   r•   r–   )r   rž   rœ   r�   r—   s    rŽ   Ú_fleet_has_verified_vehiclerl  A	  s'   € Ü�?‰?×!Ñ!¨¸4È4Ð!ÓP×WÑWÓYÐYr�   c                  ó   — d d dd dœS )Nr   ©Údriver_locationÚdriver_locationsrÓ  Ú	shipmentsr¤   r¤   r�   rŽ   Ú_fleet_unavailable_payloadrr  E	  s   € àØ ØØñ	ð r�   c                 ó‚   — t         j                  j                  | |dd¬«      j                  d«      j	                  «       S )NT)r˜   rš   r•   r–   r  )r   rž   rœ   r  r  ri  s     rŽ   Ú!_driver_assigned_verified_vehiclert  N	  s=   € ä�‰×ÑØØ"ØØð	 	ó 	
÷ 
‰�-Ó	 ß	‰‹ð	r�   c           
      óp  — t        | «      }	 |r
t        «       ni }g }g }|D ]å  }	 |j                  }|j                  sŒ|j                  sŒ*t        |j                  |«      }|sŒC|\  }}	t        ||	«      }
|
sŒWt        |
«      \  }}t        | |«      }|rt        |«      ng }|j                  |j                  |j                  |j                   ||	dœ|
|r|d   nd|dœ}|j#                  |«       |j#                  |||	|
|||f«       Œç ||fS # t        $ r i }Y Œÿw xY w# t        j
                  $ r Y �Œw xY w)zCLive GPS, country, and zone radius for each approved linked driver.r³   r   N)rÎ   r·   r¸   r¹   Úlocationr7  Úvehicle_typeÚvehicle_types)rg  rJ   rÉ   ri  r   r¬  rÞ   r¼   ra  r2   r+   rt  r:   rÎ   r·   r¸   r¹   rÍ   )r˜   r2  rÔ   ÚlocatedÚlocation_rowsrª  Údriver_profilerÙ   r´   rµ   Úcountryr‰   rR  r,  ÚtypesÚrows                   rŽ   Ú_fleet_located_driversr  [	  si  € ä# EÓ*€GðÙ6=Ô0Ô2À2ˆð €GØ€MØò Mˆð	Ø#×7Ñ7ˆNð ×0Ò0ØØ×#Ò#ØÜ% n×&:Ñ&:¸MÓJˆÙØØ‰ˆˆSÜ(¨¨cÓ2ˆÙØÜ8¸ÓA‰ˆ	�1Ü3°E¸6ÓBˆÙ.5Ô! 'Ô*¸2ˆà—)‘)Ø—\‘\Ø ×+Ñ+Ø×)Ñ)Ø #¨CÑ0Ø#Ù(-˜E !šH°4Ø"ñ	
ˆð 	×Ñ˜SÔ!Ø�‰˜  S¨'°9¸gÀsÐKÕLð=Mð> �MÐ!Ð!øôG ò ØŠðûô "×.Ñ.ò 	Úð	ús"   �D ¥DÄDÄDÄD5Ä4D5©Únearest_distance_kmÚnearby_driversc                ó´   — t        | «      j                  }| j                  �t        | j                  «      nd |d<   |�t	        |d«      nd |d<   |xs g |d<   |S )Nr›  r~   r�  r‚  )rW   r†  r›  rÆ   rÏ   )rÿ   r�  r‚  Úitems       rŽ   Ú_available_shipment_itemr…  †	  so   € Ü1°(Ó;×@Ñ@€Dà)1×)AÑ)AÐ)MŒˆH×$Ñ$Ô%ÐSWð 	Ð	Ñð *=Ð)HŒÐ! 1Ô%Èdð 	Ð	Ñð ,Ò1¨r€DÐ	ÑØ€Kr�   c           	      ó®   — 	 t        | j                  j                  d«      «      dfS # t        $ r#}dt	        ddt        |«      ¬«      fcY d}~S d}~ww xY w)zLReturn (load_type, error_response). error_response is set on invalid values.Ú	load_typeNr¿  r  r³  )r.   Úquery_paramsrÈ   rË   rG   rÆ   )r¹  rß  s     rŽ   Ú_parse_load_type_paramr‰  ’	  sT   € ðMÜ$ W×%9Ñ%9×%=Ñ%=¸kÓ%JÓKÈTÐQÐQøÜò MØ”\ #Ð';Ä3ÀsÃ8ÔLÐLÕLûðMús   ‚%( ¨	A±AÁ	AÁAc                 ó´  — t        | «      \  }}|r|S t        | j                  «      \  }}d}|r|d   d   }|d   |d   dœ}|sát        | j                  j                  d«      «      xs t        |dd«      xs d	}g }	t        | j                  |j                  «      }
t        ||¬
«      D ]H  }t        ||«      sŒt        ||«      sŒ|
rt        ||
«      sŒ,|	j                  t        |dg ¬«      «       ŒJ |	j                  d„ d¬«       t!        dd||t#        |	«      |	dœ¬«      S g }t%        «       }|D ]1  \  }}}}}}}||vsŒ|j'                  |«       |j                  |«       Œ3 g }|D �];  }t        ||¬
«      D �]'  }t        ||«      sŒt)        |j*                  «      }t)        |j,                  «      }g }d}|D ]±  \  }}}}}}} ||k7  rŒt/        ||||«      }!t1        ||||!|«      sŒ/|�t3        ||j4                  «      sŒH|j                  | d   | d   | d   | d   t7        |!d«      | d   | d   | j                  d«      xs | j                  d«      r| d   gng dœ«       |�|!|k  sŒ°|!}Œ³ |sŒø|j                  d„ ¬«       |j                  t        |||¬«      «       �Œ* �Œ> |j                  d„ d¬«       t!        dd||t#        |«      |dœ¬«      S )zMPublished loads near linked drivers' live GPS (pickup country + zone radius).Nr   rv  r´   rµ   r³   r7  Úuser_country_codeÚPK©r‡  r€  c                 ó,   — | j                  d«      xs dS ©Nrû  r¯   ©rÈ   ©r„  s    rŽ   rÂ   z2_fleet_owner_available_shipments.<locals>.<lambda>¹	  s   € ¨T¯X©X°lÓ-CÒ-IÀr€ r�   T©rÄ   Úreverserµ  ú+Available shipments retrieved successfully.rn  r·  rÎ   r·   r¸   r¹   r~   rw  rx  )rÎ   r·   r¸   r¹   r½   rv  rw  rx  c                 ó   — | d   S rÀ   r¤   r‘  s    rŽ   rÂ   z2_fleet_owner_available_shipments.<locals>.<lambda>ñ	  s   € ¨¨mÑ)<€ r�   rÃ   c                 ó,   — | j                  d«      xs dS r�  r�  r‘  s    rŽ   rÂ   z2_fleet_owner_available_shipments.<locals>.<lambda>ø	  ó   €  $§(¡(¨<Ó"8Ò">¸B€ r�   )r‰  r  rŸ   r5   rˆ  rÈ   rô   r7   rj  Ú_published_loads_for_countryr0   r/   r6   rÍ   r…  rÐ   rG   r"  ra  rb  rÅ   r3  r4  r�   Ú_discovery_keeps_shipmentr9   r§   rÏ   )"r¹  rØ   r‡  Úload_type_errorry  rp  ro  ÚlocÚrequested_countryÚfallback_loadsr›   rÿ   Ú	countriesÚseenÚ_driverÚ_latÚ_lonr|  Ú_radiusÚ_vehicleÚ_rowÚmatchesr7  r3  r4  rÕ   Ú	best_distr´   rµ   Údriver_countryr‰   r,  r~  r½   s"                                     rŽ   Ú _fleet_owner_available_shipmentsr©  š	  s{  € ä!7¸Ó!@Ñ€IˆÙØÐô !7°w·|±|Ó DÑ€GÐØ€OÙØ˜qÑ! *Ñ-ˆØ"% e¡*°S¸±ZÑ@ˆáä7¸×8LÑ8L×8PÑ8PÐQ_Ó8`Óaò  YÔelÐmtð  wJð  LPó  fQò  Yð  UYÐØˆÜ=¸g¿l¹lÈG×L`ÑL`ÓaˆÜ4Ð5FÐR[Ô\ò 	ˆHÜ2°7¸HÔEØÜ4°X¸yÔIØÙÔ&PÐQYÐ[iÔ&jØØ×!Ñ!Ô":ØØ$(Ø!ô#õ ð	ð 	×ÑÑ IÐSWÐÔXÜØØ9à#2Ø$4Ü˜^Ó,Ø+ñ	ô	
ð 		
ð €IÜ‹5€DØAHò &Ñ=ˆ��t˜W g¨x¸Ø˜$ÒØ�H‰H�WÔØ×Ñ˜WÕ%ð&ð
 €GØ!ó )ˆÜ4°\ÈYÔWó (	ˆHÜ4°X¸yÔIØÜ˜x×2Ñ2Ó3ˆJÜ˜x×2Ñ2Ó3ˆJØˆFØˆIØNUò ,ÑJ�˜˜c >°9¸gÀsØ! \Ò1ØÜ+¨C°°jÀ*ÓM�Ü0Ø˜X |°[À)ôð ØÐ&Ô/LØ˜X×;Ñ;ô0ð Ø—‘Ø˜d™)Ø  ™\Ø"% lÑ"3Ø!$ [Ñ!1Ü#(¨°aÓ#8Ø # J¡Ø$'¨Ñ$7Ø%(§W¡W¨_Ó%=ò &Ø14·±¸Ô1H˜˜^Ñ,Ñ-Èbñô ð Ð$¨°iÓ(?Ø +‘Ið3,ñ4 ØØ�K‰KÑ<ˆKÔ=Ø�N‰NÔ3ØØ$-Ø%ôö òI(	ð)ðV ‡L�LÑ>È€LÔMÜØØ5à.Ø 0Ü˜“\Ø ñ	
ô	ð 	r�   c                 ó  ‡ ‡‡‡— t        ‰ «      \  Š}|r|S t        ‰ j                  j                  d«      «      Š‰st	        ddd¬«      S ˆˆˆˆ fd„}‰j
                  s |«       S 	 t        ‰j
                  «      }|s |«       S |j                  d«      }|j                  d«      }|�|€ |«       S t        |«      t        |«      d	œ}t        ||«      }|‰k7  r |«       S t        |«      \  }	}
t        ‰ j                  ‰j                  «      }|s |«       S g }t        ‰‰¬
«      D ]ž  }t        ‰|«      sŒt!        |‰«      sŒt#        ||«      sŒ*t        |j$                  «      }t        |j&                  «      }t)        t        |«      t        |«      ||«      }‰t*        k7  r||	kD  rŒƒ|j-                  t/        ||¬«      «       Œ  |j1                  d„ d¬«       t	        dd|t3        |«      |dœ¬«      S # t        $ r
  |«       cY S w xY w)zONearby published loads for the logged-in driver's Traccar GPS and vehicle type.r7  r¿  r  úEcountry_code is required and must be a valid ISO 3166-1 alpha-2 code.r³  c                  óT  •— t        ‰j                  ‰j                  «      } g }t        ‰‰¬«      D ]G  }t	        ‰|«      sŒt        |‰«      sŒ| rt        || «      sŒ,|j                  t        |d ¬«      «       ŒI |j                  d„ d¬«       t        ddd t        |«      |dœ¬	«      S )
Nr�  ©r�  c                 ó,   — | j                  d«      xs dS r�  r�  r‘  s    rŽ   rÂ   z]_individual_driver_available_shipments.<locals>._fallback_all_country_loads.<locals>.<lambda>
  s   €  4§8¡8¨LÓ#9Ò#?¸R€ r�   Tr’  rµ  r”  ©ro  rÓ  rq  r·  )r7   rŸ   rj  r˜  r0   r/   r6   rÍ   r…  rÐ   rG   r"  )Úvehiclesr†  rÿ   r7  r‡  rØ   r¹  s      €€€€rŽ   Ú_fallback_all_country_loadszK_individual_driver_available_shipments.<locals>._fallback_all_country_loads
  s­   ø€ Ü7¸¿¹Àg×FZÑFZÓ[ˆØˆÜ4°\ÈYÔWò 	VˆHÜ2°7¸HÔEØÜ4°X¸yÔIØÙÔ JÈ8ÐU]Ô ^ØØ�K‰KÔ0°ÈtÔTÕUð	Vð 	�	‰	Ñ?Èˆ	ÔNÜØØ9à#'Ü˜T›Ø!ñô
ð 	
r�   r°   r±   r³   r�  r­  c                 ó,   — | j                  d«      xs dS r�  r�  r‘  s    rŽ   rÂ   z8_individual_driver_available_shipments.<locals>.<lambda>U
  s   € ˜tŸx™x¨Ó5Ò;¸€ r�   Tr’  rµ  r”  r¯  r·  )r‰  r5   rˆ  rÈ   rG   r¼   rI   rÉ   rÅ   r2   r+   r7   rŸ   rj  r˜  r0   r/   r6   r3  r4  r�   r-   rÍ   r…  rÐ   r"  )r¹  rØ   rš  r±  r¾   r´   rµ   ro  r¨  Úsearch_radius_kmÚ_radius_sourcer°  r†  rÿ   r3  r4  r½   r7  r‡  s   ``               @@rŽ   Ú&_individual_driver_available_shipmentsrµ  
  s  û€ ä!7¸Ó!@Ñ€IˆÙØÐä.¨w×/CÑ/C×/GÑ/GÈÓ/WÓX€LÙÜØØ ØYô
ð 	
÷
ð, �=Š=Ù*Ó,Ð,ð-Ü-¨g¯m©mÓ<ˆñ Ù*Ó,Ð,à
�,‰,�zÓ
"€CØ
�,‰,�{Ó
#€CØ
€{�c�kÙ*Ó,Ð,ä# C›j´°s³Ñ<€Oä+¨C°Ó5€NØ˜Ò%Ù*Ó,Ð,ä'HÈÓ'XÑ$Ð�nÜ3°G·L±LÀ'×BVÑBVÓW€HÙÙ*Ó,Ð,à€DÜ0°ÈÔSò YˆÜ.¨w¸ÔAØÜ0°¸9ÔEØÜ9¸(ÀHÔMØÜ˜8×.Ñ.Ó/ˆ
Ü˜8×.Ñ.Ó/ˆ
Ü#¤E¨#£J´°c³
¸JÈ
ÓSˆàÔ4Ò4¸ÐGWÒ9WØØ�‰Ô,¨XÈ;ÔWÕXðYð 	‡I�IÑ;ÀT€IÔJÜØØ5à.Ü˜“YØñ
ôð øôO ò -Ù*Ó,Ò,ð-ús   Á'G7 Ç7H
È	H
c                 óü   — 	 | j                   j                  }|j
                  t        j                  j                  k(  rt        | |«      S t        | |«      S # t        j                  $ r t	        ddd¬«      cY S w xY w)a‹  List published loads.

    Always fetches live Traccar positions on this request.
    Individual / fleet-linked drivers: required ``country_code``, live GPS
    in that country, zone radius, and matching verified+active vehicle type.
    Fleet owners: loads near linked drivers' live GPS (pickup country + zone).
    ``country_code`` is ignored; GPS country of each approved driver is used.
    ræ  r•  r  r³  )
rŸ   ri  r   r¬  rG   rj  rã   r}  r©  rµ  )r¹  rØ   s     rŽ   Útransporter_available_shipmentsr·  a
  sw   € ðWØ—,‘,×2Ñ2ˆð ×ÑÔ1×=Ñ=×IÑIÒIÜ/°¸ÓAÐAÜ1°'¸7ÓCÐCøô ×*Ñ*ò WÜ˜CÐ!AÈÔVÒVðWús   ‚A Á!A;Á:A;c                 ó´  — t        |d| i¬«      j                  }|j                  �t        |j                  «      nd |d<   t	        |d«      |d<   |rt        ||j                  «      nd |d<   |rt        |«      nd }|�t        |«      nd |d<   t        j                  j                  |j                  | j                  ¬«      j                  «       |d	<   ||d
<   |S )Nr¹  r1  r›  r~   Údistance_from_driver_kmÚmatched_vehicle_typeÚmax_capacity_for_type)rM  rN  Úfavorite_for_this_shipperr‚  )rW   r†  r›  rÆ   rÏ   r4   r§   r8   rÅ   r%   rž   rœ   rM  rŸ   r�   )r¹  rÿ   r½   Úmatched_vehicler‚  r„  Úcapacity_tonss          rŽ   Ú_discovery_load_itemr¿  v
  sø   € Ü1Ø˜9 gÐ.ôç
�dð 	ð *2×)AÑ)AÐ)MŒˆH×$Ñ$Ô%ÐSWð 	Ð	Ñô ',¨K¸Ó&;€DÐ	"Ñ#ñ ô 	˜o¨x×/MÑ/MÔNàð 	Ð	Ñ ñ
 ?NÔ)¨/Ô:ÐSW€MØ<IÐ<U¤E¨-Ô$8Ð[_€DÐ	 Ñ!Ü(;×(CÑ(C×(JÑ(JØ× Ñ ¨g¯l©lð )Kó )ç�fƒhð 	Ð	$Ñ%ð ,€DÐ	ÑØ€Kr�   r�  c                ó¬  — ddl m}m} t        j                  j                  t        j                  j                  | ¬«      j                  d¬«      j                  d¬«      j                  ddd	«      j                  d
«      }||k(  r|j                  dd¬«      }|S ||k(  r3|j                  dd¬«      j                  d¬«      j                  d¬«      }|S )zIPublished loads for pickup country; optional strict load_type SQL filter.r   )r-   ÚLOAD_TYPE_LOCAL)r   Úpickup_country_code__iexactT)Úpickup_lat__isnull)Úpickup_lon__isnullrM  rù  rú  rù  F)ÚlocalÚcountry_to_country)Údelivery_country_code__isnullr¯   )Údelivery_country_code)Úcore.load_typer-   rÁ  r   rž   rœ   r  r  ræ   rç   r  )r7  r‡  r-   rÁ  r«   s        rŽ   r˜  r˜  Œ
  sê   € çLä	×	Ñ	×	 Ñ	 Ü�‰×(Ñ(Ø$0ð 
!ó 
÷ �gØð ó ç�gØð ó ç�nØØØ"ó÷ �hˆ}Óð ð �OÒ#Ø�Y‰Y˜T°eˆYÓ<ˆð €Ið 
Ð2Ò	2ð �Y‰Y˜U°tˆYÓ<×DÑDØ*.ð Eó 
ç
‰'Ø"$ð ó 
ð 	ð
 €Ir�   c                 ó¢   — | j                   syt        | j                  «      }t        | j                  «      }||k(  xr t	        |«      xr ||k7  S )zIC2C load with pickup in country_code and drop-off in a different country.F)rÆ  r*   Úpickup_country_coderÈ  ró   )rÿ   r7  ÚpickupÚdeliverys       rŽ   Ú_is_cross_border_c2c_loadrÎ  ª
  sL   € à×&Ò&ØÜ# H×$@Ñ$@ÓA€FÜ% h×&DÑ&DÓE€HØ�\Ñ!ÒK¤d¨8£nÒK¸ÀVÑ9KÐKr�   c                 ó¦   — | j                   rt        |j                   «      xr ||k  S | j                  r|j                   r||k  S t        ||«      S y)zSLocal drivers: nearby local loads only. C2C drivers: nearby local + in-country C2C.F)rÅ  ró   rÆ  rÎ  )rØ   rÿ   r7  r½   r‰   s        rŽ   r™  r™  ³
  sM   € à‡}‚}Ü�H—N‘NÓ#Ò@¨°yÑ(@Ð@Ø×!Ò!Ø�>Š>Ø )Ñ+Ð+Ü(¨°<Ó@Ð@Ør�   c                 ó†  — 	 | j                   j                  }t        | «      \  }}|r|S t        | j                  j                  d«      «      }|st	        ddd¬«      S |j                  st	        dd	d
¬«      S 	 t        |j                  «      }|j                  d«      }|j                  d«      }|�|€t	        ddd¬«      S t        |«      \  }	}
t        | j                   |j                  «      }g }t!        ||¬«      D ]¦  }t#        ||«      sŒ|rt%        ||«      sŒt'        |j(                  «      }t'        |j*                  «      }t-        t'        |«      t'        |«      ||«      }t/        |||||	«      sŒy|rt1        ||«      nd }|j3                  t5        | |||g «      «       Œ¨ |j7                  d„ d¬«       t	        ddt'        |«      t'        |«      dœ||	|
t9        |«      |dœ¬«      S # t        j                  $ r t	        ddd¬«      cY S w xY w# t        $ r!}t	        ddt        |«      ¬«      cY d }~S d }~ww xY w)Nræ  r•  r  r³  r7  r¿  r  r«  r=  r>  r?  r°   r±   r@  rA  r�  c                 ó,   — | j                  d«      xs dS r�  r�  r‘  s    rŽ   rÂ   z,transporter_load_discovery.<locals>.<lambda>û
  r—  r�   Tr’  rµ  z$Nearby loads retrieved successfully.r³   )ro  r7  r‰   r9  rÓ  Úloadsr·  )rŸ   ri  r   r¬  rG   r‰  r5   rˆ  rÈ   r¼   rI   rË   rÆ   r+   r7   rj  r˜  r/   r6   rÅ   r3  r4  r�   r™  r3   rÍ   r¿  rÐ   r"  )r¹  rØ   r‡  rš  r7  r¾   rß  r´   rµ   r³  r9  r›   r¦  rÿ   r3  r4  r½   r½  s                     rŽ   Útransporter_load_discoveryrÓ  ¾
  sZ  € ðWØ—,‘,×2Ñ2ˆô "8¸Ó!@Ñ€IˆÙØÐä.¨w×/CÑ/C×/GÑ/GÈÓ/WÓX€LÙÜØØ ØYô
ð 	
ð �=Š=ÜØØ7Ø9ô
ð 	
ðbÜ-¨g¯m©mÓ<ˆð �,‰,�zÓ
"€CØ
�,‰,�{Ó
#€CØ
€{�c�kÜ˜CÐ!>ÐFcÔdÐdä&GÈÓ&UÑ#Ð�mä9¸'¿,¹,È×H\ÑH\Ó]€Nà€GÜ0°ÈÔSò ˆÜ0°¸9ÔEØÙÔ"LÈXÐWeÔ"fØä˜8×.Ñ.Ó/ˆ
Ü˜8×.Ñ.Ó/ˆ
Ü#¤E¨#£J´°c³
¸JÈ
ÓSˆÜ(Ø�X˜|¨[Ð:Jô
ð áM[Ô/°¸.ÔIÐaeˆØ�‰Ô+Ø�X˜{¨O¸Ró
õ 	ðð& ‡L�LÑ>È€LÔMäØØ.ô ˜S“zÜ˜S“zñ ð )Ø)Ø*Ü˜“\Øñ

ôð øôu ×*Ñ*ò WÜ˜CÐ!AÈÔVÒVðWûô0 ò bÜ˜CÐ!PÔX[Ð\_ÓX`ÔaÕaûðbús/   ‚G/ Á9H Ç/!HÈHÈ	I ÈH;È5I È;I c                 óö   — t         j                  j                  | j                  ¬«      j	                  dd«      j                  d«      }t        |d¬«      j                  }t        ddt        |«      |d	œ¬
«      S )zXVehicles where the logged-in user is assigned_driver (fleet owner assigned this driver).r™   r˜   rš   r  Trg  rµ  z)Assigned vehicles retrieved successfully.)rÓ  r°  r·  )
r   rž   rœ   rŸ   rç   r  ri   r†  rG   r"  )r¹  r«   r†  s      rŽ   Útransporter_vehicles_assignedrÕ    sl   € ô
 	�‰×Ñ¨w¯|©|ÐÓ<ß	‰˜Ð!2Ó	3ß	‰�-Ó	 ð ô
 ˜R dÔ+×0Ñ0€DÜØØ3Ü˜4“y¨dÑ3ôð r�   c                   ó&   — e Zd ZeegZd„ Zd„ Zd„ Zy)ÚTransporterVehicleListCreatec                 ój   — t         j                  j                  | j                  j                  ¬«      S ©Nr—   ©r   rž   rœ   r¹  rŸ   r!  s    rŽ   r"  z)TransporterVehicleListCreate.get_queryset"  ó$   € Ü�‰×%Ñ%¨D¯L©L×,=Ñ,=Ð%Ó>Ð>r�   c                 ón   — t        | j                  «       dd|i¬«      }t        dd|j                  ¬«      S )NTr¹  r$  rµ  z Vehicles retrieved successfully.r·  )ri   r"  rG   r†  )r  r¹  r)  r*  r  s        rŽ   rc  z!TransporterVehicleListCreate.list%  s3   € Ü × 1Ñ 1Ó 3¸$ÈÐT[ÐH\Ô]ˆÜ˜CÐ!CÈ#Ï(É(ÔSÐSr�   c           	      óh  — t        |j                  d|i¬«      }|j                  «       st        dd|j                  ¬«      S 	 |j                  |j                  dd¬«      }d
dlm	}  ||«       t        ddt        |d|i¬«      j                  ¬«      S # t        $ r t        dddd	gi¬«      cY S w xY w)Nr¹  r-  r¿  r  r³  F)r˜   r–   r•   Úregistration_numberú9You already have a vehicle with this registration number.r   )Ú(copy_kyc_vehicle_registration_to_vehicler  zVehicle created successfully.r1  r·  )
ri   r†  r  rG   r	  r?  rŸ   r   Úaccounts.vehicle_docsrà  )r  r¹  r)  r*  r  r,  rà  s          rŽ   r‘  z#TransporterVehicleListCreate.create)  s¼   € Ü W§\¡\¸IÀwÐ;OÔPˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLð	Ø—h‘h W§\¡\¸UÐPU�hÓVˆGõ 	Sá0°Ô9ÜØØ+Ü" 7°YÀÐ4HÔI×NÑNô
ð 	
øô ò 		ÜØØ$à)ØSð,ðôò ð		ús   ÁB ÂB1Â0B1N)	r  r  r  r   rE   r   r"  rc  r‘  r¤   r�   rŽ   r×  r×    s   „ Ø)¨=Ð9Ðò?òTó
r�   r×  c                   ó&   — e Zd ZeegZd„ Zd„ Zd„ Zy)ÚTransporterVehicleDetailc                 ój   — t         j                  j                  | j                  j                  ¬«      S rÙ  rÚ  r!  s    rŽ   r"  z%TransporterVehicleDetail.get_querysetF  rÛ  r�   c           	      ól   — | j                  «       }t        ddt        |d|i¬«      j                  ¬«      S )Nrµ  zVehicle retrieved successfully.r¹  r1  r·  )rW  rG   ri   r†  )r  r¹  r)  r*  r,  s        rŽ   rZ  z!TransporterVehicleDetail.retrieveI  s6   € Ø—/‘/Ó#ˆÜØØ-Ü" 7°YÀÐ4HÔI×NÑNô
ð 	
r�   c           	      óT  — | j                  «       }t        ||j                  dd|i¬«      }|j                  «       st	        dd|j
                  ¬«      S 	 |j                  «       }t	        d	d
t        |d|i¬«      j                  ¬«      S # t        $ r t	        ddddgi¬«      cY S w xY w)NTr¹  r\  r¿  r  r³  rÞ  rß  rµ  zVehicle updated successfully.r1  r·  )rW  ri   r†  r  rG   r	  r?  r   )r  r¹  r)  r*  r,  r  r^  s          rŽ   rx  zTransporterVehicleDetail.updateQ  s´   € Ø—/‘/Ó#ˆÜ ¨g¯l©lÀDÐS\Ð^eÐRfÔgˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLð	Ø—h‘h“jˆGô ØØ+Ü" 7°YÀÐ4HÔI×NÑNô
ð 	
øô ò 		ÜØØ$à)ØSð,ðôò ð		ús   ÁB
 Â
B'Â&B'N)	r  r  r  r   rE   r   r"  rZ  rx  r¤   r�   rŽ   rã  rã  C  s   „ Ø)¨=Ð9Ðò?ò
ó
r�   rã  c                 ó®  — 	 t         j                  j                  || j                  ¬«      }t        | j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j                  j                  d	«      }|€<d |_        |j                  d
dg¬«       t        ddt        |«      j                  ¬«      S 	 t        j                  j                  |¬«      }	 |j                  j                  t         j"                  j$                  k7  rt        ddd¬«      S 	 ||_        |j                  d
dg¬«       t        ddt        |«      j                  ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w# t        j                  $ r t        ddd¬«      cY S w xY w# t         j                  $ r t        ddd¬«      cY S w xY w)N©rV  r˜   ræ  úVehicle not found.r  r³  r·  r¿  r  Ú	driver_idrš   r7  r8  rµ  úDriver unassigned successfully.rU  úDriver not found.ú+Assigned user must be a transporter/driver.úInvalid driver role.ú#Assigned user has no role assigned.úDriver assigned successfully.)r   rž   rÈ   rŸ   r¬  rG   rj   r†  r  r	  r{  rš   r?  ri   rð  rÌ   r   r­  rh  )r¹  Ú
vehicle_pkr,  r  rê  rª  s         rŽ   Ú!transporter_vehicle_assign_driverrò  i  s±  € ðKÜ—/‘/×%Ñ%¨¸7¿<¹<Ð%ÓHˆô (¨W¯\©\Ô
:€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×"Ñ"×&Ñ& {Ó3€IØÐØ"&ˆÔØ�‰Ð$5°|Ð#DˆÔEÜ˜CÐ!BÔIZÐ[bÓIc×IhÑIhÔiÐiðJÜ—‘×!Ñ! YÐ!Ó/ˆðfØ�;‰;×ÑœxŸ}™}×8Ñ8Ò8Ü Ð%RÐZpÔqÐqð 9ð
 %€GÔØ‡L�LÐ 1°<Ð@€LÔAÜ˜Ð<ÔCTÐU\ÓC]×CbÑCbÔcÐcøô1 ×Ñò KÜ˜CÐ!5¸\ÔJÒJðKûô ×Ñò JÜ˜CÐ!4¸LÔIÒIðJûô
 × Ñ ò fÜ˜CÐ!FÐNdÔeÒeðfús5   ‚+E" Ã F	 Ã&>F0 Å"!FÆFÆ	!F-Æ,F-Æ0!GÇGc           
      óF  — 	 t         j                  j                  ddd«      j                  || j                  ¬«      }t        | j                  ¬	«      }|j                  «       st        d
d|j                  ¬«      S |j                  j                  d«      }|€<d |_        |j                  ddg¬«       t        ddt        |«      j                  ¬	«      S 	 t        j                  j                  |¬«      }	 |j                   j                   t"        j$                  j&                  k7  rt        d
dd¬«      S 	 t(        j                  j+                  | j                  |d¬«      j-                  «       st        d
dd¬«      S ||_        |j                  ddg¬«       	 |j.                  }|j0                  |j2                  k7  r||_        |j                  dg¬«       	 t?        |j2                  gdtA        |j2                  «      tA        |jB                  «      tA        |j2                  «      tA        | j                  j2                  «      dœdd¬ «       t        dd!t        |«      j                  ¬	«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t        j
                  $ r t        ddd¬«      cY S w xY w# t"        j
                  $ r t        d
dd¬«      cY S w xY w# t6        j
                  $ r& t9        |j:                  |j<                  |¬«      }Y �ŒDw xY w)"NrN  rš   rÿ   )rV  rN  ræ  r*  r  r³  r·  r¿  r  rê  r7  r8  rµ  rë  rU  rì  rí  rî  rï  T)rN  rª  r–   z)Driver is not linked to this transporter.zInvalid driver link.r  r  ÚTRIP_ASSIGNED)r  rv  r  Úassigned_byzTrip assignedz=You have been assigned a new trip and added to the trip chat.rE  rð  )"r   rž   rç   rÈ   rŸ   r¬  rG   rq   r†  r  r	  r{  rš   r?  rc   rð  rÌ   r   r­  rh  r   rœ   r�   r[  r  rÎ   r  r!   rS  rÿ   rN  rK   rÆ   rv  )r¹  ró  r  r  rê  rª  rQ  s          rŽ   Útransporter_trip_assign_driverrö  ‰  sÄ  € ðHÜ�|‰|×*Ñ*¨=Ð:KÈZÓX×\Ñ\Ø G§L¡Lð ]ó 
ˆô %¨'¯,©,Ô
7€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×"Ñ"×&Ñ& {Ó3€IØÐØ#ˆÔØ�	‰	Ð!2°LÐ Aˆ	ÔBÜ˜CÐ!BÔIhÐimÓIn×IsÑIsÔtÐtðJÜ—‘×!Ñ! YÐ!Ó/ˆðfØ�;‰;×ÑœxŸ}™}×8Ñ8Ò8Ü Ð%RÐZpÔqÐqð 9ô
 !×(Ñ(×/Ñ/¸G¿L¹LÐQWÐcgÐ/Óh×oÑoÔqÜ˜CÐ!LÐTjÔkÐkà!€DÔØ‡I�IÐ.°Ð=€IÔ>ð.Ø× Ñ ˆð �<‰<˜4Ÿ7™7Ò"ØˆDŒIØ�I‰I V HˆIÕ-ÜØ	�‰ˆØä˜4Ÿ7™7“|Ü˜t×/Ñ/Ó0Ü" 4§7¡7›|Ü˜wŸ|™|Ÿ™Ó/ñ		
ð ØLõô ˜Ð<ÔCbÐcgÓCh×CmÑCmÔnÐnøôe ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô ×Ñò JÜ˜CÐ!4¸LÔIÒIðJûô × Ñ ò fÜ˜CÐ!FÐNdÔeÒeðfûô ×$Ñ$ò cÜ6°t·}±}Àd×FVÑFVÐ]aÔb‹ðcúsG   ‚<I2 Ã J Ã7>K  ÆK' É2!JÊJÊ!J=Ê<J=Ë !K$Ë#K$Ë'5L ÌL c           	      ó
  — | j                   dk(  rt        j                  j                  | j                  d¬«      j                  ddd«      j                  d«      }t        |dd| i¬	«      j                  }t        d
dt        |«      |dœ¬«      S t        | j                  | j                  | dœ¬«      }|j                  «       st        dd|j                  ¬«      S 	 |j                  «       }t        j                  j                  ddd«      j%                  | j                  |¬«      }t        ddt        |d| i¬«      j                  ¬«      S # t        j                   $ r"}t        dd|j"                  ¬«      cY d }~S d }~ww xY w)Nr¯  Trc  rª  rd  re  rù  r¹  r$  rµ  z%Fleet drivers retrieved successfully.)rÓ  r2  r·  )Úfleet_ownerr¹  r-  r¿  r  r³  )rN  rª  r  z#Driver added to fleet successfully.r1  )r  r   rž   rœ   rŸ   rç   r  rt   r†  rG   r"  rr   r  r	  r?  r   rP  r<  rÈ   )r¹  Úlinksr†  r  Údriver_userrß  rf  s          rŽ   Úfleet_driver_list_createrû  Æ  s[  € ð ‡~�~˜Òä!×)Ñ)ß‰V §¡¸ˆVÓ=ß‰^˜H nÐ6SÓTß‰X�mÓ$ð	 	ô % U°À	È7Ð?SÔT×YÑYˆÜ˜CÐ!HÔY\Ð]aÓYbÐosÑOtÔuÐuä
%Ø�\‰\Ø '§¡¸ÑAô€Cð �<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHðIØ—h‘h“jˆô !×(Ñ(×7Ñ7Ø�.Ð"?óç	�c�g—l‘l¨;€cÓ7ð 	ô ØØ-Ü" 4°)¸WÐ1EÔF×KÑKôð øô ×&Ñ&ò IÜ˜CÐ!5¸S¿Z¹ZÔHÕHûðIús   ÃE ÅFÅ E=Å7FÅ=F)r¯  ÚPATCHÚDELETEc           	      ó¾  — 	 t         j                  j                  ddd«      j                  | j                  |¬«      }| j                  d	k(  r%t        d
dt        |d| i¬«      j                  ¬«      S | j                  dk(  �rt        | j                  d| i¬«      }|j                  «       st        dd|j                  ¬«      S |j                  }g }g }d|j                  v r±|j                  d   j                  «       j!                  «       }||j"                  k7  rwt$        j                  j'                  |¬«      j)                  |j*                  ¬«      j-                  «       rt        ddd¬«      S ||_        ||_        |j1                  ddg«       d|j                  v r/|j3                  |j                  d   «       |j5                  d«       dD ]<  }||j                  v sŒt7        |||j                  |   «       |j5                  |«       Œ> |r|j9                  |¬«       d|j                  v r0	 |j                  d   |j:                  _        |j5                  d«       d|j                  v r0	 |j                  d   |j:                  _         |j5                  d«       |r |j:                  j9                  |dgz   ¬«       |j                  j                  d«      }	|	r6	 |jB                  }
|
�'tG        |	| d ¬!«      |
_$        |
j9                  d"dg¬«       d#|j                  v r,	 tK        ||j                  j                  d#«      xs g | ¬$«       |jS                  «        t        d
d%t        |d| i¬«      j                  ¬«      S d&|_*        |j9                  d'dg¬«       t        d
d(|d&d)œ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t>        j
                  $ r Y �Œ‹w xY w# t>        j
                  $ r Y �Œgw xY w# tD        j
                  $ r d }
Y �Œ7w xY w# tL        jN                  $ r"}t        dd|jP                  ¬«      cY d }~S d }~ww xY w)*Nrª  rd  re  )rN  rê  ræ  úDriver not found in your fleet.r  r³  r¯  rµ  zDriver retrieved successfully.r¹  r1  r·  rü  r-  r¿  r  r·   )rÃ  rU  z(Email already in use by another account.zDuplicate email.rÃ  r¾  )r¸   r¹   r8  rº   Úlanguager7  ÚavatarrŸ   )ÚkindÚ
avatar_urlÚ	documentsrÏ  zDriver updated successfully.Fr–   zDriver removed from fleet.)rê  r–   )+r   rž   rç   rÈ   rŸ   r¬  rG   r  rt   r†  rs   r  r	  rª  r{  rÇ   rò   r·   rð  rœ   ræ   rV  r�   rÃ  Úextendr  rÍ   Úsetattrr?  rÌ   rº   r   r   ri  r   rw   r  rx   r   rP  r<  rQ  r–   )r¹  rê  rf  r  rª  Úchanged_userÚchanged_roleÚ	new_emailÚfieldÚavatar_filerØ   rß  s               rŽ   Úfleet_driver_detailr  ç  s   € ðXä!×)Ñ)ß‰^˜H nÐ6SÓTß‰S˜WŸ\™\°YˆSÓ?ð 	ð ‡~�~˜ÒÜØØ,Ü& t°iÀÐ5IÔJ×OÑOô
ð 	
ð ‡~�~˜Ó Ü)¨w¯|©|ÀiÐQXÐEYÔZˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØ—‘ˆØˆØˆà�c×(Ñ(Ñ(Ø×*Ñ*¨7Ñ3×9Ñ9Ó;×AÑAÓCˆIØ˜FŸL™LÒ(Ü—<‘<×&Ñ&°	Ð&Ó:×BÑBÀfÇiÁiÐBÓP×WÑWÔYÜ'¨Ð-WÐ_qÔrÐrØ"+�”Ø(�”Ø×#Ñ# Z°Ð$9Ô:à˜×+Ñ+Ñ+Ø×Ñ × 2Ñ 2°:Ñ >Ô?Ø×Ñ 
Ô+à0ò 	+ˆEØ˜×*Ñ*Ò*Ü˜  s×'9Ñ'9¸%Ñ'@ÔAØ×#Ñ# EÕ*ð	+ñ Ø�K‰K lˆKÔ3à�c×(Ñ(Ñ(ðØ$'×$6Ñ$6°wÑ$?�—‘Ô!Ø×#Ñ# GÔ,ð ˜×+Ñ+Ñ+ðØ'*×'9Ñ'9¸*Ñ'E�—‘Ô$Ø×#Ñ# JÔ/ñ Ø�K‰K×Ñ¨<¸<¸.Ñ+HÐÔIà×(Ñ(×,Ñ,¨XÓ6ˆÙðØ ×4Ñ4�ð Ð"Ü%<ØØØô&�Ô"ð
 —‘¨L¸,Ð+G�ÔHà˜#×,Ñ,Ñ,ðQÜ+ØØ×&Ñ&×*Ñ*¨;Ó7Ò=¸2Ø#õð 	×ÑÔÜØØ*Ü& t°iÀÐ5IÔJ×OÑOô
ð 	
ð €D„NØ‡I�I˜[¨,Ð7€IÔ8Ü˜Ð9ÈiÐfkÑ@lÔmÐmøôo !×-Ñ-ò XÜ˜CÐ!BÈ,ÔWÒWðXûôT ×(Ñ(ò Úðûô ×(Ñ(ò Úðûô &×2Ñ2ò Ø“ðûô" ×.Ñ.ò QÜ# CÐ)=ÀSÇZÁZÔPÕPûðQúse   ‚<N0 È3/O É1/O1 Ë P Ì$+P' Î0!OÏOÏO.Ï-O.Ï1PÐPÐP$Ð#P$Ð'QÐ:QÑQÑQc           	      ó<  — 	 t         j                  j                  d«      j                  | j                  |d¬«      }|j                  }| j                  dk(  r\t        j                  j                  |t        ¬	«      j                  d
«      }t        |dd| i¬«      }t        dd|j                  ¬«      S t        | j                  | |t         j"                  j$                  dœ¬«      }|j'                  «       st        dd|j(                  ¬«      S dt+        j,                  «       j/                  d«      › �}t1        |«       |j3                  |¬«      }t        ddt        |d| i¬«      j                  ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w)zXList/upload KYC docs for a linked fleet driver (same types/expiry as individual driver).rª  T©rN  rê  r–   ræ  rÿ  r  r³  r¯  r[  r   r¹  r$  rµ  z(Driver documents retrieved successfully.r·  )r¹  rŸ   Úforce_account_typer-  r¿  r  r.  r/  rÅ  r  z&Driver document uploaded successfully.r1  )r   rž   rç   rÈ   rŸ   r¬  rG   rª  r  r   rœ   ry   r  rT   r†  rR   r   rã   rä   r  r	  r   rž  r2  rH   r?  )r¹  rê  rf  rª  r«   r  r3  r4  s           rŽ   Úfleet_driver_documentsr  J  sx  € ðXä!×)Ñ)ß‰^˜HÓ%ß‰S˜WŸ\™\°YÈ$ˆSÓOð 	ð �[‰[€FØ‡~�~˜ÒÜ× Ñ ×'Ñ'ØÜ:ð (ó 
÷ ‰(�?Ó
#ð 	ô $ B¨T¸IÀwÐ;OÔPˆÜ˜CÐ!KÐRU×RZÑRZÔ[Ð[ä
-Ø�\‰\àØÜ"4×"@Ñ"@×"GÑ"Gñ
ô€Cð �<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ”X—\‘\“^×,Ñ,¨ZÓ8Ð9Ð:€GÜ�gÔØ
�(‰(˜ˆ(Ó
€CÜØØ0Ü" 3°¸GÐ0DÔE×JÑJôð øô3 !×-Ñ-ò XÜ˜CÐ!BÈ,ÔWÒWðXús   ‚;E7 Å7!FÆFc                 óˆ  — 	 t         j                  j                  ddd«      j                  | j                  |d¬«      }|j                  }	 |j                  }t        |j                  xs d«      j                  «       }|st        ddd¬	«      S 	 t        |«      }|j                  d«      }|j                  d«      }	|�|	€t        ddd¬	«      S |j                  d«      xs i }
|
j                  d«      xs |
j                  d«      }t        ddt        |«      ||j                   xs dt#        |«      t#        |	«      dœ||
dœ¬«      S # t         j
                  $ r t        ddd¬	«      cY S w xY w# t        j
                  $ r t        dd
d¬	«      cY S w xY w# t        $ r!}t        ddt        |«      ¬	«      cY d}~S d}~ww xY w)zv
    Latest Traccar position for a linked fleet driver.
    Resolves tc_id from the driver's transporter profile.
    rª  rd  re  Tr  ræ  rÿ  r  r³  zDriver profile not found.r¯   r¿  r=  rE  r?  Nr°   r±   r@  rA  rB  rF  rG  rµ  rH  r³   )rª  r¼   rÉ  r¾   r”  rB  r·  )r   rž   rç   rÈ   rŸ   r¬  rG   rª  ri  r   rÆ   r¼   rÇ   rI   rË   rÊ  rÉ  rÅ   )r¹  rê  rf  rª  rØ   r¼   r¾   rß  r´   rµ   rB  r”  s               rŽ   Úfleet_driver_current_locationr  t  sÃ  € ðXä!×)Ñ)ß‰^˜H nÐ6SÓTß‰S˜WŸ\™\°YÈ$ˆSÓOð 	ð �[‰[€FðRØ×,Ñ,ˆô �—‘Ò# Ó$×*Ñ*Ó,€EÙÜØØ7Ø4ô
ð 	
ðbÜ-¨eÓ4ˆð �,‰,�zÓ
"€CØ
�,‰,�{Ó
#€CØ
€{�c�kÜ˜CÐ!>ÐFcÔdÐdà
�,‰,�uÓ
Ò
# €CØ—'‘'˜)Ó$Ò=¨¯©°Ó(=€KäØØ9ä*¨6Ó2ØØ—‘Ò.¨$Ü % c£
´5¸³:Ñ>Ø&Øñ
ôð øô= !×-Ñ-ò XÜ˜CÐ!BÈ,ÔWÒWðXûô ×*Ñ*ò RÜ˜CÐ!<ÀLÔQÒQðRûô ò bÜ˜CÐ!PÔX[Ð\_ÓX`ÔaÕaûðbúsA   ‚=E	 ÁE0 ÂF Å	!E-Å,E-Å0!FÆFÆ	GÆ F<Æ6GÆ<Gc                   ó,   — e Zd ZeegZd„ Zd„ Zd„ Zd„ Z	y)ÚVehicleDocumentListCreatec                 ó¢   — t         j                  j                  | j                  d   | j                  j
                  ¬«      j                  «       S )Nrñ  rè  )r   rž   rœ   r*  r¹  rŸ   r  r!  s    rŽ   Ú_get_vehiclez&VehicleDocumentListCreate._get_vehicle°  s8   € Ü�‰×%Ñ%¨¯©°\Ñ)BÈ$Ï,É,×J[ÑJ[Ð%Ó\×bÑbÓdÐdr�   c                 ó–   — | j                  «       }|st        j                  j                  «       S |j                  j                  «       S r£   )r  r   rž   Únoner  Úall)r  r,  s     rŽ   r"  z&VehicleDocumentListCreate.get_queryset³  s=   € Ø×#Ñ#Ó%ˆÙÜ"×*Ñ*×/Ñ/Ó1Ð1Ø× Ñ ×$Ñ$Ó&Ð&r�   c                 ó®   — | j                  «       }|st        ddd¬«      S t        | j                  «       dd|i¬«      }t        dd	|j                  ¬
«      S )Nræ  ré  r  r³  Tr¹  r$  rµ  z)Vehicle documents retrieved successfully.r·  )r  rG   rk   r"  r†  )r  r¹  r)  r*  r,  r  s         rŽ   rc  zVehicleDocumentListCreate.list¹  sX   € Ø×#Ñ#Ó%ˆÙÜ Ð%9ÀÔNÐNÜ'¨×(9Ñ(9Ó(;À$ÐQZÐ\cÐPdÔeˆÜ˜CÐ!LÐSV×S[ÑS[Ô\Ð\r�   c           	      óŽ  — | j                  «       }|st        ddd¬«      S t        |j                  ¬«      }|j	                  «       st        dd|j
                  ¬«      S dt        j                  «       j                  d	«      › �}t        |«       |j                  |¬
«      }t        ddt        |d|i¬«      j                  ¬«      S )Nræ  ré  r  r³  r·  r¿  r  zvehicle-docs/r/  )r,  r  z'Vehicle document uploaded successfully.r¹  r1  )r  rG   rl   r†  r  r	  r   rž  r2  rH   r?  rk   )r  r¹  r)  r*  r,  r  Úrelr4  s           rŽ   r‘  z VehicleDocumentListCreate.createÀ  s¬   € Ø×#Ñ#Ó%ˆÙÜ Ð%9ÀÔNÐNÜ-°7·<±<Ô@ˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØœhŸl™l›n×5Ñ5°jÓAÐBÐCˆÜ˜#ÔØ�h‰h˜wˆhÓ'ˆÜØØ5Ü*¨3¸ÀGÐ8LÔM×RÑRô
ð 	
r�   N)
r  r  r  r   rE   r   r  r"  rc  r‘  r¤   r�   rŽ   r  r  ­  s#   „ Ø)¨=Ð9Ðòeò'ò]ó
r�   r  rü  c           	      ó¨  — 	 t         j                  j                  |¬«      }t        | j                  ¬«      }|j                  «       st	        dd|j                  ¬«      S |j                  d	   |_
        |j                  j                  d
d«      |_        t        j                  «       |_        | j                  |_        g d¢}d|j                  v r%|j                  d   |_        |j%                  d«       |j'                  |¬«       t	        ddt)        |d| i¬«      j                  ¬«      S # t         j                  $ r t	        ddd¬«      cY S w xY w)NrU  ræ  zVehicle document not found.r  r³  r·  r¿  r  Úreview_statusÚreview_notesr¯   )r  r  Úreviewed_atÚreviewed_byÚexpiry_dater8  rµ  z-Vehicle document review updated successfully.r¹  r1  )r   rž   rÈ   r¬  rG   rm   r†  r  r	  r{  r  r  r   rž  r   rŸ   r!  r"  rÍ   r?  rk   )r¹  Údocument_pkÚdocumentr  r9  s        rŽ   Úadmin_vehicle_document_reviewr%  Ñ  s)  € ðTÜ"×*Ñ*×.Ñ.°+Ð.Ó>ˆô *¨w¯|©|Ô
<€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ ×/Ñ/°Ñ@€HÔØ×.Ñ.×2Ñ2°>À2ÓF€HÔÜ#Ÿ<™<›>€HÔØ"Ÿ<™<€HÔÚS€MØ˜×*Ñ*Ñ*Ø"×1Ñ1°-Ñ@ˆÔØ×Ñ˜]Ô+Ø‡M�M €MÔ.ÜØØ7Ü& x¸)ÀWÐ9MÔN×SÑSôð øô ×'Ñ'ò TÜ˜CÐ!>ÀlÔSÒSðTús   ‚ D- Ä-!EÅEc                 ó¦  — 	 t         j                  j                  |¬«      }t        | j                  ¬«      }|j                  «       st	        dd|j                  ¬«      S |j                  d	   }|j                  j                  d
|s|j                  nd«      }g d¢}||_        ||_
        |r+t        j                  «       |_        | j                  |_        nd |_        d |_        |j#                  ddg«       |j%                  |¬«       t	        ddt'        |«      j                  ¬«      S # t         j                  $ r t	        ddd¬«      cY S w xY w)NrU  ræ  ré  r  r³  r·  r¿  r  r•   r–   T)r•   r–   r7  Úverified_atÚverified_byr8  rµ  z1Vehicle verification status updated successfully.)r   rž   rÈ   r¬  rG   rn   r†  r  r	  r{  r–   r•   r   rž  r'  rŸ   r(  r  r?  ri   )r¹  rñ  r,  r  r•   r–   r9  s          rŽ   Úadmin_vehicle_verifyr)  ë  s(  € ðKÜ—/‘/×%Ñ%¨Ð%Ó4ˆô (¨W¯\©\Ô
:€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×$Ñ$ ]Ñ3€KØ×"Ñ"×&Ñ& {É[°G×4EÒ4EÐ^bÓc€IÚ>€MØ%€GÔØ!€GÔÙÜ&Ÿl™l›nˆÔØ%Ÿl™lˆÕà"ˆÔØ"ˆÔØ×Ñ˜-¨Ð7Ô8Ø‡L�L˜}€LÔ-Ü˜ÐPÔWhÐipÓWq×WvÑWvÔwÐwøô) ×Ñò KÜ˜CÐ!5¸\ÔJÒJðKús   ‚ D, Ä,!EÅEc                 óÊ  — t        j                  «       }| j                  dk(  r!t        ddt	        |«      j
                  ¬«      S | j                  j                  st        dd«      S t	        || j
                  d¬«      }|j                  «       st        d	d
|j                  ¬«      S |j                  «        ddlm}  |«        t        ddt	        |«      j
                  ¬«      S )Nr¯  rµ  z)Platform settings retrieved successfully.r·  r–  z-Only superusers may update platform settings.Tr  r¿  r  r³  r   )Ú!apply_platform_settings_to_djangoz'Platform settings updated successfully.)r   Úloadr  rG   ro   r†  rŸ   Úis_superuserr  r	  r?  Úaccounts.platform_configr+  )r¹  Úpsr  r+  s       rŽ   Úadmin_platform_settingsr0    s¾   € ô 
×	Ñ	Ó	 €BØ‡~�~˜ÒÜØØ7Ü+¨BÓ/×4Ñ4ô
ð 	
ð
 �<‰<×$Ò$Ü˜CÐ!PÓQÐQÜ
$ R¨g¯l©lÀDÔ
I€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ‡H�H„JÝJá%Ô'ÜØØ1Ü'¨Ó+×0Ñ0ôð r�   c                 óˆ  — 	 t         j                  j                  d«      j                  |¬«      }| j                  j                  |j                  |j                  fvrt        ddd¬«      S | j                  j                  d«      }| j                  j                  d«      }|�|€t        d	d
d¬«      S t        j                  j                  |||¬«       ||_        ||_        |j                  ddg¬«       t        ddd|j                   j"                  i¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w)Nrÿ   rU  ræ  r*  r  r³  r´   rµ   r¿  zlat and lon are required.r  ©r  r´   rµ   Úcurrent_latÚcurrent_lonr8  r  zLocation updated successfully.r  r·  )r   rž   rç   rÈ   r¬  rG   rŸ   rÎ   r¶   rW  r†  r    r‘  r3  r4  r?  rÿ   r  )r¹  ró  r  r´   rµ   s        rŽ   Údriver_push_locationr5  "  s(  € ðHÜ�|‰|×*Ñ*¨:Ó6×:Ñ:¸gÐ:ÓFˆð ‡|�|‡�˜t×2Ñ2°D×4KÑ4KÐLÑLÜ˜CÐ!2¸,ÔGÐGØ
�,‰,×
Ñ
˜5Ó
!€CØ
�,‰,×
Ñ
˜5Ó
!€CØ
€{�c�kÜ˜CÐ!<ÐDUÔVÐVÜ×Ñ×Ñ T¨s¸ÐÔ<Ø€DÔØ€DÔØ‡I�I˜]¨MÐ:€IÔ;Ü˜Ð=À[ÐRV×R_ÑR_×RiÑRiÐDjÔkÐkøô ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHús   ‚/D Ä!EÅ Ec           
      ó  — 	 t         j                  j                  d«      j                  |¬«      }| j                  j                  |j                  |j                  fvrt        ddd¬«      S t        | j                  ¬«      }|j                  «       st        dd	|j                  ¬«      S |j                  d
   }|t         j                  j                   vrt        ddd¬«      S t"        j                  |j$                  t'        «       «      }||vrt        dd|j$                  › d|› d�d¬«      S t)        |j                  «      }|rt        d||¬«      S |j                  j                  d«      }|j                  j                  d«      }d
dg}	|�E|�Ct*        j                  j-                  |||¬«       ||_        ||_        |	j3                  ddg«       ||_        |j5                  |	¬«       t7        ||«       t9        ||«       |t         j                  j:                  k(  rt=        |¬«       t         j                  j                  d«      j                  |j>                  ¬«      }tA        || j                  dtC        |j                  «      tC        |jD                  «      tC        |«      dœdd|› �¬«       t        ddtG        |«      j                  ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w) Nrÿ   rU  ræ  r*  r  r³  r·  r¿  r  r   zInvalid trip status value.zInvalid status.zTransition from z to z is not allowed.zInvalid transition.r´   rµ   r7  r2  r3  r4  r8  r  ÚTRIP_STATUS©r  rv  r   úTrip updateúTrip status: rE  rµ  z!Trip status updated successfully.)$r   rž   rç   rÈ   r¬  rG   rŸ   rÎ   r¶   rW  rp   r†  r  r	  r{  r  ÚvaluesÚTRIP_SEQUENTIAL_NEXTr   ra  r¥  r    r‘  r3  r4  r  r?  rM   rC  r>  r<   rV  rK  rÆ   rv  r_   )
r¹  ró  r  r  r@  ÚallowedÚerrr´   rµ   r9  s
             rŽ   Údriver_trip_update_statusr?  6  s¢  € ðHÜ�|‰|×*Ñ*¨:Ó6×:Ñ:¸gÐ:ÓFˆð ‡|�|‡�˜t×2Ñ2°D×4KÑ4KÐLÑLÜ˜CÐ!2¸,ÔGÐGä
$¨'¯,©,Ô
7€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHà×#Ñ# HÑ-€JØœŸ™×+Ñ+Ñ+Ü˜CÐ!=ÐEVÔWÐWä"×&Ñ& t§{¡{´C³EÓ:€GØ˜Ñ ÜØØ˜tŸ{™{˜m¨4°
¨|Ð;KÐLØ'ô
ð 	
ô )¨×);Ñ);Ó
<€CÙ
Ü˜C ¨CÔ0Ð0à
×
Ñ
×
 Ñ
  Ó
'€CØ
×
Ñ
×
 Ñ
  Ó
'€CØ˜|Ð,€MØ
€˜3˜?Ü×Ñ×#Ñ#¨°3¸CÐ#Ô@ØˆÔØˆÔØ×Ñ˜m¨]Ð;Ô<à€D„KØ‡I�I˜M€IÔ*Ü�t˜ZÔ(Ü# D¨*Ô5Ø”T—[‘[×*Ñ*Ò*Ü)¨tÕ4Ü�<‰<×&Ñ& zÓ2×6Ñ6¸$¿'¹'Ð6ÓB€DÜØØ�‰ØÜ˜Ÿ™“L´°T×5EÑ5EÓ1FÔRUÐV`ÓRaÑbØØ˜Z˜LÐ)õô ØØ+Ü Ó%×*Ñ*ôð øôc ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHús   ‚/K Ë!K>Ë=K>c           
      ó<  — 	 t         j                  j                  d«      j                  |¬«      }| j                  j                  |j                  |j                  fvrt        ddd¬«      S | j                  dk(  rU	 t        j                  j                  d«      j                  |¬	«      }t        ddt        |d| i¬«      j                  ¬«      S t        t!        t"        dd«      xs d«      }|dkD  rÂ| j                  j                  d«      | j                  j                  d«      }}|j$                  }|dvr||dvrx|j&                  �l|j(                  �`	 t+        t        |«      t        |«      t        |j&                  «      t        |j(                  «      «      }|�||kD  rt        dd|› d�d¬«      S t        j                  j1                  |¬	«      j3                  «       }	|	rg|j4                  t         j6                  j8                  t         j6                  j:                  t         j6                  j<                  fvr\t        ddd¬«      S |j4                  t         j6                  j8                  t         j6                  j:                  fvrt        ddd¬«      S | j                  j                  d«      xs< | j                  j                  d«      xs | j                  j                  d«      xs d}
t?        |
t@        «      r|
jC                  «       }
|	s|
st        dd d!¬«      S tE        jF                  «       jI                  d"«      }tK        d#|› �«       tK        d$|› �«       | j                  j                  d%«      }|rf	 t?        |t@        «      rRtM        jN                  |jQ                  d&d'«      «      }tE        jR                  |«      rtE        jT                  |«      n|}n|}n"|	stE        jF                  «       n|	jX                  }| jZ                  j                  d(«      xs | jZ                  j                  d)«      }g }t]        «       }| jZ                  D ]N  }|d*v rŒ| jZ                  j_                  |«      D ])  }||vsŒ|ja                  |«       |jc                  |«       Œ+ ŒP |	rÿ|	}g }|
r|
|_2        |jc                  d«       |r||_3        |jc                  d(«       | j                  j                  d«      �1| j                  j                  d«      |_        |jc                  d«       | j                  j                  d«      �1| j                  j                  d«      |_        |jc                  d«       |r||_,        |jc                  d%«       |rj|ji                  |¬+«       nWt        j                  jk                  ||
|| j                  j                  d«      | j                  j                  d«      |¬,«      }|D ]#  }tl        j                  jk                  ||¬-«       Œ% |j4                  t         j6                  j<                  k7  �r”t         j6                  j<                  |_        |ji                  d.d/g¬+«       to        |t         j6                  j<                  «       |j$                  }tp        j6                  j<                  |_        |ji                  d.d/g¬+«       t         j                  j                  d«      j                  |jr                  ¬«      }tu        || j                  d0tA        |j                  «      tA        |j                  «      tA        t         j6                  j<                  «      d1œd2d3t         j6                  j<                  › �¬4«       tu        || j                  d5tA        |j                  «      tA        |j                  «      d6œd7d8¬4«       t        |	sd9nd|	sd:nd;t        |d| i¬«      j                  ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w# t        j                  $ r t        dd
d¬«      cY S w xY w# t,        t.        f$ r d }Y �ŒÙw xY w# tV        $ r tE        jF                  «       }Y �Œ�w xY w)<Nrÿ   rU  ræ  r*  r  r³  r¯  Úphotosr  r+  rµ  r,  r¹  r1  r·  ÚPOD_MAX_DELIVERY_DISTANCE_KMr   Údelivery_latÚdelivery_lon)Nr¯   r¿  zPOD GPS is farther than z+ km from the shipment delivery coordinates.zPOD location validation failed.zZPOD can only be submitted while the trip is in transit, arrived at delivery, or delivered.zInvalid trip status for POD.zNPOD can only be submitted while the trip is in transit or arrived at delivery.Úreceiver_namerÜ  Úreceiverr¯   zreceiver_name is required.zMissing field.r/  zpod/signatures/zpod/photos/Údelivered_atr•  r–  Úreceiver_signatureÚ	signature)rH  rI  r8  )r  rE  rH  rC  rD  rG  )r¨  Úimager   r7  r7  r8  r9  r:  rE  ÚPOD_SUBMITTED)r  rv  zProof of deliveryz$POD was submitted for your shipment.r  zPOD submitted successfully.zPOD updated successfully.);r   rž   rç   rÈ   r¬  rG   rŸ   rÎ   r¶   rW  r  r#   rL  rh   r†  rÅ   rô   rõ   rÿ   rC  rD  r�   rÊ   rË   rœ   r  r   r  r<  rÀ  r=  r˜  rÆ   rÇ   r   rž  r2  rH   r   r™  rš  r›  rœ  rÉ   rG  ÚFILESra  Úgetlistrb  rÍ   rE  rH  r?  r‘  r$   rM   r   rV  rK  )r¹  ró  r  r¨  Úmax_kmrŠ   r‹   ÚshÚgapÚexisting_podrE  r  Ú
_deliveredrG  Úsignature_fileÚuploaded_photosÚ
seen_filesrÄ   Úfr9  Úimgrÿ   s                         rŽ   Údriver_submit_podrX  t  sQ  € ðHÜ�|‰|×*Ñ*¨:Ó6×:Ñ:¸gÐ:ÓFˆð ‡|�|‡�˜t×2Ñ2°D×4KÑ4KÐLÑLÜ˜CÐ!2¸,ÔGÐGà‡~�~˜Òð	SÜ!×)Ñ)×:Ñ:¸8ÓD×HÑHÈdÐHÓSˆCô ˜CÐ!>Ä]ÐSVÐajÐlsÐ`tÔEu×EzÑEzÔ{Ð{ä”7œ?Ð,JÈAÓNÒSÐRSÓT€FØ�‚zØ—\‘\×%Ñ% nÓ5°w·|±|×7GÑ7GÈÓ7WˆdˆØ�]‰]ˆà˜
Ñ"Ø˜JÑ&Ø—‘Ð+Ø—‘Ð+ðÜ#¤E¨$£K´°t³¼eÀBÇOÁOÓ>TÔV[Ð\^×\kÑ\kÓVlÓm�ð ˆ 3¨¢<Ü#ØØ.¨v¨hÐ6aÐbØ;ôð ô #×*Ñ*×1Ñ1°tÐ1Ó<×BÑBÓD€LáØ�;‰;œtŸ{™{×5Ñ5´t·{±{×7SÑ7SÔUY×U`ÑU`×UjÑUjÐkÑkÜØØlØ4ôð ð �;‰;œtŸ{™{×5Ñ5´t·{±{×7SÑ7SÐTÑTÜØØ`Ø4ôð ð 	�‰×Ñ˜Ó)ò 	Ø�<‰<×Ñ˜FÓ#ò	à�<‰<×Ñ˜JÓ'ò	ð ð	 ô �-¤Ô%Ø%×+Ñ+Ó-ˆá¡Ü˜CÐ!=ÐEUÔVÐVô —‘“×'Ñ'¨
Ó3€IÜ˜¨	 {Ð3Ô4Ü˜ I ;Ð/Ô0à—‘×!Ñ! .Ó1€JÙð	*Ü˜*¤cÔ*Ü'×5Ñ5°j×6HÑ6HÈÈhÓ6WÓX�ÜDL×DUÑDUÐVbÔDcœx×2Ñ2°<Ô@Ðiu‘à)�øñ .:”x—|‘|”~¸|×?XÑ?Xˆà—]‘]×&Ñ&Ð';Ó<Ò^ÀÇÁ×@QÑ@QÐR]Ó@^€Nð €OÜ“€JØ�}‰}ò *ˆØÐ5Ñ5ØØ—‘×&Ñ& sÓ+ò 	*ˆAØ˜
Ò"Ø—‘˜qÔ!Ø×&Ñ& qÕ)ñ	*ð*ñ ØˆØˆÙØ -ˆCÔØ× Ñ  Ô1ÙØ%3ˆCÔ"Ø× Ñ Ð!5Ô6Ø�<‰<×Ñ˜NÓ+Ð7Ø&Ÿ|™|×/Ñ/°Ó?ˆCÔØ× Ñ  Ô0Ø�<‰<×Ñ˜NÓ+Ð7Ø&Ÿ|™|×/Ñ/°Ó?ˆCÔØ× Ñ  Ô0ÙØ+ˆCÔØ× Ñ  Ô0ÙØ�H‰H =ˆHÕ1ä×%Ñ%×,Ñ,ØØ'Ø-Ø Ÿ™×)Ñ)¨.Ó9Ø Ÿ™×)Ñ)¨.Ó9Ø%ð -ó 
ˆð ò 4ˆÜ×Ñ×Ñ C¨sÐÕ3ð4ð ‡{�{”d—k‘k×+Ñ+Ó+Ü—k‘k×+Ñ+ˆŒØ�	‰	 ¨<Ð 8ˆ	Ô9Ü˜4¤§¡×!6Ñ!6Ô7Ø—=‘=ˆÜ"Ÿ/™/×3Ñ3ˆŒØ�‰ X¨|Ð$<ˆÔ=Ü�|‰|×*Ñ*¨:Ó6×:Ñ:¸d¿g¹gÐ:ÓFˆÜØØ�L‰LØÜ˜DŸG™G›´S¸¿¹Ó5EÔQTÔUY×U`ÑU`×UjÑUjÓQkÑlØØ ¤§¡×!6Ñ!6Ð 7Ð8õ	
ô 	ØØ�L‰LØÜ˜DŸG™G›´S¸¿¹Ó5EÑFØ%Ø7õ	
ô Ù‰ SÙ-9Ñ%Ð?ZÜ˜3¨°GÐ(<Ô=×BÑBôð øôo ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô ×+Ñ+ò 	SÜ Ð%=À\ÔRÒRð	Sûô  œzÐ*ò Ø“ðûôf ò 	*Ü#Ÿ<™<›>‹Lð	*úsI   ‚/` Á=/`; ÅAa" ÎA$a: à!`8à7`8à;!aáaá"a7á6a7á:bâbc           	      óv  — 	 t         j                  j                  ddddddd«      j                  |¬«      }| j                  j                  |j                  |j                  fvrt        d	d
d¬«      S t        ddt        |«      j                  ¬«      S # t         j                  $ r t        d	d
d¬«      cY S w xY w)Nrÿ   re  r‹  rŒ  rŒ  rN  rš   rU  ræ  r*  r  r³  rµ  r´  r·  )r   rž   rç   rÈ   r¬  rG   rŸ   rÎ   r¶   rW  rc   r†  )r¹  ró  r  s      rŽ   Útransporter_trip_detailrZ    sÅ   € ðHÜ�|‰|×*Ñ*ØØØ%Ø0ØØØó
÷ ‰#Øð ó 
ð 	ð ‡|�|‡�˜t×2Ñ2°D×4KÑ4KÐLÑLÜ˜CÐ!2¸,ÔGÐGÜØØ&Ü,¨TÓ2×7Ñ7ôð øô	 ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHús   ‚5B Â!B8Â7B8c                 ó0  — 	 t         j                  j                  dd«      j                  |¬«      }| j                  j                  |j                  |j                  fvrt        ddd¬«      S |j                  }t        |j                  dd «      }|r!|j                  rt        |j                  «      nd }|r|j                  nd }t!        j"                  d	d
«      xs d
j%                  «       j'                  d«      }|r	|r|› d|› �nd }|j(                  |j*                  xs d
|j,                  �t        |j,                  «      nd |j.                  �t        |j.                  «      nd dœ}	|j0                  |j2                  xs d
|j4                  �t        |j4                  «      nd |j6                  �t        |j6                  «      nd dœ}
d }d }d }	 |j,                  �� |j.                  ��|j4                  ��|j6                  �út9        t;        |j,                  «      t;        |j.                  «      t;        |j4                  «      t;        |j6                  «      «      }t;        t        t<        dd«      xs d«      }|dkD  rt?        tA        ||z  dz  «      «      }t;        |j,                  «      t;        |j.                  «      }}t;        |j4                  «      t;        |j6                  «      }}d|› d|› d|› d|› d�	}t        dd|j                  |j                  jF                  |j                  tI        |«      |	|
||dœ|||�tA        |d«      nd |dœ¬«      S # t         j                  $ r t        ddd¬«      cY S w xY w# tB        tD        f$ r Y Œ”w xY w)Nrÿ   rŽ  rU  ræ  r*  r  r³  ri  ÚTRACCAR_URLr¯   ú/z/#/devices/)ÚaddressÚcompanyr´   rµ   ÚNAVIGATION_NAIVE_SPEED_KPHé-   r   é<   z.https://www.google.com/maps/dir/?api=1&origin=Ú,z&destination=z&travelmode=drivingrµ  z*Navigation context retrieved successfully.)r¼   rÉ  r~   )r  r  rv  r  rÌ  rÍ  ri  Útraccar_device_url_hintÚgoogle_maps_directions_urlÚnaive_route_distance_kmÚnaive_eta_minutesr·  )%r   rž   rç   rÈ   r¬  rG   rŸ   rÎ   r¶   rW  rÿ   rô   rN  r¼   rÆ   rÉ  ÚosÚgetenvrÇ   ÚrstripÚpickup_addressÚpickup_companyr3  r4  Údelivery_addressÚdropoff_companyrC  rD  r�   rÅ   rõ   r  rÏ   rÊ   rË   r  r1   )r¹  ró  r  ÚsrØ   r¼   rÉ  ÚbaseÚtraccar_hintrÌ  rÍ  Úmaps_urlrg  Úd_kmÚspeedÚplatÚplonrŠ   r‹   s                      rŽ   Útransporter_trip_navigationrw  1  s:  € ðHÜ�|‰|×*Ñ*¨:Ð7YÓZ×^Ñ^ÐbiÐ^Ójˆð ‡|�|‡�˜t×2Ñ2°D×4KÑ4KÐLÑLÜ˜CÐ!2¸,ÔGÐGØ�‰€AÜ�d×&Ñ&Ð(=¸tÓD€GÙ")¨g¯mªmŒC�—‘ÔÀ€EÙ!(ˆg�oŠo¨d€GÜ�I‰I�m RÓ(Ò.¨B×5Ñ5Ó7×>Ñ>¸sÓC€DÙ26¹5�d�V˜; u gÑ.Àd€Là×#Ñ#Ø×#Ñ#Ò) rØ$%§L¡LÐ$<Œs�1—<‘<Ô À$Ø$%§L¡LÐ$<Œs�1—<‘<Ô À$ñ	€Fð ×%Ñ%Ø×$Ñ$Ò*¨Ø&'§n¡nÐ&@Œs�1—>‘>Ô"ÀdØ&'§n¡nÐ&@Œs�1—>‘>Ô"Àdñ	€Hð €HØÐØ€Dðà�L‰LÑ$Ø—‘Ñ(Ø—‘Ñ*Ø—‘Ð*ä Ü�a—l‘lÓ#Ü�a—l‘lÓ#Ü�a—n‘nÓ%Ü�a—n‘nÓ%ó	ˆDô œ'¤/Ð3OÐQSÓTÒZÐXZÓ[ˆEØ�qŠyÜ$'¬¨t°e©|¸rÑ.AÓ(BÓ$CÐ!Ü˜qŸ|™|Ó,¬e°A·L±LÓ.A�$ˆDÜ˜qŸ~™~Ó.´°a·n±nÓ0E�$ˆDðØ˜&  $  }°T°F¸!¸D¸6ÐATðVð ô ØØ4à—w‘wØŸ™×0Ñ0ØŸ4™4Ü-¨aÓ0ØØ Ø-2¸wÑ#GØ'3Ø*2Ø9=Ð9I¤u¨T°1¤~ÈtØ!2ñ
ôð øôe ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô^ ”zÐ"ò Ùðús$   ‚0M ÇD-N Í!N Í?N ÎNÎNc                 óŒ  — | j                   j                  d«      }t        j                  j	                  | j
                  ¬«      j                  ddd«      j                  d«      }|r |j	                  |j                  «       ¬«      }t        |dd	| i¬
«      }t        ddt        |j                  «      |j                  dœ¬«      S )z<List rate requests for the authenticated driver/transporter.r   )rª  rÿ   re  rª  rù  rÐ  Tr¹  r$  rµ  z%Rate requests retrieved successfully.)rÓ  Úresultsr·  )rˆ  rÈ   r&   rž   rœ   rŸ   rç   r  Úupperru   rG   r"  r†  )r¹  Ústatus_filterr«   r  s       rŽ   Útransporter_rate_requests_listr|  {  s³   € ð ×(Ñ(×,Ñ,¨XÓ6€MÜ	×	Ñ	×	#Ñ	#¨7¯<©<Ð	#Ó	8×	GÑ	GÈ
ÐTgÐiqÓ	r×	{Ñ	{ð  }Jó  
K€BÙØ�Y‰Y˜m×1Ñ1Ó3ˆYÓ4ˆÜ
 ¨¸	À7Ð7KÔ
L€CÜ˜ÐDÔUXÐY\×YaÑYaÓUbÐor×owÑowÑKxÔyÐyr�   c           	      óê  — 	 t         j                  j                  dd«      j                  || j                  ¬«      }dd	lm} 	  ||«      \  }}t        ddt        |d| i¬«      j                  |j                  |j                  |j                  j                   dœ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        d
t        |«      d¬«      cY d}~S d}~ww xY w)z7Accept a rate request -> assigns load and creates trip.rÿ   rª  ©rV  rª  ræ  úRate request not found.r  r³  r   )Úhandle_rate_request_acceptr¿  zAccept failed.Nrµ  z4Rate request accepted and trip created successfully.r¹  r1  )Úrate_requestr  rv  r  r·  )r&   rž   rç   rÈ   rŸ   r¬  rG   Úcore.rate_distributionr€  rË   rÆ   ru   r†  rÎ   rv  rÿ   r  )r¹  rV  r�  r€  r  Ú
updated_rrrß  s          rŽ   Útransporter_rate_request_acceptr„  ‡  sï   € ðPÜ"×*Ñ*×9Ñ9¸*ÀhÓO×SÑSÐWYÐbi×bnÑbnÐSÓoˆõ BðCÙ5°lÓCÑˆˆjô ˜ÐSÜ-¨jÀ9ÈgÐBVÔW×\Ñ\Ø—7‘7Ø×'Ñ'Ø—]‘]×,Ñ,ñ	[ô ð øô ×#Ñ#ò PÜ˜CÐ!:À,ÔOÒOðPûô ò CÜ˜C¤ S£Ð1AÔBÕBûðCús/   ‚;B! ÁC Â!!CÃCÃ	C2ÃC-Ã'C2Ã-C2c           	      ó>  — 	 t         j                  j                  dd«      j                  || j                  ¬«      }t        | j                  ¬«      }|j                  «       st        d	d
|j                  ¬«      S ddlm} 	  |||j                  j                  dd«      ¬«      }t        ddt!        |d| i¬«      j                  ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t        $ r!}t        d	t        |«      d¬«      cY d}~S d}~ww xY w)zRReject a rate request with optional reason -> advances next batch if all rejected.rÿ   rª  r~  ræ  r  r  r³  r·  r¿  r  r   )Úhandle_rate_request_rejectr  r¯   )r  zReject failed.Nrµ  z#Rate request rejected successfully.r¹  r1  )r&   rž   rç   rÈ   rŸ   r¬  rG   rv   r†  r  r	  r‚  r†  r{  rË   rÆ   ru   )r¹  rV  r�  r  r†  rƒ  rß  s          rŽ   Útransporter_rate_request_rejectr‡  ž  s!  € ðPÜ"×*Ñ*×9Ñ9¸*ÀhÓO×SÑSÐWYÐbi×bnÑbnÐSÓoˆô &¨7¯<©<Ô
8€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHåAðCÙ/°ÀS×EWÑEW×E[ÑE[Ð\dÐfhÓEiÔjˆ
ô ˜ÐBÔI^Ð_iÐt}ð  @Gð  tHô  JI÷  JNñ  JNô  Oð  Oøô ×#Ñ#ò PÜ˜CÐ!:À,ÔOÒOðPûô ò CÜ˜C¤ S£Ð1AÔBÕBûðCús/   ‚;C Â$C2 Ã!C/Ã.C/Ã2	DÃ;DÄDÄDr£   )rì  (.  r   r  Úloggingr   rh  rï   rñ  Údjango.confr   rõ   Údjango.contrib.authr   r   Ú	django.dbr   r   Údjango.db.modelsr	   r
   Údjango.utilsr   Úrest_frameworkr   r   Úrest_framework.decoratorsr   r   Úrest_framework.viewsr   Úrest_framework.permissionsr   r   Úrest_framework.authtoken.modelsr   Úaccounts.modelsr   r   r   r   r   r   r   r   r   Úcore.modelsr   r   r   r    r!   r"   r#   r$   r%   r&   Úcore.shipment_publishr'   r(   rN  r)   r*   r+   r,   rÉ  r-   r.   r/   r0   Úcore.currenciesr1   Úcore.pricing.servicer2   r©   r3   r4   r5   r6   r7   r8   r9   r:   Úbilling.modelsr;   Úbilling.servicesr<   r=   Úpermissionsr?   r@   rA   rB   rC   rD   rE   rF   ÚresponserG   Ústorage_utilsrH   ÚtraccarrI   rJ   ÚnotifyrK   Útrip_notificationsrL   Útrip_statusrM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   rz   r{   rð  Ú	getLoggerr×  r�   r    r¬   rÛ   rè   rý   r  r  rŽ  r�  r�  r
  r  r  r  r'  r-  r5  r�  r:  r¿  r;  r<  rÀ  ra  r=  r>  r<  rC  rK  rS  r\  r_  rf  rr  rt  r{  r~  r„  r‡  rŠ  r‰  r¥  r®  r»  rË  rÐ  rà  rö  rý  r  r  r  ÚListCreateAPIViewr  r:  r=  rC  rF  rH  ÚRetrieveUpdateDestroyAPIViewrT  ÚListAPIViewrb  ÚRetrieveAPIViewrj  rv  r|  rˆ  r“  r¢  r¤  r±  r¹  r¼  rÃ  rÆ  rÈ  rÊ  rÌ  rÕ  rÚ  rÜ  rÞ  rá  rä  ræ  rè  rë  rí  rï  rñ  r   r	  r!  r&  r(  r-  r5  r:  rC  rI  rK  rO  rQ  rW  ra  rg  rj  rl  rr  rt  r  r…  r‰  r©  rµ  r·  r¿  r˜  rÎ  r™  rÓ  rÕ  r×  ÚRetrieveUpdateAPIViewrã  rò  rö  rû  r  r  r  r  r%  r)  r0  r5  r?  rX  rZ  rw  r|  r„  r‡  r¤   r�   rŽ   ú<module>r§     s}  ðÝ Û Û Û Û 	Û 	Û å 3ß <ß ,ß (Ý !ß 0ß BÝ (ß @Ý 1÷
÷ 
õ 
÷÷ ÷ ÷÷ó ÷ó õ 2Ý 7÷	÷ 	ó 	õ #ß Y÷	÷ 	ó 	õ #Ý ,ß IÝ  Ý =Ý +÷/÷ /÷ /÷ /÷ /÷ /÷ /÷ /÷ /÷ /÷ /÷ /ñb Ó€Ø	ˆ×	Ò	˜5Ó	!€ò	ð ;@ô Mð TYô Tð$ ØôCòLò-ò`ð ‡J‚J×ÒØ‡J‚J×ÒØ‡J‚J×ÒðÐ ò	òòDò
òòð 	‡K‚K×Ò˜4Ÿ;š;×/Ò/Ð0Ø‡K‚K×Ò˜4Ÿ;š;×5Ò5Ð6Ø‡K‚K×Ò §¢×!3Ò!3Ð 4Ø‡K‚K×Ò˜Ÿš×/Ò/Ð0Ø‡K‚K×Ò˜TŸ[š[×9Ò9Ð:Ø‡K‚K× Ò ¡#£%Ø‡K‚K×Ò˜DŸKšK×1Ò1Ð2ðÐ ò:ò ó
ò
òFò
ò"òJ-óò,òò&òò òFò4ñ> 
ˆ5ˆ'ÓÙ�X�JÓñSó  ó ðSñ 
ˆ6ˆ(ÓÙ�X�JÓñ-ó  ó ð-ñ` 
ˆ6ˆ(ÓÙ�_Ð%Ó&ñ9ó 'ó ð9óñ. 
ˆ6ˆ(ÓÙ�X�JÓñ$ó  ó ð$ñN 
ˆ6ˆ(ÓÙ�X�JÓñó  ó ðñB 
ˆ6ˆ(ÓÙ�X�JÓñCó  ó ðCñP 
ˆ6ˆ(ÓÙ�X�JÓñ
ó  ó ð
ôQ˜ô Qô0!
˜H×6Ò6ô !
òJLòòñ  
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñTó 2ó ðTô "
˜×3Ò3ô "
ôJ1C�X×:Ò:ô 1CôjP�h×*Ò*ô Pôi�×(Ò(ô iñ 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñó 2ó ðñ6 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñXó 2ó ðXñ@ 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñ_ó 2ó ð_ñ@ 
ˆ5ˆ'ÓÙ�_ mÐ5JÐKÓLñ$ó Mó ð$ñN 
ˆ6ˆ(ÓÙ�_ mÐ5JÐKÓLñbó Mó ðbôL Qˆx×#Ò#ô  QôF P�×)Ò)ô  PñJ 
ˆ5ˆ'ÓÙ�_Ð&=Ð?TÐUÓVñkó Wó ðkñ 
ˆ5ˆ'ÓÙ�_Ð&=Ð?TÐUÓVñkó Wó ðkñ 
ˆ5ˆ'ÓÙ�_Ð&=Ð?TÐUÓVñkó Wó ðkò)ò"
2òòEòPñ" 
ˆ5ˆ'ÓÙ�_Ð&=Ð?TÐUÓVñó Wó ðò@ò	òPñ 
ˆ5ˆ'ÓÙ�_Ð&CÐDÓEñó Fó ðñ 
ˆ5ˆ'ÓÙ�_Ð&CÐDÓEñó Fó ðñ 
ˆ5ˆ'ÓÙ�_Ð&CÐDÓEñó Fó ðñ 
ˆ5ˆ'ÓÙ�_Ð&>Ð?Ó@ñó Aó ðñ 
ˆ5ˆ'ÓÙ�_Ð&>Ð?Ó@ñó Aó ðñ" 
ˆ5ˆ'ÓÙ�_Ð&>Ð?Ó@ñó Aó ðôU�x×+Ò+ô Uñ  
ˆ5ˆ'ÓÙ�_Ð%Ó&ñIó 'ó ðIñB 
ˆ6ˆ(ÓÙ�_Ð%Ó&ñ0ó 'ó ð0ñf 
ˆ5�&ˆ/ÓÙ�_Ð%Ó&ñDó 'ó ðDñN 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñ"ó 2ó ð"ñJ 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñ_ó 2ó ð_ñD 
ˆ5ˆ'ÓÙ�_ iÐ0Ó1ñxó 2ó ðxñ 
ˆ5ˆ'ÓÙ�_ iÐ0Ó1ñ2ó 2ó ð2ñj 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñ/ó 2ó ñ/ñd 
ˆ5ˆ'ÓÙ�_ iÐ0Ó1ñ&ó 2ó ñ&ñR 
ˆ5ˆ'ÓÙ�_Ð%Ó&ñ1ó 'ó ñ1ñj 
ˆ6ˆ(ÓÙ�X�JÓñ
ó  ó ñ
ñ 
ˆ5ˆ'ÓÙ�X�JÓñó  ó ñôQ˜Wõ Qô@#
 H×$>Ò$>õ #
ôLó(óóZóó
ó("ðV ?CÐSWõ 	óMóhóVYñx 
ˆ5ˆ'ÓÙ�_ mÐ5JÐKÓLñDó Mó ñDó&ð, =Aõ ó<Lóñ 
ˆ5ˆ'ÓÙ�_ mÐ5JÐKÓLñKó Mó ñKñ\ 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñó 6ó ñô!
 8×#=Ò#=õ !
ôH#
˜x×=Ò=õ #
ñL 
ˆ6ˆ(ÓÙ�_ mÐ4Ó5ñdó 6ó ñdñ< 
ˆ6ˆ(ÓÙ�_Ð&=Ð?TÐUÓVñ7oó Wó ñ7oñv 
ˆ5�&ˆ/ÓÙ�_Ð&=Ð>Ó?ñó @ó ññ> 
Ò
$Ó%Ù�_Ð&=Ð>Ó?ñ^nó @ó &ñ^nñB 
ˆ5�&ˆ/ÓÙ�_Ð&=Ð>Ó?ñ%ó @ó ñ%ñP 
ˆ5ˆ'ÓÙ�_Ð&=Ð>Ó?ñ4ó @ó ñ4ôn!
 × :Ò :õ !
ñH 
ˆ7ˆ)ÓÙ�_ oÐ6Ó7ñó 8ó ññ0 
ˆ7ˆ)ÓÙ�_ oÐ6Ó7ñxó 8ó ñxñ4 
ˆ5�'Ð
ÓÙ�_ oÐ6Ó7ñó 8ó ññ2 
ˆ6ˆ(ÓÙ�_ mÐ4Ó5ñló 6ó ñlñ$ 
ˆ7ˆ)ÓÙ�_ mÐ4Ó5ñ8ó 6ó ñ8ñx 
ˆ5�&ˆ/ÓÙ�_ mÐ4Ó5ñ^ó 6ó ñ^ñB 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñó 6ó ññ0 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñEó 6ó ñEñP 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñzó 6ó ñzñ 
ˆ6ˆ(ÓÙ�_ mÐ5JÐKÓLñó Mó ññ* 
ˆ6ˆ(ÓÙ�_ mÐ5JÐKÓLñOó Mó òOr�   