Ë
    ö–jÖc  ã                   ó˜  — d dl mZmZmZ d dlmZ d dlmZ  G d„ dej                  «      Z	dZ
dedefd	„Zdefd
„Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ dej                  «      Z G d„ d ej                  «      Z G d!„ d"ej                  «      Z G d#„ d$ej                  «      Z G d%„ d&ej                  «      Z G d'„ d(ej                  «      Z G d)„ d*ej                  «      Z G d+„ d,ej                  «      Z G d-„ d.ej                  «      Z  G d/„ d0ej                  «      Z!y1)2é    )ÚIntegrityErrorÚmodelsÚtransaction)Úsettings)ÚCOUNTRY_CHOICESc                   óÖ   — e Zd Z ej                  d¬«      Z ej                  ddd¬«      Z ej                  ddd¬«      Z ej                  ddd¬«      Z	 ej                  d¬«      Zy)	ÚShipperéÿ   ©Ú
max_lengthTéþ   )ÚblankÚnullr   é2   ©Úauto_now_addN)Ú__name__Ú
__module__Ú__qualname__r   Ú	CharFieldÚnameÚ
EmailFieldÚemailÚphoneÚcompanyÚDateTimeFieldÚ
created_at© ó    ú%/var/www/html/truck-me/core/models.pyr	   r	      sh   „ Øˆ6×Ñ sÔ+€DØˆF×Ñ D¨tÀÔD€EØˆF×Ñ 4¨d¸rÔB€EØˆf×Ñ T°ÀÔE€GØ%�×%Ñ%°4Ô8�Jr   r	   zSH-ÚsequenceÚreturnc                 ó   — t         › | d›�S )NÚ05d)ÚSHIPMENT_UNIQUE_ID_PREFIX)r!   s    r    Úformat_shipment_unique_idr&      s   € Ü'Ð(¨°#¨Ð7Ð7r   c                 ó¼   — d}t        t        «      }| D ]E  }|r|j                  t        «      sŒ||d  }|j                  «       sŒ1t	        |t        |«      «      }ŒG |S )Nr   )Úlenr%   Ú
startswithÚisdigitÚmaxÚint)Ú
unique_idsÚmax_seqÚ
prefix_lenÚuidÚsuffixs        r    Ú _max_shipment_unique_id_sequencer2      s`   € Ø€GÜÔ.Ó/€JØò 0ˆÙ˜#Ÿ.™.Ô)BÔCØØ�Z�[Ð!ˆØ�>‰>ÕÜ˜'¤3 v£;Ó/‰Gð0ð €Nr   c                   ól  ‡ — e Zd Z G d„ dej                  «      Z ej                  ej                  ej                  d¬«      Z
 ej                  d¬«      Z ej                  dd¬	«      Z ej                  d
ddd¬«      Z ej                  d
ddd¬«      Z ej                  d¬«      Z ej                  dd¬	«      Z ej                  d
ddd¬«      Z ej                  d
ddd¬«      Z ej                  d¬«      Z ej                  d¬«      Z ej                  dd¬	«      Z ej                  d¬«      Z ej2                  d¬«      Z ej6                  ddd¬«      Z ej                  d
ddd¬«      Z ej                  dddd¬«      Z ej                  ddd¬«      Z ej@                  ddd¬«      Z! ej                  ddd¬«      Z" ej                  ddd¬«      Z# ejH                  dd¬«      Z% ejH                  dd¬«      Z& ejH                  dd¬«      Z' ej                  dejP                  ejR                  ¬ «      Z* ej                  ddddd¬!«      Z+ ejX                  dd¬"«      Z- ejX                  d¬#«      Z. ejX                  d¬$«      Z/ G d%„ d&«      Z0e1d'„ «       Z2ˆ fd(„Z3d)„ Z4d*„ Z5ˆ xZ6S )+ÚShipmentc                   ó0   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zy
)úShipment.Status©ÚDRAFTÚDraft©Ú	PUBLISHEDÚ	Published©ÚASSIGNEDÚAssigned)ÚEN_ROUTEzEn Route©ÚLOADEDÚLoaded©Ú
IN_TRANSITz
In Transit©Ú	DELIVEREDÚ	Delivered©Ú	COMPLETEDÚ	Completed©ÚCLOSEDÚClosedN)r   r   r   r8   r;   r>   r@   rB   rE   rG   rJ   rM   r   r   r    ÚStatusr6   $   s/   „ Ø ˆØ,ˆ	Ø)ˆØ)ˆØ#ˆØ/ˆ
Ø,ˆ	Ø,ˆ	Ø#‰r   rO   Ú	shipments©Ú	on_deleteÚrelated_nameéô  r   r
   T©r   r   é
   é   ©Ú
max_digitsÚdecimal_placesr   r   éd   r   ©r   z:Absolute URL of the luggage/cargo photo for this shipment.)r   r   Ú	help_texté   é   é   z?ISO 4217 currency for suggested_price; set from pickup country.z>Per-country km/rate/price segments from zone boundary pricing.)r   r   r]   zFISO 3166-1 alpha-2 (e.g. AE, SA); used for discovery / corridor rules.zAISO 3166-1 alpha-2; used for return-load and corridor visibility.FzZWhen true, shipment is offered as a return trip (subject to zone rules on pickup country).)Údefaultr]   z1Cross-border load; mutually exclusive with local.z@Domestic/local load; mutually exclusive with country_to_country.é   ©r   Úchoicesra   )r   ÚuniqueÚeditabler   r   ©r   r   r   ©Úauto_nowc                   óŠ   — e Zd ZdgZ ej
                   ej                  dd¬«       ej                  dd¬«      z  d¬«      gZy)úShipment.Metaú-created_atTF)Úcountry_to_countryÚlocalÚshipment_load_type_xor)Ú	conditionr   N)r   r   r   Úorderingr   ÚCheckConstraintÚQÚconstraintsr   r   r    ÚMetark   n   sI   „ Ø!�?ˆà"ˆF×"Ñ"Ø"˜&Ÿ(™(°dÀ%ÔHØ�&—(‘(¨e¸4Ô@ñAà-ôð
‰r   ru   c                 ó„  — t        j                  «       5  | j                  j                  «       j	                  d«      j                  dd¬«      j                  «        | j                  j                  d¬«      j                  d¬«      j	                  d«      j                  dd¬«      d	d
 }t        |«      dz   }t        |«      }| j                  j                  |¬«      j                  «       r;|dz  }t        |«      }| j                  j                  |¬«      j                  «       rŒ;|cd	d	d	«       S # 1 sw Y   y	xY w)zMReturn the next SH-##### id; serialized so concurrent creates cannot collide.z-idÚidT)Úflat)Úunique_id__isnullÚ )Ú	unique_idr{   Nr[   é   )r   ÚatomicÚobjectsÚselect_for_updateÚorder_byÚvalues_listÚfirstÚexcluder2   r&   ÚfilterÚexists)ÚclsÚrecent_uidsÚseqÚ	candidates       r    Úallocate_unique_idzShipment.allocate_unique_idx   s  € ô ×ÑÓ!ñ 	Ø�K‰K×)Ñ)Ó+×4Ñ4°UÓ;×GÑGÈÐSWÐGÓX×^Ñ^Ô`à—‘×#Ñ#°dÐ#Ó;ß‘ 2�Ó&ß‘˜%“ß‘˜[¨t�Ó4°T°cð;ð ô 3°;Ó?À!ÑCˆCÜ1°#Ó6ˆIØ—+‘+×$Ñ$¨yÐ$Ó9×@Ñ@ÔBØ�q‘�Ü5°cÓ:�	ð —+‘+×$Ñ$¨yÐ$Ó9×@Ñ@ÕBð ÷	÷ 	ò 	ús   •DD6Ä+D6Ä6D?c                 ó  •— | j                   rt        ‰| �  |i |¤ŽS t        d«      D ]1  }t	        | «      j                  «       | _         	 t        ‰| �  |i |¤Žc S  t        ‰| �  |i |¤ŽS # t        $ r d | _         |dk(  r‚ Y Œ[w xY w)Né   é   )r{   ÚsuperÚsaveÚrangeÚtyperŠ   r   )ÚselfÚargsÚkwargsÚattemptÚ	__class__s       €r    r�   zShipment.saveŠ   s›   ø€ Ø�>Š>Ü‘7‘< Ð0¨Ñ0Ð0Ü˜Q“xò 	ˆGÜ! $›Z×:Ñ:Ó<ˆDŒNðÜ‘w‘| TÐ4¨VÑ4Ò4ð	ô ‰w‰|˜TÐ, VÑ,Ð,øô	 "ò Ø!%�”Ø˜a’<Øñ  ðús   Á
A+Á+BÂBc                 ób   — | j                   xs d| j                  › �}d|› d| j                  › d�S )Nú#z	Shipment ú (ú))r{   rw   Ústatus©r’   Úlabels     r    Ú__str__zShipment.__str__—   s3   € Ø—‘Ò/ A d§g¡g Y -ˆØ˜5˜'  D§K¡K =°Ð2Ð2r   c                 óæ   ‡— ddl mŠ ddlm}  ||«      \  }}|| _        || _        t        ˆfd„|D «        ‰d«      «      }|j                   ‰d«      «      | _        | j                  g d¢¬«       y	)
uX  
        Set suggested_price + price_breakdown from a driven route polyline.

        route_coords: [(lng, lat), ...] from the client routing/directions provider
        (decoded polyline). There is no server-side directions API today; callers may
        fall back to a 2-point pickupâ†’delivery line when a full route is unavailable.
        r   )ÚDecimal)Úcalculate_suggested_pricec              3   óf   •K  — | ](  } ‰t        |j                  d «      xs d«      «      –— Œ* y­w)Úkmr   N)ÚstrÚget)Ú.0Úsegr    s     €r    ú	<genexpr>z=Shipment.calculate_and_set_suggested_price.<locals>.<genexpr>«   s(   øè ø€ ÒC°#‰W”S˜Ÿ™ ›Ò+¨!Ó,×-ÑCùs   ƒ.1Ú0z0.01)Úsuggested_priceÚprice_breakdownÚdistance_kmÚ
updated_at)Úupdate_fieldsN)
Údecimalr    Úcore.pricing.servicer¡   rª   r«   ÚsumÚquantizer¬   r�   )r’   Úroute_coordsr¡   ÚpriceÚ	breakdownÚtotal_kmr    s         @r    Ú!calculate_and_set_suggested_pricez*Shipment.calculate_and_set_suggested_price›   sk   ø€ õ 	$åBá4°\ÓBÑˆˆyØ$ˆÔØ(ˆÔÜÛC¸ÔCÙ�C‹Ló
ˆð $×,Ñ,©W°V«_Ó=ˆÔØ�	‰	Ò cˆ	Õdr   )7r   r   r   r   ÚTextChoicesrO   Ú
ForeignKeyr   ÚAUTH_USER_MODELÚCASCADEÚshipperr   Úpickup_addressÚpickup_companyÚDecimalFieldÚ
pickup_latÚ
pickup_lonÚdelivery_addressÚdropoff_companyÚdelivery_latÚdelivery_lonÚ
cargo_typeÚweightÚ
dimensionsÚvehicle_type_requiredÚ	TextFieldÚspecial_instructionsÚURLFieldÚluggage_image_urlr¬   rª   ÚcurrencyÚ	JSONFieldr«   Úpickup_country_codeÚdelivery_country_codeÚBooleanFieldÚ	is_returnrm   rn   rd   r8   r›   r{   r   Úpickup_scheduled_atr   r­   ru   ÚclassmethodrŠ   r�   rž   r·   Ú__classcell__©r–   s   @r    r4   r4   #   s  ø„ ô	$�×#Ñ#ô 	$ð  ˆf×ÑØ× Ñ Ø—.‘.Ø ô€Gð
 &�V×%Ñ%°Ô5€NØ%�V×%Ñ%°¸DÔA€NØ$�×$Ñ$°À1È4ÐW[Ô\€JØ$�×$Ñ$°À1È4ÐW[Ô\€JØ'�v×'Ñ'°3Ô7ÐØ&�f×&Ñ&°#¸TÔB€OØ&�6×&Ñ&°"ÀQÈTÐY]Ô^€LØ&�6×&Ñ&°"ÀQÈTÐY]Ô^€LØ!�×!Ñ!¨SÔ1€JØˆV×Ñ¨Ô,€FØ!�×!Ñ!¨S¸Ô=€JØ,˜F×,Ñ,¸Ô<ÐØ+˜6×+Ñ+°$Ô7ÐØ'˜Ÿ™ØØØNôÐð
 &�&×%Ñ%°ÀAÈDÐX\Ô]€KØ)�f×)Ñ)°RÈÐPTÐ\`Ôa€OØˆv×ÑØØØSô€Hð
 '�f×&Ñ&ØØØRô€Oð
 +˜&×*Ñ*ØØØZôÐð
 -˜F×,Ñ,ØØØUôÐð
 $�×#Ñ#ØØnô€Ið -˜×,Ñ,ØØEôÐð  ˆF×ÑØØTô€Eð ˆV×Ñ¨°V·^±^ÈVÏ\É\ÔZ€FØ �× Ñ ¨B°tÀeÐRVÐ^bÔc€IØ.˜&×.Ñ.°DÀÔEÐØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷
ñ 
ð ñó ðô"-ò3öer   r4   c                   óø  — e Zd Z G d„ dej                  «      Z ej                  eej                  d¬«      Z	 ej                  e
j                  ej                  d¬«      Z ej                  dd¬«      Z ej                  dej                   ej"                  ¬	«      Z ej                  ddd
d
¬«      Z ej(                  d
¬«      Z ej,                  d
¬«      Z ej,                  d
¬«      Z G d„ d«      Zd„ Zy)ÚBidc                   ó    — e Zd ZdZdZdZdZdZy)ú
Bid.Status©ÚPENDINGÚPending)ÚAGREEDÚAgreed©ÚACCEPTEDÚAccepted©ÚREJECTEDÚRejected)Ú	COUNTEREDÚ	CounteredN)r   r   r   rÝ   rß   râ   rå   rç   r   r   r    rO   rÛ   ³   s   „ Ø&ˆØ#ˆØ)ˆØ)ˆØ,‰	r   rO   ÚbidsrQ   r_   r^   ©rY   rZ   rb   rc   TrX   r\   r   rh   c                   ó   — e Zd ZdgZy)úBid.Metarl   N©r   r   r   rq   r   r   r    ru   rì   Ë   ó	   „ Ø!�?‰r   ru   c                 óT   — d| j                   › d| j                  › d| j                  › �S )NzBid #z on Shipment #ú - )rw   Úshipment_idÚamount©r’   s    r    rž   zBid.__str__Î   s*   € Ø�t—w‘w�i˜~¨d×.>Ñ.>Ð-?¸sÀ4Ç;Á;À-ÐPÐPr   N)r   r   r   r   r¸   rO   r¹   r4   r»   Úshipmentr   rº   Útransporterr¿   rò   r   rd   rÝ   r›   Úcounter_amountrÊ   Úmessager   r   r­   ru   rž   r   r   r    rÙ   rÙ   ²   sï   „ ô-�×#Ñ#ô -ð !ˆv× Ñ ØØ—.‘.Øô€Hð
 $�&×#Ñ#Ø× Ñ Ø—.‘.Øô€Kð
 !ˆV× Ñ ¨B¸qÔA€FØˆV×Ñ¨°V·^±^ÈVÏ^É^Ô\€FØ(�V×(Ñ(°BÀqÈtÐ[_Ô`€NØˆf×Ñ TÔ*€GØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷#ñ #óQr   rÙ   c                   ót  — e Zd Z G d„ dej                  «      Z ej                  eej                  d¬«      Z	 ej                  e
j                  ej                  d¬«      Z ej                  d¬«      Z ej                  dej                   ej"                  ¬	«      Z ej&                  d
ddd¬«      Z ej&                  dddd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej0                  d¬«      Z ej0                  dd¬«      Z ej0                  d¬«      Z G d„ d«      Zd„ Zy)ÚRateRequestc                   ó    — e Zd ZdZdZdZdZdZy)úRateRequest.StatusrÜ   rá   rä   )Ú	CANCELLEDÚ	Cancelled)ÚEXPIREDÚExpiredN)r   r   r   rÝ   râ   rå   rü   rþ   r   r   r    rO   rû   Ó   s   „ Ø&ˆØ)ˆØ)ˆØ,ˆ	Ø&‰r   rO   Úrate_requestsrQ   Úreceived_rate_requestsr|   ©ra   rb   rc   rV   r^   TrX   r_   r`   rU   r
   r   rg   rh   c                   ó@   — e Zd ZdgZ ej
                  ddgd¬«      gZy)úRateRequest.Metarl   rô   ÚdriverÚ!uniq_shipment_driver_rate_request©Úfieldsr   N©r   r   r   rq   r   ÚUniqueConstraintrt   r   r   r    ru   r  î   s+   „ Ø!�?ˆà#ˆF×#Ñ#Ø" HÐ-Ø8ôð
‰r   ru   c           	      óp   — d| j                   › d| j                  › d| j                  › d| j                  › d�	S )NzRateRequest #z Shipment #z -> Driver #r™   rš   )rw   rñ   Ú	driver_idr›   ró   s    r    rž   zRateRequest.__str__÷   s@   € Ø˜tŸw™w˜i {°4×3CÑ3CÐ2DÀLÐQU×Q_ÑQ_ÐP`Ð`bÐcg×cnÑcnÐboÐopÐqÐqr   N)r   r   r   r   r¸   rO   r¹   r4   r»   rô   r   rº   r  ÚPositiveIntegerFieldÚbatch_numberr   rd   rÝ   r›   r¿   r¬   Úoffered_pricerÎ   Úrejection_reasonr   r   Úresponded_atr­   ru   rž   r   r   r    rù   rù   Ò   s1  „ ô'�×#Ñ#ô 'ð !ˆv× Ñ ØØ—.‘.Ø$ô€Hð
 ˆV×ÑØ× Ñ Ø—.‘.Ø-ô€Fð
 /�6×.Ñ.°qÔ9€LØˆV×Ñ¨°V·^±^ÈVÏ^É^Ô\€FØ%�&×%Ñ%°ÀAÈDÐX\Ô]€KØ'�F×'Ñ'°2ÀaÈdÐZ^Ô_€MØˆv×Ñ¨1°DÔ9€HØ'�v×'Ñ'°3¸dÔCÐØ%�×%Ñ%°4Ô8€JØ'�6×'Ñ'¨T¸Ô>€LØ%�×%Ñ%¨tÔ4€J÷
ñ 
órr   rù   c                   óÐ  — e Zd Z G d„ dej                  «      Z ej                  eej                  d¬«      Z	 ej                  eej                  d¬«      Z ej                  ej                  ej                  d¬«      Z ej                  ej                  ej"                  ddd¬«      Z ej&                  d	ej(                  ej*                  ¬
«      Z ej.                  dddd¬«      Z ej.                  dddd¬«      Z ej4                  dd¬«      Z ej.                  ddddd¬«      Z ej4                  d¬«      Z ej4                  d¬«      Z G d„ d«      Ze d„ «       Z!d„ Z"y)ÚTripc                   ó8   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZy)úTrip.Statusr7   r:   r=   )r@   zEn Route to Pickup)ÚARRIVED_PICKUPzArrived at PickuprA   rD   )ÚARRIVED_DELIVERYzArrived at DeliveryrF   rI   rL   N)r   r   r   r8   r;   r>   r@   r  rB   rE   r  rG   rJ   rM   r   r   r    rO   r  ü   s:   „ Ø ˆØ,ˆ	Ø)ˆØ3ˆØ>ˆØ#ˆØ/ˆ
ØDÐØ,ˆ	Ø,ˆ	Ø#‰r   rO   ÚtriprQ   ÚtripsÚassigned_tripsT©rR   rS   r   r   rb   rc   rV   rW   rX   rg   r_   r^   z1Final negotiated price when the bid was accepted.©rY   rZ   r   r   r]   r   rh   c                   ó   — e Zd ZdgZy)ú	Trip.Metarl   Nrí   r   r   r    ru   r  -  rî   r   ru   c                 ób   — 	 | j                   j                  S # t        j                  $ r Y y w xY w©N)rô   r{   r4   ÚDoesNotExistró   s    r    r{   zTrip.unique_id0  s/   € ð	Ø—=‘=×*Ñ*Ð*øÜ×$Ñ$ò 	Ùð	ús   ‚ ˜.­.c                 ó’   — t        | j                  dd «      xs d| j                  › �}d|› d| j                  › d| j                  › d�S )Nr{   r˜   úTrip rð   r™   rš   )Úgetattrrô   rw   r›   rœ   s     r    rž   zTrip.__str__7  sF   € Ü˜Ÿ™ {°DÓ9ÒJ¸qÀÇÁÀ	¸]ˆØ�u�g˜S §¡ ¨r°$·+±+°¸aÐ@Ð@r   N)#r   r   r   r   r¸   rO   ÚOneToOneFieldr4   r»   rô   r¹   rÙ   ÚPROTECTÚaccepted_bidr   rº   rõ   ÚSET_NULLÚassigned_driverr   rd   r>   r›   r¿   Úcurrent_latÚcurrent_lonr   ÚetaÚagreed_pricer   r­   ru   Úpropertyr{   rž   r   r   r    r  r  û   s{  „ ô$�×#Ñ#ô $ð $ˆv×#Ñ#ØØ—.‘.Øô€Hð
 %�6×$Ñ$ØØ—.‘.Øô€Lð
 $�&×#Ñ#Ø× Ñ Ø—.‘.Øô€Kð
 (�f×'Ñ'Ø× Ñ Ø—/‘/Ø%ØØô€Oð ˆV×Ñ¨°V·^±^ÈVÏ_É_Ô]€FØ%�&×%Ñ%°ÀAÈDÐX\Ô]€KØ%�&×%Ñ%°ÀAÈDÐX\Ô]€KØ
ˆ&×
Ñ
 D°Ô
5€CØ&�6×&Ñ&ØØØØØEô€Lð &�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷#ñ #ð ñó ðóAr   r  c                   óÚ   — e Zd Z ej                  eej                  d¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
 ej                  d¬«      Z G d„ d	«      Zd
„ Zy)ÚTripLocationÚ	locationsrQ   rV   rW   rê   Tr   c                   ó   — e Zd ZdgZy)úTripLocation.Metaz-recorded_atNrí   r   r   r    ru   r3  F  ó
   „ Ø"Ð#‰r   ru   c                 ó:   — d| j                   › d| j                  › �S )NúTrip #ú at )Útrip_idÚrecorded_atró   s    r    rž   zTripLocation.__str__I  s    € Ø˜Ÿ™�~ T¨$×*:Ñ*:Ð);Ð<Ð<r   N)r   r   r   r   r¹   r  r»   r  r¿   ÚlatÚlonr   r9  ru   rž   r   r   r    r0  r0  <  sl   „ Øˆ6×ÑØØ—.‘.Ø ô€Dð
 ˆ&×
Ñ
¨¸AÔ
>€CØ
ˆ&×
Ñ
¨¸AÔ
>€CØ&�&×&Ñ&°DÔ9€K÷$ñ $ó=r   r0  c                   óÚ   — e Zd Z ej                  eej                  d¬«      Z ej                  dej                  j                  ¬«      Z ej                  d¬«      Z G d„ d«      Zd	„ Zy
)ÚTripStatusRecordÚstatus_recordsrQ   rb   ©r   rd   Tr   c                   ó   — e Zd ZddgZy)úTripStatusRecord.Metar9  rw   Nrí   r   r   r    ru   rA  V  s   „ Ø! 4Ð(‰r   ru   c                 óT   — d| j                   › d| j                  › d| j                  › �S )Nr6  z status=r7  )r8  r›   r9  ró   s    r    rž   zTripStatusRecord.__str__Y  s*   € Ø˜Ÿ™�~ X¨d¯k©k¨]¸$¸t×?OÑ?OÐ>PÐQÐQr   N)r   r   r   r   r¹   r  r»   r  r   rO   rd   r›   r   r9  ru   rž   r   r   r    r=  r=  M  sc   „ Øˆ6×ÑØØ—.‘.Ø%ô€Dð
 ˆV×Ñ¨°T·[±[×5HÑ5HÔI€FØ&�&×&Ñ&°DÔ9€K÷)ñ )óRr   r=  c                   ó|  — e Zd Z ej                  eej                  ddd¬«      Z ej                  ej                  ej                  ddd¬«      Z
 ej                  ej                  ej                  ddd¬«      Z ej                  eej                  ddd¬«      Z ej                   d¬«      Z G d„ d	«      Zd
„ Zy)ÚConversationÚconversationsTr  Úshipper_conversationsÚtransporter_conversationsÚconversationr   c                   ó@   — e Zd ZdgZ ej
                  g d¢d¬«      gZy)úConversation.Metarl   )rô   r¼   rõ   Ú.uniq_conversation_shipment_shipper_transporterr  Nr	  r   r   r    ru   rJ  |  s&   „ Ø!�?ˆà#ˆF×#Ñ#Ú=ØEôð
‰r   ru   c                 óV   — d| j                   › d| j                  › d| j                  › d�S )NzConversation Shipment #r™   z->rš   )rñ   Ú
shipper_idÚtransporter_idró   s    r    rž   zConversation.__str__…  s2   € Ø(¨×)9Ñ)9Ð(:¸"¸T¿_¹_Ð<MÈRÐPT×PcÑPcÐOdÐdeÐfÐfr   N)r   r   r   r   r¹   r4   r»   rô   r   rº   r¼   rõ   r%  r  r(  r  r   r   ru   rž   r   r   r    rD  rD  ]  sÌ   „ Ø ˆv× Ñ ØØ—.‘.Ø$ØØô€Hð  ˆf×ÑØ× Ñ Ø—.‘.Ø,ØØô€Gð $�&×#Ñ#Ø× Ñ Ø—.‘.Ø0ØØô€Kð  ˆ6×ÑØØ—/‘/Ø#ØØô€Dð &�×%Ñ%°4Ô8€J÷
ñ 
ógr   rD  c                   ó¨  — e Zd Z G d„ dej                  «      Z ej                  eej                  d¬«      Z	 ej                  e
j                  ej                  d¬«      Z ej                  d¬«      Z ej                  dej                   ej"                  ¬	«      Z ej&                  d
dd¬«      Z ej*                  d¬«      Z G d„ d«      Zd„ Zy)ÚMessagec                   ó   — e Zd ZdZdZy)úMessage.MessageType)ÚTEXTÚText)ÚVOICEÚVoiceN)r   r   r   rS  rU  r   r   r    ÚMessageTyperR  Š  s   „ ØˆØ ‰r   rW  ÚmessagesrQ   Úsent_messagesTr\   rV   rc   zmessages/voice/%Y/%m/%d/©Ú	upload_tor   r   r   c                   ó   — e Zd ZdgZy)úMessage.Metar   Nrí   r   r   r    ru   r]  �  ó	   „ Ø �>‰r   ru   c                 ó:   — d| j                   › d| j                  › �S )NzMessage from z
 in Conv #)Ú	sender_idÚconversation_idró   s    r    rž   zMessage.__str__   s!   € Ø˜tŸ~™~Ð.¨j¸×9MÑ9MÐ8NÐOÐOr   N)r   r   r   r   r¸   rW  r¹   rD  r»   rH  r   rº   ÚsenderrÊ   Útextr   rd   rS  Úmessage_typeÚ	FileFieldÚ
voice_filer   r   ru   rž   r   r   r    rP  rP  ‰  sÍ   „ ô!�f×(Ñ(ô !ð %�6×$Ñ$ØØ—.‘.Øô€Lð
 ˆV×ÑØ× Ñ Ø—.‘.Ø$ô€Fð
 ˆ6×Ñ $Ô'€DØ#�6×#Ñ#¨r¸;×;NÑ;NÐXc×XhÑXhÔi€LØ!�×!Ñ!Ð,FÈTÐY]Ô^€JØ%�×%Ñ%°4Ô8€J÷"ñ "óPr   rP  c                   óT  — e Zd Z ej                  eej                  d¬«      Z ej                  d¬«      Z	 ej                  ddd¬«      Z ej                  dd	dd¬
«      Z ej                  dd	dd¬
«      Z ej                  «       Z ej                  d¬«      Z G d„ d«      Zd„ Zy)ÚProofOfDeliveryÚpodrQ   r
   r   zpod/signatures/%Y/%m/%d/TrZ  rV   rW   rX   r   c                   ó   — e Zd ZdZdZy)úProofOfDelivery.MetazProof of deliveryzProofs of deliveryN)r   r   r   Úverbose_nameÚverbose_name_pluralr   r   r    ru   rk  ±  s   „ Ø*ˆØ2Ñr   ru   c                 ó    — d| j                   › �S )NzPOD for Trip #)r8  ró   s    r    rž   zProofOfDelivery.__str__µ  s   € Ø §¡˜~Ð.Ð.r   N)r   r   r   r   r%  r  r»   r  r   Úreceiver_nameÚ
ImageFieldÚreceiver_signaturer¿   rÄ   rÅ   r   Údelivered_atr   ru   rž   r   r   r    rh  rh  ¤  s²   „ Øˆ6×ÑØØ—.‘.Øô€Dð
 %�F×$Ñ$°Ô4€MØ*˜×*Ñ*Ð5OÐVZÐbfÔgÐØ&�6×&Ñ&°"ÀQÈTÐY]Ô^€LØ&�6×&Ñ&°"ÀQÈTÐY]Ô^€LØ'�6×'Ñ'Ó)€LØ%�×%Ñ%°4Ô8€J÷3ñ 3ó/r   rh  c                   ó°   — e Zd Z ej                  eej                  d¬«      Z ej                  d¬«      Z	 ej                  d¬«      Z G d„ d«      Zd	„ Zy
)ÚPODPhotoÚphotosrQ   zpod/photos/%Y/%m/%d/)r[  Tr   c                   ó   — e Zd ZdgZy)úPODPhoto.Metar   Nrí   r   r   r    ru   rw  Â  r^  r   ru   c                 ó4   — d| j                   j                  › �S )NzPhoto for POD Trip #)ri  r8  ró   s    r    rž   zPODPhoto.__str__Å  s   € Ø% d§h¡h×&6Ñ&6Ð%7Ð8Ð8r   N)r   r   r   r   r¹   rh  r»   ri  rp  Úimager   r   ru   rž   r   r   r    rt  rt  ¹  sW   „ Ø
ˆ&×
Ñ
ØØ—.‘.Øô€Cð
 ˆF×ÑÐ(>Ô?€EØ%�×%Ñ%°4Ô8€J÷"ñ "ó9r   rt  c                   óô  — e Zd ZdZ ej
                  eej                  d¬«      Z ej                  e
j                  ej                  d¬«      Z ej                  e
j                  ej                  d¬«      Z ej                  e
j                  ej                  dddd¬	«      Z ej                  «       Z ej                  dd¬
«      Z ej$                  d¬«      Z ej(                  d¬«      Z G d„ d«      Zy)Ú
TripReviewz=Shipper rates transporter (and optionally driver) after trip.ÚreviewrQ   Útrip_reviews_writtenÚtrip_reviews_as_transporterTÚtrip_reviews_as_driverzIf null, same as transporter.)rR   r   r   rS   r]   rg   r\   r   c                   ó   — e Zd ZdgZy)úTripReview.Metarl   Nrí   r   r   r    ru   r�  ç  rî   r   ru   N)r   r   r   Ú__doc__r   r%  r  r»   r  r¹   r   rº   r¼   rõ   r  ÚPositiveSmallIntegerFieldÚtransporter_ratingÚdriver_ratingrÊ   Úcommentr   r   ru   r   r   r    r{  r{  É  s÷   „ ÙGØˆ6×ÑØØ—.‘.Øô€Dð
  ˆf×ÑØ× Ñ Ø—.‘.Ø+ô€Gð
 $�&×#Ñ#Ø× Ñ Ø—.‘.Ø2ô€Kð
 ˆV×ÑØ× Ñ Ø—.‘.ØØØ-Ø1ô€Fð :˜×9Ñ9Ó;ÐØ4�F×4Ñ4¸$ÀdÔK€MØˆf×Ñ TÔ*€GØ%�×%Ñ%°4Ô8€J÷#ò #r   r{  c                   óÈ  — e Zd ZdZ ej
                  eej                  d¬«      Z ej                  e
j                  ej                  d¬«      Z ej                  e
j                  ej                  d¬«      Z ej                  e
j                  ej                  dd¬«      Z ej                  «       Z ej"                  d	¬
«      Z ej&                  d	¬«      Z G d„ d«      Zy)ÚTripShipperReviewz<Transporter or assigned driver rates the shipper after trip.Úshipper_reviewrQ   Útrip_reviews_as_shipperÚshipper_reviews_as_transporterÚshipper_reviews_writtenz8Transporter or assigned driver who submitted the review.)rR   rS   r]   Tr\   r   c                   ó   — e Zd ZdgZy)úTripShipperReview.Metarl   Nrí   r   r   r    ru   rŽ    rî   r   ru   N)r   r   r   r‚  r   r%  r  r»   r  r¹   r   rº   r¼   rõ   Úreviewerrƒ  Úshipper_ratingrÊ   r†  r   r   ru   r   r   r    rˆ  rˆ  ë  sÜ   „ ÙFØˆ6×ÑØØ—.‘.Ø%ô€Dð
  ˆf×ÑØ× Ñ Ø—.‘.Ø.ô€Gð
 $�&×#Ñ#Ø× Ñ Ø—.‘.Ø5ô€Kð
 !ˆv× Ñ Ø× Ñ Ø—.‘.Ø.ØLô	€Hð 6�V×5Ñ5Ó7€NØˆf×Ñ TÔ*€GØ%�×%Ñ%°4Ô8€J÷#ò #r   rˆ  c                   ó°  — e Zd Z ej                  ej                  ej                  d¬«      Z ej                  d¬«      Z
 ej                  d¬«      Z ej                  dddd¬	«      Z ej                  dddd¬	«      Z ej                  d
d¬«      Z ej                   d¬«      Z ej$                  d¬«      Z ej$                  d¬«      Z G d„ d«      Zy)ÚSavedAddressÚsaved_addressesrQ   r[   r   rT   rV   rW   TrX   r^   rU   Fr  r   rh   c                   ó   — e Zd ZdgZy)úSavedAddress.Metarl   Nrí   r   r   r    ru   r•    rî   r   ru   N)r   r   r   r   r¹   r   rº   r»   Úuserr   r�   Úaddress_liner¿   r:  r;  Úcountry_coderÒ   Ú
is_defaultr   r   r­   ru   r   r   r    r’  r’  
  sÓ   „ Øˆ6×ÑØ× Ñ Ø—.‘.Ø&ô€Dð
 ˆF×Ñ¨Ô,€EØ#�6×#Ñ#¨sÔ3€LØ
ˆ&×
Ñ
¨¸AÀDÐPTÔ
U€CØ
ˆ&×
Ñ
¨¸AÀDÐPTÔ
U€CØ#�6×#Ñ#¨q¸Ô=€LØ$�×$Ñ$¨UÔ3€JØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷#ò #r   r’  c                   óê   — e Zd Z ej                  ej                  ej                  d¬«      Z ej                  ej                  ej                  d¬«      Z	 ej                  d¬«      Z G d„ d«      Zy)	ÚFavoriteTransporterÚfavorite_transporters_linksrQ   Úfavorited_by_shippersTr   c                   ó@   — e Zd ZdgZ ej
                  ddgd¬«      gZy)úFavoriteTransporter.Metarl   r¼   rõ   Ú!uniq_favorite_shipper_transporterr  Nr	  r   r   r    ru   rŸ  *  s+   „ Ø!�?ˆà#ˆF×#Ñ#Ø! =Ð1Ø8ôð
‰r   ru   N)r   r   r   r   r¹   r   rº   r»   r¼   rõ   r   r   ru   r   r   r    r›  r›    sl   „ Øˆf×ÑØ× Ñ Ø—.‘.Ø2ô€Gð
 $�&×#Ñ#Ø× Ñ Ø—.‘.Ø,ô€Kð
 &�×%Ñ%°4Ô8€J÷
ò 
r   r›  c                   óN  — e Zd ZdZ ej
                  dej                  d¬«      Z ej
                  ej                  ej                  d¬«      Z
 ej                  d¬«      Z ej                  d¬«      Z ej                  «       Z ej                   d¬	«      Z G d
„ d«      Zd„ Zy)ÚAdminTripActionzIAudit log when platform admin overrides a trip status with justification.r  Úadmin_actionsrQ   Úadmin_trip_actionsrb   r   Tr   c                   ó   — e Zd ZdgZy)úAdminTripAction.Metarl   Nrí   r   r   r    ru   r¦  F  rî   r   ru   c                 óT   — d| j                   › d| j                  › d| j                  › �S )Nr#  ú: ú -> )r8  Úprevious_statusÚ
new_statusró   s    r    rž   zAdminTripAction.__str__I  s+   € Ø�t—|‘|�n B t×';Ñ';Ð&<¸DÀÇÁÐ@QÐRÐRr   N)r   r   r   r‚  r   r¹   r»   r  r   rº   Úperformed_byr   rª  r«  rÊ   Újustificationr   r   ru   rž   r   r   r    r¢  r¢  4  s£   „ ÙSàˆ6×ÑØØ—.‘.Ø$ô€Dð
 %�6×$Ñ$Ø× Ñ Ø—.‘.Ø)ô€Lð
 '�f×&Ñ&°"Ô5€OØ!�×!Ñ!¨RÔ0€JØ$�F×$Ñ$Ó&€MØ%�×%Ñ%°4Ô8€J÷#ñ #óSr   r¢  c                   ó,  — e Zd Z ej                  dd¬«      Z ej                  ddddd¬«      Z ej                  ddddd	¬«      Z ej                  d
¬«      Z
 ej                  d¬«      Z ej                  d¬«      Z G d„ d«      Zd„ Zed„ «       Zy)ÚZoner^   T)r   re   é   z"Service zone radius in kilometres.r  r_   r�   z8Default price per km for route segments in this country.Fr  r   rh   c                   ó   — e Zd ZdgZy)ú	Zone.Metar˜  Nrí   r   r   r    ru   r²  `  r4  r   ru   c                 ó   — | j                   S r   )Úcountry_displayró   s    r    rž   zZone.__str__c  s   € Ø×#Ñ#Ð#r   c                 óN   — ddl m}  || j                  «      xs | j                  S ©Nr   )Úcountry_name_for_code)Úcore.countriesr·  r˜  ©r’   r·  s     r    r´  zZone.country_displayf  s!   € å8Ù$ T×%6Ñ%6Ó7ÒL¸4×;LÑ;LÐLr   N)r   r   r   r   r   r˜  r¿   Ú	radius_kmÚrate_per_kmrÒ   Úallow_return_tripsr   r   r­   ru   rž   r.  r´  r   r   r    r¯  r¯  L  s¸   „ Ø#�6×#Ñ#¨q¸Ô>€LØ#�×#Ñ#ØØØØØ6ô€Ið &�&×%Ñ%ØØØØØLô€Kð -˜×,Ñ,°UÔ;ÐØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷$ñ $ò$ð ñMó ñMr   r¯  c                   ó˜   — e Zd Z ej                  ddd¬«      Z ej                  d¬«      Z ej                  «       Z G d„ d«      Z	d„ Z
y	)
ÚCountryBoundaryr^   T)r   re   Údb_indexr[   r   c                   ó   — e Zd ZdZy)úCountryBoundary.MetazCountry boundariesN)r   r   r   rm  r   r   r    ru   rÁ  q  s   „ Ø2Ñr   ru   c                 ó8   — | j                   › d| j                  › �S )Nrð   )r˜  Úcountry_nameró   s    r    rž   zCountryBoundary.__str__t  s!   € Ø×#Ñ#Ð$ C¨×(9Ñ(9Ð':Ð;Ð;r   N)r   r   r   r   r   r˜  rÃ  rÏ   Úgeojsonru   rž   r   r   r    r¾  r¾  l  sI   „ Ø#�6×#Ñ#¨q¸ÈÔM€LØ#�6×#Ñ#¨sÔ3€LØˆf×ÑÓ €G÷3ñ 3ó<r   r¾  c                   óN  ‡ — e Zd ZdZ ej
                  de¬«      Z ej
                  de¬«      Z ej                  dd¬«      Z
 ej
                  dd¬«      Z ej                  d	¬
«      Z ej                  d	¬«      Z G d„ d«      Zd„ Zed„ «       Zed„ «       Zd„ Zˆ fd„Zˆ xZS )ÚFreightRouteuI   Directional minimum freight rate between two countries (Aâ†’B â‰  Bâ†’A).r^   r?  rV   rê   r`   ÚUSD)r   ra   Tr   rh   c                   óØ   — e Zd Z ej                  ddgd¬«       ej
                   ej                   ej                  d«      ¬«       d¬«      gZ ej                  ddg¬«      gZ
ddgZy	)
úFreightRoute.MetaÚorigin_country_codeÚdestination_country_codeÚunique_origin_destinationr  )rÊ  Úorigin_ne_destination)Úcheckr   )r  N)r   r   r   r   r
  rr   rs   ÚFrt   ÚIndexÚindexesrq   r   r   r    ru   rÉ  ‚  s‚   „ à#ˆF×#Ñ#Ø-Ð/IÐJØ0ôð #ˆF×"Ñ"Ø�v—x‘x°H°F·H±HÐ=WÓ4XÔYÐYØ,ôð	
ˆð ˆF�L‰LÐ!6Ð8RÐ SÔTð
ˆð *Ð+EÐF‰r   ru   c                 ól   — | j                   › d| j                  › d| j                  › d| j                  › �S )Nr©  r¨  ú )rÊ  rË  Úmin_freightrÎ   ró   s    r    rž   zFreightRoute.__str__’  s=   € à×'Ñ'Ð(¨¨T×-JÑ-JÐ,KÈ2Ø×ÑÐ   $§-¡- ð2ð	
r   c                 óN   — ddl m}  || j                  «      xs | j                  S r¶  )r¸  r·  rÊ  r¹  s     r    Úorigin_country_namez FreightRoute.origin_country_name˜  s!   € å8Ù$ T×%=Ñ%=Ó>ÒZÀ$×BZÑBZÐZr   c                 óN   — ddl m}  || j                  «      xs | j                  S r¶  )r¸  r·  rË  r¹  s     r    Údestination_country_namez%FreightRoute.destination_country_name�  s!   € å8Ù$ T×%BÑ%BÓCÒdÀt×GdÑGdÐdr   c                 ó.  — ddl m} ddlm}m}  || j
                  «      } || j                  «      }| j
                  r || j
                  «      s
 |ddi«      ‚| j                  r || j                  «      s
 |ddi«      ‚|r|r||k(  r |d«      ‚y y y )	Nr   )ÚValidationError)Úis_valid_country_codeÚnormalize_country_coderÊ  zInvalid origin country code.rË  z!Invalid destination country code.z3Origin and destination must be different countries.)Údjango.core.exceptionsrÚ  r¸  rÛ  rÜ  rÊ  rË  )r’   rÚ  rÛ  rÜ  ÚoriginÚdestinations         r    ÚcleanzFreightRoute.clean¢  s›   € Ý:ßPá'¨×(@Ñ(@ÓAˆÙ,¨T×-JÑ-JÓKˆØ×#Ò#Ñ,AÀ$×BZÑBZÔ,[Ù!Ð#8Ð:XÐ"YÓZÐZØ×(Ò(Ñ1FÀt×GdÑGdÔ1eÙ!Ð#=Ð?bÐ"cÓdÐdÙ‘k f°Ò&;Ù!Ð"WÓXÐXð '<�kˆ6r   c                 óÚ  •— ddl m}  || j                  «      xs5 t        | j                  xs d«      j	                  «       j                  «       | _         || j                  «      xs5 t        | j                  xs d«      j	                  «       j                  «       | _        | j                  r-| j                  j	                  «       j                  «       | _        t        ‰| �$  |i |¤Ž y )Nr   )rÜ  rz   )
r¸  rÜ  rÊ  r¤   ÚstripÚupperrË  rÎ   rŽ   r�   )r’   r“   r”   rÜ  r–   s       €r    r�   zFreightRoute.save¯  s¿   ø€ Ý9á#9¸$×:RÑ:RÓ#Sò $
Ü�×(Ñ(Ò.¨BÓ/×5Ñ5Ó7×=Ñ=Ó?ð 	Ô ñ )?¸t×?\Ñ?\Ó(]ò )
Ü�×-Ñ-Ò3°Ó4×:Ñ:Ó<×BÑBÓDð 	Ô%ð �=Š=Ø ŸM™M×/Ñ/Ó1×7Ñ7Ó9ˆDŒMÜ‰‰�dÐ%˜fÓ%r   )r   r   r   r‚  r   r   r   rÊ  rË  r¿   rÔ  rÎ   r   r   r­   ru   rž   r.  rÖ  rØ  rà  r�   rÖ   r×   s   @r    rÆ  rÆ  x  sÉ   ø„ ÙSà*˜&×*Ñ*°aÀÔQÐØ/˜v×/Ñ/¸1ÀoÔVÐØ%�&×%Ñ%°ÀAÔF€KØˆv×Ñ¨1°eÔ<€HØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷Gñ Gò 
ð ñ[ó ð[ð ñeó ðeòY÷&ð &r   rÆ  c                   ó€  — e Zd Z ej                  d¬«      Z ej                  «       Z ej                  d¬«      Z ej                  e
j                  ej                  d¬«      Z ej                  dd¬«      Z ej                   d¬	«      Z ej$                  d¬
«      Z ej$                  d¬«      Z G d„ d«      Zd„ Zy)ÚNotificationr
   r   r[   ÚnotificationsrQ   Trg   Fr  r   rh   c                   ó   — e Zd ZdgZy)úNotification.Metarl   Nrí   r   r   r    ru   rè  Ë  rî   r   ru   c                 óV   — d| j                   › d| j                  › d| j                  › d�S )NzNotification #z to r™   rš   )rw   Úuser_idr‘   ró   s    r    rž   zNotification.__str__Î  s)   € Ø §¡˜y¨¨T¯\©\¨N¸"¸T¿Y¹Y¸KÀqÐIÐIr   N)r   r   r   r   r   ÚtitlerÊ   r÷   r‘   r¹   r   rº   r»   r–  rÏ   ÚdatarÒ   Úseenr   r   r­   ru   rž   r   r   r    rå  rå  ½  s·   „ ØˆF×Ñ¨Ô,€EØˆf×ÑÓ €GØˆ6×Ñ sÔ+€DØˆ6×ÑØ× Ñ Ø—.‘.Ø$ô€Dð
 ˆ6×Ñ ¨TÔ2€DØˆ6×Ñ uÔ-€DØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷#ñ #óJr   rå  N)"Ú	django.dbr   r   r   Údjango.confr   r¸  r   ÚModelr	   r%   r,   r¤   r&   r2   r4   rÙ   rù   r  r0  r=  rD  rP  rh  rt  r{  rˆ  r’  r›  r¢  r¯  r¾  rÆ  rå  r   r   r    ú<module>rñ     s˜  ðß 9Ñ 9Ý  å *ô9ˆf�l‰lô 9ð "Ð ð8¨ð 8°ó 8ð	°Có 	ôLeˆv�|‰|ô Leô^Qˆ&�,‰,ô Qô@&r�&—,‘,ô &rôR>Aˆ6�<‰<ô >AôB=�6—<‘<ô =ô"R�v—|‘|ô Rô )g�6—<‘<ô )gôXPˆf�l‰lô Pô6/�f—l‘lô /ô*9ˆv�|‰|ô 9ô #�—‘ô #ôD#˜Ÿ™ô #ô>#�6—<‘<ô #ô&
˜&Ÿ,™,ô 
ô.S�f—l‘lô Sô0Mˆ6�<‰<ô Mô@	<�f—l‘lô 	<ôB&�6—<‘<ô B&ôJJ�6—<‘<õ Jr   