Ë
    JtªjQ¾ ã                   ó”  — d dl Z d dlZ	 d dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dl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 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$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3m4Z4m5Z5m6Z6m7Z7 d dl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z>  e«       Z? G d„ dej€                  «      ZAd„ ZBd„ ZC G d„ deA«      ZDd„ ZEddœd„ZF G d„ dejŽ                  «      ZH G d„ dejŽ                  «      ZI G d „ d!ej”                  «      ZK G d"„ d#ej”                  «      ZL G d$„ d%ej”                  «      ZM eNejž                  «      ZP eNej¢                  «      ZR eNej¦                  «      ZS eNej¨                  «      ZUd&„ ZVd'„ ZWddd(œd)„ZX G d*„ d+ejŽ                  «      ZYd¬d,„ZZ G d-„ d.ej”                  «      Z[ G d/„ d0ejŽ                  «      Z\ G d1„ d2ej”                  «      Z] G d3„ d4ejŽ                  «      Z^ G d5„ d6ejŽ                  «      Z_ G d7„ d8ej”                  «      Z` G d9„ d:ejŽ                  «      Za G d;„ d<ejŽ                  «      Zb G d=„ d>ejŽ                  «      Zc G d?„ d@ejŽ                  «      Zd G dA„ dBej”                  «      ZedC„ Zfd¬dD„ZgdE„ ZhdF„ Zi G dG„ dHee«      Zj G dI„ dJee«      Zk G dK„ dLej”                  «      Zl G dM„ dNejŽ                  «      Zm G dO„ dPejŽ                  «      Zn G dQ„ dRejŽ                  «      Zo G dS„ dTej”                  «      ZpdU„ Zq G dV„ dWej”                  «      Zr G dX„ dYer«      Zs G dZ„ d[ejŽ                  «      Zt G d\„ d]ejŽ                  «      Zu G d^„ d_ejŽ                  «      Zv G d`„ daej”                  «      Zw G db„ dcej”                  «      Zx G dd„ de«      Zy G df„ dgeyej”                  «      Zz G dh„ diez«      Z{dje|fdk„Z}dl„ Z~dm„ Z G dn„ doeyej”                  «      Z€ G dp„ dqe€«      Z� G dr„ dse€«      Z‚ G dt„ due‚«      Zƒ G dv„ dwej”                  «      Z„ G dx„ dyej”                  «      Z… G dz„ d{ej”                  «      Z† G d|„ d}e†«      Z‡ G d~„ dej”                  «      Zˆ G d€„ d�ej”                  «      Z‰d¬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š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Ÿy# e$ r dZY �Œ8w xY w)­é    N)ÚDecimal©Útransaction)ÚQ)ÚContentFile)Úget_user_model)Úserializers)ÚUserRoleÚShipperProfileÚTransporterProfileÚTransporterDriverLinkÚKYCDocumentÚVehicleÚVehicleDocumentÚPlatformSettings)Úvalidate_load_type_xor)ÚShipmentÚBidÚTripÚTripStatusRecordÚTripLocationÚConversationÚMessageÚProofOfDeliveryÚPODPhotoÚ
TripReviewÚTripShipperReviewÚSavedAddressÚFavoriteTransporterÚFreightRouteÚRateRequest)Úcountry_name_for_codeÚis_valid_country_codeÚnormalize_country_code)Úcurrency_code_for_countryÚcurrency_for_shipment)ÚWalletAccountÚLedgerEntryÚPaymentÚInvoiceÚWithdrawalRequest©Ú'trip_payment_settlement_for_transporteré   )Úbuild_absolute_media_url)Úcreate_traccar_deviceÚgenerate_unique_tc_uidc                   ó   — e Zd ZdZd„ Zd„ Zy)ÚBase64FileFieldaê  
    Accepts a base64-encoded file string (optionally with a data URI prefix
    such as `data:application/pdf;base64,<data>`) and converts it to a
    Django ContentFile ready for saving to a FileField.

    Payload format (either accepted):
        "file": "<pure base64 string>"
        "file": "data:image/jpeg;base64,<base64 string>"

    A companion field `file_name` may optionally be sent; otherwise a UUID
    filename is generated with an extension inferred from the content.
    c                 óÌ  — t        |t        «      st        j                  d«      ‚d|v r6|j	                  dd«      \  }}|j                  dd«      j                  «       }nd }	 t        j                  |«      }t        |«      xs t        |«      xs d}t        j                  «       j                  › d|› �}t        ||¬	«      S # t        $ r t        j                  d«      ‚w xY w)
Nz$A base64-encoded string is required.z;base64,r.   zdata:Ú zInvalid base64 encoding.Úbinú.)Úname)Ú
isinstanceÚstrr	   ÚValidationErrorÚsplitÚreplaceÚstripÚbase64Ú	b64decodeÚ	ExceptionÚ_ext_from_mimeÚ_ext_from_bytesÚuuidÚuuid4Úhexr   )ÚselfÚdataÚheaderÚmimeÚdecodedÚextÚfilenames          ú)/var/www/html/truck-me/api/serializers.pyÚto_internal_valuez!Base64FileField.to_internal_valueF   sÚ   € Ü˜$¤Ô$Ü×-Ñ-Ð.TÓUÐUð ˜ÑØŸ:™: j°!Ó4‰LˆF�DØ—>‘> '¨2Ó.×4Ñ4Ó6‰DàˆDð	JÜ×&Ñ& tÓ,ˆGô
 ˜TÓ"ÒG¤o°gÓ&>ÒGÀ%ˆÜ—j‘j“l×&Ñ&Ð' q¨¨Ð.ˆÜ˜7¨Ô2Ð2øô ò 	JÜ×-Ñ-Ð.HÓIÐIð	Jús   Á#C ÃC#c                 ó"   — |r|j                   S d S ©N)Úurl©rG   Úvalues     rN   Úto_representationz!Base64FileField.to_representation[   s   € Ù!ˆu�y‰yÐ+ tÐ+ó    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rO   rU   © rV   rN   r3   r3   8   s   „ ñò3ó*,rV   r3   c                 ó6   — dddddddœ}|j                  | «      S )NÚjpgÚpngÚgifÚwebpÚpdf)z
image/jpegz	image/jpgz	image/pngz	image/gifz
image/webpzapplication/pdf)Úget)rJ   Ú_maps     rN   rB   rB   _   s+   € àØØØØØ ñ€Dð �8‰8�D‹>ÐrV   c                 ó   — | sy t         �$	 t        j                  d | ¬«      }|r	|dk(  rdS |S 	 | d d dk(  ry| d d dk(  ry| d d	 d
v ryt        | «      dk\  r| d d dk(  r	| dd dk(  ry| d d dk(  ryy # t        $ r Y ŒNw xY w)N)ÚhÚjpegr]   é   s   ÿØÿé   s   ‰PNG

r^   é   )s   GIF87as   GIF89ar_   é   é   s   RIFFs   WEBPr`   s   %PDFra   )ÚimghdrÚwhatrA   Úlen)rH   Úkinds     rN   rC   rC   k   sÃ   € ÙØÜÐð	Ü—;‘;˜t tÔ,ˆDÙØ $¨¢�uÐ8°DÐ8ð ð ˆBˆQ€x�?Ò"ØØˆBˆQ€xÐ'Ò'ØØˆBˆQ€xÐ)Ñ)ØÜ
ˆ4ƒy�B‚˜4  ˜8 wÒ.°4¸¸"°:ÀÒ3HØØˆBˆQ€x�7ÒØØøô ò 	Ùð	ús   ‹A1 «A1 Á1	A=Á<A=c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ÚBase64ImageFieldzIBase64 image payload (optionally as a data URI) decoded to a ContentFile.c                 ó¾   •— |dv ry t         ‰| �  |«      }t        |j                  «       «      xs d}|j	                  d«       |dvrt        j                  d«      ‚|S )N©Nr5   r5   r   )r]   rf   r^   r_   r`   z5Must be a valid image file (JPEG, PNG, GIF, or WebP).)ÚsuperrO   rC   ÚreadÚseekr	   r;   )rG   rH   Úcontent_filerL   Ú	__class__s       €rN   rO   z"Base64ImageField.to_internal_value…   sd   ø€ Ø�:ÑØÜ‘wÑ0°Ó6ˆÜ˜l×/Ñ/Ó1Ó2Ò8°bˆØ×Ñ˜!ÔØÐ;Ñ;Ü×-Ñ-Ð.eÓfÐfØÐrV   )rW   rX   rY   rZ   rO   Ú__classcell__©rx   s   @rN   rq   rq   ‚   s   ø„ ÙS÷ð rV   rq   c                 óö   — ddl m} ddlm} ddlm} |j                  «       j                  d«      }d|› �} ||«       |j                  |› d| j                  › �| «      }t        ||j                  |«      «      S )Nr   ©Údefault_storage©Útimezone©Úensure_upload_dirú%Y/%m/%dzshipment/luggage/ú/©Údjango.core.files.storager}   Údjango.utilsr   Úapi.storage_utilsr�   ÚnowÚstrftimeÚsaver8   r/   rR   )rw   Úrequestr}   r   r�   Ú	date_pathÚrel_dirÚ
saved_paths           rN   Úsave_luggage_image_and_get_urlr�   �   sq   € Ý9Ý%å3à—‘“×'Ñ'¨
Ó3€IØ! ) Ð-€GÙ�gÔØ ×%Ñ%¨¨	°°<×3DÑ3DÐ2EÐ&FÈÓU€JÜ# G¨_×-@Ñ-@ÀÓ-LÓMÐMrV   Úuser©ro   c                ó  — ddl m} ddlm} ddlm} |dvrd}|j                  «       j                  d«      }d|› d	|› �} ||«       |j                  |› d	| j                  › �| «      }t        ||j                  |«      «      S )
uL   Decode-ready ContentFile â†’ media file; return absolute URL for DB storage.r   r|   r~   r€   )r�   Úvehicler�   r‚   zavatars/rƒ   r„   )	rw   r‹   ro   r}   r   r�   rŒ   r�   rŽ   s	            rN   Úsave_avatar_and_get_urlr”   �   s…   € å9Ý%å3àÐ&Ñ&ØˆØ—‘“×'Ñ'¨
Ó3€IØ˜˜˜a 	˜{Ð+€GÙ�gÔØ ×%Ñ%¨¨	°°<×3DÑ3DÐ2EÐ&FÈÓU€JÜ# G¨_×-@Ñ-@ÀÓ-LÓMÐMrV   c                   óŒ  — e Zd Z ej                  «       Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
 ej                  ej                  j                  ¬«      Z ej                  dd¬«      Z ej                  d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ddd¬«      Z ej                  ddd
d¬	«      Z ej(                  ddd¬«      Z eddd¬«      Zd„ Zd„ Zd„ Zd„ Zy)ÚShipperRegisterSerializerTrh   ©Ú
write_onlyÚ
min_lengthF©ÚrequiredÚallow_blank©Úchoiceséÿ   z!Optional business / trading name.)r›   rœ   Ú
max_lengthÚ	help_texté@   zOptional tax / VAT ID.zOptional national ID number.z!Optional national ID expiry date.)r›   Ú
allow_nullr¡   zpOptional base64 national ID document (data URI or raw). When provided, creates an ID KYC document during signup.)r›   r˜   r¡   zOptional passport number.zOptional passport expiry date.z¶Optional base64 passport document (data URI or raw). When provided, creates a PASSPORT_COPY KYC document during signup (no separate /shipper/kyc-documents/ call needed for passport).c                 ó*   — |xs dj                  «       S rs   )r>   rS   s     rN   Úvalidate_national_id_numberz5ShipperRegisterSerializer.validate_national_id_numberê   s   € Ø’˜×"Ñ"Ó$Ð$rV   c                 ó    — t        |«      xs dS rs   ©Únormalize_passport_numberrS   s     rN   Úvalidate_passport_numberz2ShipperRegisterSerializer.validate_passport_numberí   ó   € Ü(¨Ó/Ò5°2Ð5rV   c                 ó6  — |j                  d«      xs d}|rt        |«       t        |j                  d«      xs dj                  «       xs |j                  d«      «      }t        |xs |j                  d«      «      }|s|st	        j
                  d«      ‚|S )NÚpassport_numberr5   Únational_id_numberÚnational_id_fileÚpassport_filezKProvide national ID or passport (number or file). At least one is required.)rb   Úvalidate_unique_passport_numberÚboolr>   r	   r;   )rG   rH   r¬   Úhas_nationalÚhas_passports        rN   Úvalidatez"ShipperRegisterSerializer.validateð   s”   € ØŸ(™(Ð#4Ó5Ò;¸ˆÙÜ+¨OÔ<ÜØ�X‰XÐ*Ó+Ò1¨r×8Ñ8Ó:ò ,Ø�x‰xÐ*Ó+ó
ˆô ˜OÒH¨t¯x©x¸Ó/HÓIˆÙ¡LÜ×-Ñ-Ø]óð ð ˆrV   c                 ó†  — ddl m} ddlm} |d   j	                  «       j                  «       }t        j                  j                  |¬«      j                  «       rt        j                  ddi«      ‚|j                  dd «      }|j                  dd «      }|j                  d	«      xs d
}|j                  d«      }|j                  d«      xs d
}	|j                  d«      }
t        j                  «       5  t        j                  j!                  |||d   |j                  d«      xs d
|j                  d«      xs d
¬«      }t"        j                  j%                  |t"        j&                  j(                  |j                  d«      xs d
¬«       t*        j                  j%                  ||d   |j                  d«      xs d
|j                  d«      xs d
j	                  «       |j                  d«      xs d
j	                  «       |	|
||¬«	      }d}|s|r( |d|j-                  «       j/                  d«      › �«       |rVt0        j                  j%                  |t0        j2                  j4                  ||
t0        j6                  j8                  ¬«       d}|r[t0        j                  j%                  |t0        j2                  j:                  ||xs d |t0        j6                  j8                  ¬«       d}|r5|j<                  s)|j-                  «       |_        |j?                  dd g¬!«       d d d «       |S # 1 sw Y   S xY w)"Nr   r~   r€   Úemail©Úusernameú&A user with this email already exists.r¯   r®   r¬   r5   Úpassport_expiry_dater­   Únational_id_expiry_dateÚpasswordÚ
first_nameÚ	last_name©r¸   r¶   r¼   r½   r¾   Úphone)r�   ÚrolerÀ   Úaccount_typeÚcompany_nameÚbusiness_nameÚtax_id)	r�   rÂ   rÃ   rÄ   rÅ   r­   r»   r¬   rº   Fúkyc/r‚   )r�   Údocument_typeÚfileÚexpiry_dateÚreview_statusT)r�   rÇ   rÈ   r¬   rÉ   rÊ   Úkyc_submitted_atÚ
updated_at©Úupdate_fields) r†   r   r‡   r�   r>   ÚlowerÚUserÚobjectsÚfilterÚexistsr	   r;   Úpoprb   r   ÚatomicÚcreate_userr
   ÚcreateÚRoleÚSHIPPERr   rˆ   r‰   r   ÚDocumentTypeÚIDÚReviewStatusÚPENDINGÚPASSPORT_COPYrË   rŠ   )rG   Úvalidated_datar   r�   r¶   r¯   r®   r¬   Úpassport_expiryr­   Únational_id_expiryr�   ÚprofileÚkyc_createds                 rN   r×   z ShipperRegisterSerializer.createÿ   s   € Ý)å7à˜wÑ'×-Ñ-Ó/×5Ñ5Ó7ˆÜ�<‰<×Ñ¨ÐÓ.×5Ñ5Ô7Ü×-Ñ-¨wÐ8`Ð.aÓbÐbà&×*Ñ*¨?¸DÓAˆØ)×-Ñ-Ð.@À$ÓGÐØ(×,Ñ,Ð->Ó?ÒEÀ2ˆØ(×,Ñ,Ð-CÓDˆØ+×/Ñ/Ð0DÓEÒKÈÐØ+×/Ñ/Ð0IÓJÐä×ÑÓ!ñ 0	OÜ—<‘<×+Ñ+ØØØ'¨
Ñ3Ø)×-Ñ-¨lÓ;ÒA¸rØ(×,Ñ,¨[Ó9Ò?¸Rð ,ó ˆDô ×Ñ×#Ñ#ØÜ—]‘]×*Ñ*Ø$×(Ñ(¨Ó1Ò7°Rð $ô ô
 %×,Ñ,×3Ñ3ØØ+¨NÑ;Ø+×/Ñ/°Ó?ÒEÀ2Ø-×1Ñ1°/ÓBÒHÀb×OÑOÓQØ&×*Ñ*¨8Ó4Ò:¸×AÑAÓCØ#5Ø(:Ø /Ø%4ð 4ó 
ˆGð  ˆKÙ¡=Ù! D¨¯©«×)@Ñ)@ÀÓ)LÐ(MÐ"NÔOÙÜ×#Ñ#×*Ñ*ØÜ"-×":Ñ":×"=Ñ"=Ø)Ø 2Ü"-×":Ñ":×"BÑ"Bð +ô ð #�ÙÜ×#Ñ#×*Ñ*ØÜ"-×":Ñ":×"HÑ"HØ&Ø$3Ò$;°tØ /Ü"-×":Ñ":×"BÑ"Bð +ô ð #�Ù 7×#;Ò#;Ø+3¯<©<«>�Ô(Ø—‘Ð,>ÀÐ+M�ÔN÷a0	Oðb ˆ÷c0	Oðb ˆús   Ã7H5L6Ì6M N)rW   rX   rY   r	   Ú
EmailFieldr¶   Ú	CharFieldr¼   r½   r¾   rÀ   ÚChoiceFieldr   ÚAccountTyperž   rÂ   rÃ   rÄ   rÅ   r­   Ú	DateFieldr»   r3   r®   r¬   rº   r¯   r¥   r©   r´   r×   r[   rV   rN   r–   r–   ®   s•  „ Ø"ˆK×"Ñ"Ó$€EØ$ˆ{×$Ñ$°ÀÔC€HØ&�×&Ñ&°À4ÔH€JØ%�×%Ñ%¨uÀ$ÔG€IØ!ˆK×!Ñ!¨5¸dÔC€EØ*�;×*Ñ*°>×3MÑ3M×3UÑ3UÔV€LØ(�;×(Ñ(°%ÀTÔJ€LØ)�K×)Ñ)ØØØØ5ô	€Mð #ˆ[×"Ñ"ØØØØ*ô	€Fð /˜×.Ñ.ØØØØ0ô	Ðð 4˜k×3Ñ3ØØØ5ôÐñ
 'ØØðGô	Ðð ,�k×+Ñ+ØØØØ-ô	€Oð 1˜;×0Ñ0ØØØ2ôÐñ
 $ØØðNô	€Mò%ò6òóArV   r–   c                   ó‚  — e Zd Z ej                  «       Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
 ej                  ej                  j                  dfej                  j                  dfg¬«      Z ej                  ddd	¬
«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  ddd¬«      Z ej,                  «       Z ej,                  «       Z eddd¬«      Zd„ Zd„ Zy)ÚTransporterRegisterSerializerTrh   r—   Frš   zIndividual driverzFleet ownerr�   z9Required for FLEET_OWNER; optional for individual DRIVER.)r›   rœ   r¡   Úen©r›   Údefaultrœ   ©r›   r˜   r£   c                 ó8  — t        |d   |d   «       |j                  d«      t        j                  j                  k(  rµ|j                  d«      xs dj                  «       }|st        j                  ddi«      ‚||d<   |j                  d«      xs dj                  «       |d<   |j                  d«      xs dj                  «       |d<   |j                  d	«      xs dj                  «       |d	<   |S |j                  d«      xs dj                  «       |d<   |S )
NÚcountry_to_countryÚlocalrÂ   rÃ   r5   z0Company name is required for fleet owner signup.Úoffice_numberÚmobile_numberÚcompany_location)r   rb   r   rç   ÚFLEET_OWNERr>   r	   r;   )rG   rH   rÃ   s      rN   r´   z&TransporterRegisterSerializer.validate]  s  € Ü˜tÐ$8Ñ9¸4À¹=ÔIØ�8‰8�NÓ#Ô'9×'EÑ'E×'QÑ'QÒQØ ŸH™H ^Ó4Ò:¸×AÑAÓCˆLÙÜ!×1Ñ1Ø"Ð$Vð3ó ð ð $0ˆD�Ñ Ø%)§X¡X¨oÓ%>Ò%DÀ"×$KÑ$KÓ$MˆD�Ñ!Ø%)§X¡X¨oÓ%>Ò%DÀ"×$KÑ$KÓ$MˆD�Ñ!Ø(,¯©Ð1CÓ(DÒ(JÈ×'QÑ'QÓ'SˆDÐ#Ñ$ð ˆð %)§H¡H¨^Ó$<Ò$BÀ×#IÑ#IÓ#KˆD�Ñ ØˆrV   c           
      óà  — |d   j                  «       j                  «       }t        j                  j	                  |¬«      j                  «       rt        j                  ddi«      ‚|j                  dd «      }t        j                  «       5  t        j                  j                  |||d   |j                  d«      xs d|j                  d«      xs d¬	«      }t        j                  j                  |t        j                  j                   |j                  d
«      xs d|j                  d«      xs d¬«       ||d   |j                  d«      xs d|d   |d   dœ}|d   t"        j$                  j&                  k(  rH|j                  d«      xs d|d<   |j                  d«      xs d|d<   |j                  d«      xs d|d<   |d   t"        j$                  j(                  k(  rut+        «       }|j                  d«      xs d› d|j                  d«      xs d› �j                  «       }	 t-        ||¬«      }||d<   t1        |j                  d«      «      |d<   |r*t3        || j4                  j                  d«      d¬«      |d<   t#        j                  j                  d i |¤Ž d d d «       |S # t.        $ r%}	t        j                  dt1        |	«      i«      ‚d }	~	ww xY w# 1 sw Y   S xY w)!Nr¶   r·   r¹   Úavatarr¼   r½   r5   r¾   r¿   rÀ   Úlanguagerë   ©r�   rÁ   rÀ   rø   rÂ   rÃ   rð   rñ   )r�   rÂ   rÃ   rð   rñ   rò   ró   rô   Ú ©Údevice_nameÚtraccarÚtc_u_idÚidÚtc_idr‹   r�   r‘   Ú
avatar_urlr[   )r>   rÏ   rÐ   rÑ   rÒ   rÓ   r	   r;   rÔ   r   rÕ   rÖ   rb   r
   r×   rØ   ÚTRANSPORTERr   rç   rõ   ÚDRIVERr1   r0   Ú
ValueErrorr:   r”   Úcontext)
rG   rß   r¶   Úavatar_filer�   Úprofile_datarþ   Ú	full_nameÚdeviceÚexcs
             rN   r×   z$TransporterRegisterSerializer.createn  sÞ  € Ø˜wÑ'×-Ñ-Ó/×5Ñ5Ó7ˆÜ�<‰<×Ñ¨ÐÓ.×5Ñ5Ô7Ü×-Ñ-¨wÐ8`Ð.aÓbÐbà$×(Ñ(¨°4Ó8ˆä×ÑÓ!ñ ,	>Ü—<‘<×+Ñ+ØØØ'¨
Ñ3Ø)×-Ñ-¨lÓ;ÒA¸rØ(×,Ñ,¨[Ó9Ò?¸Rð ,ó ˆDô ×Ñ×#Ñ#ØÜ—]‘]×.Ñ.Ø$×(Ñ(¨Ó1Ò7°RØ'×+Ñ+¨JÓ7Ò?¸4ð	 $ô ð Ø .¨~Ñ >Ø .× 2Ñ 2°>Ó BÒ HÀbØ&4Ð5IÑ&JØ'¨Ñ0ñˆLð ˜nÑ-Ô1C×1OÑ1O×1[Ñ1[Ò[Ø0>×0BÑ0BÀ?Ó0SÒ0YÐWY�˜_Ñ-Ø0>×0BÑ0BÀ?Ó0SÒ0YÐWY�˜_Ñ-Ø3A×3EÑ3EÐFXÓ3YÒ3_Ð]_�Ð/Ñ0à˜nÑ-Ô1C×1OÑ1O×1VÑ1VÒVÜ0Ó2�Ø-×1Ñ1°,Ó?ÒEÀ2ÐFÀaÈ×HZÑHZÐ[fÓHgÒHmÐkmÐGnÐo×uÑuÓw�	ðMÜ2°7È	ÔR�Fð +2�˜YÑ'Ü(+¨F¯J©J°tÓ,<Ó(=�˜WÑ%áÜ-DØØ—L‘L×$Ñ$ YÓ/Øô.�˜\Ñ*ô ×&Ñ&×-Ñ-Ñ=°Ò=÷Y,	>ð\ ˆøô "ò MÜ%×5Ñ5°yÄ#ÀcÃ(Ð6KÓLÐLûðMú÷A,	>ð\ ˆús2   ÂF K#È.J2È;A-K#Ê2	K Ê; KËK Ë K#Ë#K-N)rW   rX   rY   r	   rä   r¶   rå   r¼   r½   r¾   rÀ   ræ   r   rç   r  rõ   rÂ   rÃ   rò   ró   rô   rø   ÚBooleanFieldrð   rñ   rq   r÷   r´   r×   r[   rV   rN   rê   rê   D  sM  „ Ø"ˆK×"Ñ"Ó$€EØ$ˆ{×$Ñ$°ÀÔC€HØ&�×&Ñ&°À4ÔH€JØ%�×%Ñ%¨uÀ$ÔG€IØ!ˆK×!Ñ!¨5¸dÔC€EØ*�;×*Ñ*à×+Ñ+×2Ñ2Ð4GÐHØ×+Ñ+×7Ñ7¸ÐGð
ô€Lð )�;×(Ñ(ØØØMô€Lð
 *�K×)Ñ)°5ÀdÔK€MØ)�K×)Ñ)°5ÀdÔK€MØ,�{×,Ñ,°eÈÔNÐØ$ˆ{×$Ñ$¨e¸TÈtÔT€HØ1˜×1Ñ1Ó3ÐØ$ˆK×$Ñ$Ó&€EÙ u¸È$ÔO€Fòó"5rV   rê   c                   ó  — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  d¬«      Z	 ej                  d¬«      Z
 ej                  dd	¬
«      Z ej                  dd¬
«      Z ej                  «       Z ej                  «       Z ej                  «       Z eddd¬«      Z ej&                  «       Z ej&                  «       Z ej&                  «       Z G d„ d«      Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTransporterProfileSerializerúuser.idT©ÚsourceÚ	read_onlyú
user.emailúuser.first_name©r  úuser.last_nameúuser.role.phoner5   ©r  rí   zuser.role.languagerë   Frî   c                   ó    — e Zd ZeZg d¢Zg d¢Zy)ú!TransporterProfileSerializer.Meta)Úuser_idr¶   r½   r¾   rÀ   rø   rÂ   rÃ   rò   ró   rô   r÷   r  rð   rñ   Údocuments_verifiedr   rþ   Úgcc_idr“   ÚvehiclesÚ
created_atrÌ   )r  r¶   r  r  r   rþ   r  r“   r  r  rÌ   N)rW   rX   rY   r   ÚmodelÚfieldsÚread_only_fieldsr[   rV   rN   ÚMetar  µ  s   „ Ø"ˆò	
ˆò
ÑrV   r"  c                 ó  — t        |dd «      }|�|S t        j                  j                  t	        |¬«      t	        |¬«      z  «      j                  dd«      j                  dd«      }t        |«      |_        |j                  S )NÚ_profile_vehicles_cache)Úowner)Úassigned_driverr%  r&  ú-updated_atz-id)	Úgetattrr   rÑ   rÒ   r   Úselect_relatedÚorder_byÚlistr$  )rG   r�   ÚcachedÚqss       rN   Ú_vehicles_for_userz/TransporterProfileSerializer._vehicles_for_userÆ  st   € Ü˜Ð8¸$Ó?ˆØÐØˆMä�O‰O×"Ñ"¤1¨4¤=´1ÀTÔ3JÑ#JÓKß‰^˜GÐ%6Ó7ß‰X�m UÓ+ð 	ô
 (,¨B£xˆÔ$Ø×+Ñ+Ð+rV   c                 ób   — t        | j                  |j                  «      d¬«      j                  S )NT)Úmany)ÚVehicleSerializerr.  r�   rH   ©rG   Úobjs     rN   Úget_vehiclesz)TransporterProfileSerializer.get_vehiclesÒ  s$   € Ü  ×!8Ñ!8¸¿¹Ó!BÈÔN×SÑSÐSrV   c                 óž   — | j                  |j                  «      }t        d„ |D «       |r|d   nd «      }|rt        |«      j                  S d S )Nc              3   óT   K  — | ]   }|j                   sŒ|j                  sŒ|–— Œ" y ­wrQ   )Ú	is_activeÚis_verified)Ú.0Úvs     rN   ú	<genexpr>z;TransporterProfileSerializer.get_vehicle.<locals>.<genexpr>Ø  s   è ø€ ÒB�1 A§K£K°A·M³MŒQÑBùs   ‚(”(¡(r   )r.  r�   Únextr1  rH   )rG   r3  r  Úprimarys       rN   Úget_vehiclez(TransporterProfileSerializer.get_vehicleÕ  sN   € Ø×*Ñ*¨3¯8©8Ó4ˆÜÙB˜ÔBÙ#ˆH�QŠK¨ó
ˆñ 3:Ô  Ó)×.Ñ.ÐC¸tÐCrV   c                 ó|  — t        |j                  dd«      }|�|S t        j                  j	                  |j                  t        j
                  j                  ¬«      j                  d¬«      j                  d«      j                  d«      j                  «       }|r|j                  nd}||j                  _        |S )zBGCC country code from the user's COUNTRY_GCC KYC document, if any.Ú_profile_gcc_id_cacheN©r�   rÇ   r5   )Úgcc_countryú-submitted_atrB  )r(  r�   r   rÑ   rÒ   rÚ   ÚCOUNTRY_GCCÚexcluder*  ÚonlyÚfirstrB  r@  )rG   r3  r,  ÚdocrT   s        rN   Ú
get_gcc_idz'TransporterProfileSerializer.get_gcc_idÝ  s�   € ä˜Ÿ™Ð#:¸DÓAˆØÐØˆMä×Ñ×&Ñ&Ø—X‘XÜ)×6Ñ6×BÑBð 'ó ÷ ‰W ˆWÓ$ß‰X�oÓ&ß‰T�-Ó ß‰U‹Wð 	ñ $'�—’¨BˆØ).ˆ�‰Ô&ØˆrV   c                 ót   — d|v sd|v r/d|vsd|vrt        j                  d«      ‚t        |d   |d   «       |S )Nrð   rñ   zGBoth country_to_country and local are required when updating load type.)r	   r;   r   ©rG   rH   s     rN   r´   z%TransporterProfileSerializer.validateð  sP   € Ø 4Ñ'¨7°d©?Ø#¨4Ñ/°7À$Ñ3FÜ!×1Ñ1Ø]óð ô # 4Ð(<Ñ#=¸tÀG¹}ÔMØˆrV   c                 óh  — |j                  di «      }|j                  di «      }|j                  dd «      }|j                  }|j                  «       D ]  \  }}t        |||«       Œ |j	                  «        |rF	 |j
                  }	d|v r
|d   |	_        d|v r|j                  dd«      |	_        |	j	                  «        |j                  «       D ]  \  }}t        |||«       Œ |r,t        || j                  j                  d«      d¬«      |_        |j	                  «        |S # t        $ r Y Œpw xY w)	Nr�   rÁ   r÷   rÀ   rø   rë   r‹   r‘   )rÔ   r�   ÚitemsÚsetattrrŠ   rÁ   rÀ   rb   rø   rA   r”   r  r  )
rG   Úinstancerß   Ú	user_dataÚ	role_datar  r�   ÚattrrT   rÁ   s
             rN   Úupdatez#TransporterProfileSerializer.updateù  s,  € Ø"×&Ñ& v¨rÓ2ˆ	Ø—M‘M &¨"Ó-ˆ	Ø$×(Ñ(¨°4Ó8ˆà�}‰}ˆØ$Ÿ?™?Ó,ò 	'‰KˆD�%Ü�D˜$ Õ&ð	'à�	‰	ŒáðØ—y‘y�Ø˜iÑ'Ø!*¨7Ñ!3�D”JØ Ñ*Ø$-§M¡M°*¸dÓ$C�D”MØ—	‘	”ð *×/Ñ/Ó1ò 	+‰KˆD�%Ü�H˜d EÕ*ð	+áÜ"9ØØ—‘× Ñ  Ó+Øô#ˆHÔð
 	�‰Œàˆøô ò Ùðús   Á;AD% Ä%	D1Ä0D1N)rW   rX   rY   r	   ÚIntegerFieldr  rä   r¶   rå   r½   r¾   rÀ   rø   ÚReadOnlyFieldr  r   rþ   rq   r÷   ÚSerializerMethodFieldr“   r  r  r"  r.  r4  r>  rI  r´   rS  r[   rV   rN   r  r  ¦  s  „ Ø&ˆk×&Ñ&¨iÀ4ÔH€GØ"ˆK×"Ñ"¨,À$ÔG€EØ&�×&Ñ&Ð.?Ô@€JØ%�×%Ñ%Ð-=Ô>€IØ!ˆK×!Ñ!Ð):ÀBÔG€EØ$ˆ{×$Ñ$Ð,@È$ÔO€HØ2˜×2Ñ2Ó4ÐØ%ˆK×%Ñ%Ó'€EØ'ˆk×'Ñ'Ó)€GÙ u¸È$ÔO€FØ/ˆk×/Ñ/Ó1€GØ0ˆ{×0Ñ0Ó2€HØ.ˆ[×.Ñ.Ó0€F÷
ñ 
ò"
,òTòDòò&órV   r  c                   óˆ  — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  d¬«      Z	 ej                  d¬«      Z
 ej                  dd	¬
«      Z ej                  «       Z ej                  «       Z ej                  «       Z ej                   d¬«      Z G d„ d«      Zd„ Zd„ Zd„ Zd„ Zy)ÚShipperProfileSerializerr  Tr  r  r  r  r  r  r5   r  F©r›   c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úShipperProfileSerializer.Meta)r  r¶   r½   r¾   rÀ   rÂ   rÃ   rÄ   rÅ   r­   r»   r¬   rº   Úkyc_verifiedrË   Úcredit_approvedÚshipment_preferencesr  rÌ   )r  r¶   r\  rË   r]  r  rÌ   N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  r[  *  s   „ Øˆò
ˆò CÑrV   r"  c                 ó\   — |xs dj                  «       }|st        j                  d«      ‚|S )Nr5   z#National ID number cannot be blank.)r>   r	   r;   )rG   rT   Únumbers      rN   r¥   z4ShipperProfileSerializer.validate_national_id_number7  s.   € Ø’+˜2×$Ñ$Ó&ˆÙÜ×-Ñ-Ð.SÓTÐTØˆrV   c                 ó    — t        |«      xs dS rs   r§   rS   s     rN   r©   z1ShipperProfileSerializer.validate_passport_number=  rª   rV   c                 óZ  — |j                  dt        | j                  dd«      xs d«      }|j                  dt        | j                  dd «      «      }d|v sd|v r|r|st        j                  ddi«      ‚d|v r1|r/t        || j                  r| j                  j                  nd ¬«       |S )Nr¬   r5   rº   zBPassport number is required when passport expiry date is provided.)Úexclude_shipper_id)rb   r(  rO  r	   r;   r°   Úpk)rG   rH   r¬   rà   s       rN   r´   z!ShipperProfileSerializer.validate@  s²   € ØŸ(™(Ð#4´g¸d¿m¹mÐM^Ð`bÓ6cÒ6iÐgiÓjˆØŸ(™(Ø"Ü�D—M‘MÐ#9¸4Ó@ó
ˆð  Ñ$Ð(>À$Ñ(FÙ¡Ü!×1Ñ1Ø%Ð'kð3ó ð ð  Ñ$©Ü+ØØ7;·}²} 4§=¡=×#3Ò#3È$õð ˆrV   c                 óÄ  — |j                  di «      }|j                  di «      }|j                  }|j                  «       D ]  \  }}t        |||«       Œ |j	                  «        d|v r2	 |d   |j
                  _        |j
                  j	                  dg¬«       |j                  «       D ]  \  }}t        |||«       Œ |j	                  «        |S # t        $ r Y ŒBw xY w)Nr�   rÁ   rÀ   rÍ   )rÔ   r�   rM  rN  rŠ   rÁ   rÀ   rA   )rG   rO  rß   rP  rQ  r�   rR  rT   s           rN   rS  zShipperProfileSerializer.updateR  sÝ   € Ø"×&Ñ& v¨rÓ2ˆ	Ø—M‘M &¨"Ó-ˆ	ð �}‰}ˆØ$Ÿ?™?Ó,ò 	'‰KˆD�%Ü�D˜$ Õ&ð	'à�	‰	Œð �iÑðØ"+¨GÑ"4�—	‘	”Ø—	‘	—‘¨g¨Y�Ô7ð
 *×/Ñ/Ó1ò 	+‰KˆD�%Ü�H˜d EÕ*ð	+à�‰Œàˆøô ò Ùðús   Á+1C Ã	CÃCN)rW   rX   rY   r	   rT  r  rä   r¶   rå   r½   r¾   rÀ   rU  r\  rË   r]  Ú	JSONFieldr^  r"  r¥   r©   r´   rS  r[   rV   rN   rX  rX    sË   „ à&ˆk×&Ñ&¨iÀ4ÔH€GØ"ˆK×"Ñ"¨,À$ÔG€EØ&�×&Ñ&Ð.?Ô@€JØ%�×%Ñ%Ð-=Ô>€IØ!ˆK×!Ñ!Ð):ÀBÔG€Eð -�;×,Ñ,Ó.€LØ0�{×0Ñ0Ó2Ðà/�k×/Ñ/Ó1€OØ0˜;×0Ñ0¸%Ô@Ð÷Cñ Còò6òó$rV   rX  c                   ó˜   — e Zd Z ej                  «       Z ej                  «       Z ej                  «       Z G d„ d«      Zd„ Z	d„ Z
d„ Zy)ÚKYCDocumentSerializerc                   ó    — e Zd ZeZg d¢Zg d¢Zy)úKYCDocumentSerializer.Meta)rÿ   rÇ   rB  Úgcc_country_namer¬   rÈ   Úfile_urlÚ	file_backÚfile_back_urlÚverifiedrÊ   Úreview_notesrÉ   Úsubmitted_atÚreviewed_at)ro  rÊ   rp  rq  rr  rÉ   N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  rj  q  s   „ Øˆò
ˆò"
ÑrV   r"  c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y ©Nr‹   ©rÈ   r/   r  rb   rR   r2  s     rN   Úget_file_urlz"KYCDocumentSerializer.get_file_url‰  ó0   € Ø�8Š8Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈÏÉÏÉÓVÐVØrV   c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y rt  )rm  r/   r  rb   rR   r2  s     rN   Úget_file_back_urlz'KYCDocumentSerializer.get_file_back_urlŽ  s2   € Ø�=Š=Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈÏÉ×IZÑIZÓ[Ð[ØrV   c                 ó:   — ddl m}  ||j                  «      xs dS )Nr   )r"   r5   )Úcore.countriesr"   rB  )rG   r3  r"   s      rN   Úget_gcc_country_namez*KYCDocumentSerializer.get_gcc_country_name“  s   € Ý8Ù$ S§_¡_Ó5Ò;¸Ð;rV   N)rW   rX   rY   r	   rV  rl  rn  rk  r"  rv  ry  r|  r[   rV   rN   rh  rh  l  sL   „ Ø0ˆ{×0Ñ0Ó2€HØ5�K×5Ñ5Ó7€MØ8�{×8Ñ8Ó:Ð÷
ñ 
ò0ò
ó
<rV   rh  c                 óT   — | t         j                  j                  k(  rt        S t        S rQ   )r   rç   rõ   Ú!TRANSPORTER_FLEET_OWNER_DOC_TYPESÚTRANSPORTER_DRIVER_DOC_TYPES)rÂ   s    rN   Ú!transporter_doc_types_for_accountr€  Ÿ  s#   € ØÔ)×5Ñ5×AÑAÒAÜ0Ð0Ü'Ð'rV   c                 óN   — | xs dj                  «       j                  «       xs dS )z<Normalize passport number for storage and uniqueness checks.r5   N)r>   Úupper)rT   s    rN   r¨   r¨   ¥  s#   € àŠK�R×ÑÓ ×&Ñ&Ó(Ò0¨DÐ0rV   )Úexclude_doc_idrc  c                óv  — | sy t         j                  j                  | ¬«      }|r|j                  |¬«      }|j	                  «       rt        j                  ddi«      ‚t        j                  j                  | ¬«      }|r|j                  |¬«      }|j	                  «       rt        j                  ddi«      ‚y )N)Úpassport_number__iexact©rd  r¬   z+This passport number is already registered.)r   rÑ   rÒ   rE  rÓ   r	   r;   r   )r¬   rƒ  rc  r-  Ú
profile_qss        rN   r°   r°   ª  s¼   € ÙØÜ	×	Ñ	×	#Ñ	#¸OÐ	#Ó	L€BÙØ�Z‰Z˜>ˆZÓ*ˆØ	‡y�y„{Ü×)Ñ)ØÐLð+
ó ð 	ô  ×'Ñ'×.Ñ.ÀÐ.ÓW€JÙØ×'Ñ'Ð+=Ð'Ó>ˆ
Ø×ÑÔÜ×)Ñ)ØÐLð+
ó ð 	ð rV   c                   óê   — e Zd Z ej                  «       Z ed¬«      Z ed¬«      Z ej                  dd¬«      Z	 ej                  ddd¬«      Z
 ej                  dd¬«      Zd„ Zd	„ Zd
„ Zd„ Zd„ Zy)Ú#TransporterDocumentUploadSerializerFrY  Trš   r¢   ©r›   rœ   r    ©r›   r£   c                 óê  — |xs dj                  «       j                  «       }| j                  j                  d«      }|�|}nN| j                  j                  d«      }t        j
                  j                  }|�	 |j                  j                  }t        t        |«      «      }||vr1t        j                  ddj                  t        |«      «      › d�«      ‚|S # t        j                  $ r Y Œ`w xY w)Nr5   Úforce_account_typer�   z1Invalid document_type for this account. Allowed: ú, r7   )r>   r‚  r  rb   r   rç   r  Útransporter_profilerÂ   ÚDoesNotExistÚsetr€  r	   r;   ÚjoinÚsorted)rG   rT   r�  rÂ   r�   Úalloweds         rN   Úvalidate_document_typez:TransporterDocumentUploadSerializer.validate_document_typeÅ  sé   € Ø’˜"×#Ñ#Ó%×+Ñ+Ó-ˆØ!Ÿ\™\×-Ñ-Ð.BÓCÐØÐ)Ø-‰Là—<‘<×#Ñ# FÓ+ˆDÜ-×9Ñ9×@Ñ@ˆLØÐðØ#'×#;Ñ#;×#HÑ#H�Lô Ô7¸ÓEÓFˆØ˜ÑÜ×-Ñ-ØCÀDÇIÁIÌfÐU\ËoÓD^ÐC_Ð_`Ðaóð ð ˆøô *×6Ñ6ò Ùðús   Á;C ÃC2Ã1C2c                 ó®   — ddl m}m} |xs dj                  «       j	                  «       }|sy ||«      }|r ||«      st        j                  d«      ‚|S )Nr   )Úis_gcc_country_coder$   r5   zBgcc_country must be a GCC country code: AE, SA, OM, QA, BH, or KW.)r{  r—  r$   r>   r‚  r	   r;   )rG   rT   r—  r$   Úcodes        rN   Úvalidate_gcc_countryz8TransporterDocumentUploadSerializer.validate_gcc_countryÙ  sX   € ßNà’˜"×#Ñ#Ó%×+Ñ+Ó-ˆÙØÙ% eÓ,ˆÙÑ.¨tÔ4Ü×-Ñ-ØTóð ð ˆrV   c                 ó   — t        |«      S rQ   r§   rS   s     rN   r©   z<TransporterDocumentUploadSerializer.validate_passport_numberæ  ó   € Ü(¨Ó/Ð/rV   c                 óØ  — |d   }| j                   j                  d«      }d }|r/t        j                  j	                  ||¬«      j                  «       }|j                  d«      }|j                  d«      }|t        j                  v }|j                  dd«      }|j                  d«      }	d| j                  v }
|€ |st        j                  dd	i«      ‚|r|st        j                  dd
i«      ‚|t        j                  j                  k(  r|st        j                  ddi«      ‚|t        j                  j                  k(  r<|	s:t        j                  ddi«      ‚|s!|sd|vrd|vr|
st        j                  d«      ‚|t        j                  j                  k7  rd|d<   n"|� d| j                  vr|j                  dd «       |t        j                  j                  k(  r…|
r|j                  d«      }n2|�|j                  dd «       |j                  }n|j                  d«      }|�|
r9|st        j                  ddi«      ‚t        ||r|j                   nd ¬«       ||d<   |S d |d<   |S )NrÇ   r�   rA  rÈ   rm  rB  r5   r¬   zFront file is required.zBack file is required.z+GCC country is required for GCC ID uploads.ú1Passport number is required for passport uploads.rÉ   zmProvide at least one of file, file_back, gcc_country, passport_number, or expiry_date to update the document.©rƒ  )r  rb   r   rÑ   rÒ   rG  ÚTRANSPORTER_TWO_SIDED_TYPESÚinitial_datar	   r;   rÚ   rD  rÞ   rÔ   r¬   r°   rd  )rG   rH   Údoc_typer�   ÚexistingÚ
file_frontrm  Ú	two_sidedrB  r¬   Úpassport_providedr`  s               rN   r´   z,TransporterDocumentUploadSerializer.validateé  s}  € Ø˜Ñ(ˆØ�|‰|×Ñ Ó'ˆØˆÙÜ"×*Ñ*×1Ñ1°tÈ8Ð1ÓT×ZÑZÓ\ˆHà—X‘X˜fÓ%ˆ
Ø—H‘H˜[Ó)ˆ	Ø¤× GÑ GÐGˆ	Ø—h‘h˜}¨bÓ1ˆØŸ(™(Ð#4Ó5ˆØ-°×1BÑ1BÐBÐàÐÙÜ!×1Ñ1°6Ð;TÐ2UÓVÐVÙ¡Ü!×1Ñ1°;Ð@XÐ2YÓZÐZØœ;×3Ñ3×?Ñ?Ò?ÉÜ!×1Ñ1Ø!Ð#Pð3ó ð ð œ;×3Ñ3×AÑAÒAÉ/Ü!×1Ñ1Ø%Ð'Zð3ó ð ñ ÙØ TÑ)Ø TÑ)Ù%ä×-Ñ-Øóð ð ”{×/Ñ/×;Ñ;Ò;Ø"$ˆD�ÒØÐ! m¸4×;LÑ;LÑ&LØ�H‰H�] DÔ)à”{×/Ñ/×=Ñ=Ò=Ù ØŸ™Ð"3Ó4‘ØÐ%Ø—‘Ð*¨DÔ1Ø!×1Ñ1‘àŸ™Ð"3Ó4�ØÐÑ#4ÙÜ%×5Ñ5Ø)Ð+^ð7ó ð ô 0ØÙ2: 8§;¢;Àõð +1�Ð&Ñ'ð ˆð '+ˆDÐ"Ñ#àˆrV   c                 ó–  — ddl m}m} |j                  dd «      }|€t	        j
                  d«      ‚|j                  d«      }t        j                  j                  ||¬«      j                  «       }|€Et        j                  j                  d||t        j                  j                  dœ|¤Ž} ||«       |S d|v xs d	|v }g }d
D ](  }	|	|vrŒt        ||	||	   «       |j                  |	«       Œ* |r ||d¬«       |j                  g d¢«       |r6|j!                  t#        t$        j'                  |«      «      ¬«        ||«       |S )Nr   ©Úreset_kyc_document_for_resubmitÚsync_user_kyc_verifiedr�   zUser is required.rÇ   rA  )r�   rÇ   rÊ   rÈ   rm  )rÈ   rm  rÉ   rB  r¬   T©Úfile_changed)rÊ   rp  ro  rr  Úreviewed_byrÍ   r[   )Úaccounts.kyc_reviewr¨  r©  rÔ   r	   r;   r   rÑ   rÒ   rG  r×   rÜ   rÝ   rN  ÚappendÚextendrŠ   r+  ÚdictÚfromkeys)
rG   rß   r¨  r©  r�   rÇ   rH  r«  rÎ   Úfields
             rN   r×   z*TransporterDocumentUploadSerializer.create+  sR  € ß_à×!Ñ! &¨$Ó/ˆØˆ<Ü×-Ñ-Ð.AÓBÐBà&×*Ñ*¨?Ó;ˆÜ×!Ñ!×(Ñ(¨dÀ-Ð(ÓP×VÑVÓXˆØˆ;Ü×%Ñ%×,Ñ,ð ØØ+Ü)×6Ñ6×>Ñ>ñð !ñ	ˆCñ # 4Ô(ØˆJà Ð/ÒP°;À.Ð3PˆØˆØ[ò 	(ˆEØ˜NÑ*ØÜ�C˜ ¨uÑ 5Ô6Ø× Ñ  Õ'ð		(ñ
 Ù+¨C¸dÕCØ× Ñ ò "ô ñ Ø�H‰H¤4¬¯©°mÓ(DÓ#EˆHÔFÙ" 4Ô(Øˆ
rV   N)rW   rX   rY   r	   rå   rÇ   r3   rÈ   rm  rB  r¬   rè   rÉ   r•  r™  r©   r´   r×   r[   rV   rN   r‰  r‰  ½  s€   „ Ø)�K×)Ñ)Ó+€MÙ EÔ*€DÙ¨Ô/€IØ'�+×'Ñ'°ÀDÔI€KØ+�k×+Ñ+°UÈÐY[Ô\€OØ'�+×'Ñ'°À4ÔH€Kòò(ò0ò@óD"rV   r‰  c                 óì  — ddl m} ddlm} |sg S  |d|j	                  «       j                  d«      › �«       g }g }t        |«      D ]m  \  }}t        ||| t        j                  j                  dœ¬«      }	|	j                  «       s|j                  ||	j                  i«       Œ]|j                  |	«       Œo |rt        j                  d|i«      ‚|D �	cg c]  }	|	j!                  | ¬	«      ‘Œ c}	S c c}	w )
zGUpsert individual-driver KYC docs (same types/expiry rules) for a user.r   r~   r€   rÆ   r‚   )r‹   r�   r�  )rH   r  Ú	documents)r�   )r†   r   r‡   r�   rˆ   r‰   Ú	enumerater‰  r   rç   r  Úis_validr®  Úerrorsr	   r;   rŠ   )
r�   r´  r‹   r   r�   Úreadyr·  ÚindexÚrawÚsers
             rN   Úupsert_driver_kyc_documentsr¼  P  sà   € å%å3áØˆ	Ù˜˜XŸ\™\›^×4Ñ4°ZÓ@ÐAÐBÔCØ€EØ€FÜ 	Ó*ò ‰
ˆˆsÜ1Øà"ØÜ&8×&DÑ&D×&KÑ&Kñô
ˆð �|‰|Œ~Ø�M‰M˜5 #§*¡*Ð-Õ.à�L‰L˜Õðñ Ü×)Ñ)¨;¸Ð*?Ó@Ð@Ø+0Ö1 CˆC�H‰H˜$ˆHÕÒ1Ð1ùÒ1s   ÃC1c                   ó’  ‡ — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z e	ddd¬«      Z
 ej                   ej                  dd¬	«      ddd
¬«      Z edddd¬«      Z ej                   dddd¬«      Z G d„ d«      Zdee   fd„Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zˆ xZS )r1  zowner.idTr  úassigned_driver.idzassigned_driver.emailFrî   éd   )r    rœ   z.One or more vehicle types this unit can serve.©Úchildr›   Úallow_emptyr¡   zAOptional NOC document (base64). Not required to create a vehicle.)r›   r˜   r£   r¡   z2Optional expiry for NOC when noc_file is provided.)r›   r£   r˜   r¡   c                   ó.   — e Zd ZeZg d¢Zg d¢ZddddœiZy)úVehicleSerializer.Meta)rÿ   Úowner_idÚvehicle_typeÚvehicle_typesÚregistration_numberÚload_capacityÚmax_length_mÚmax_width_mÚmax_height_mÚspecial_featuresr÷   r  Únoc_fileÚnoc_expiry_dater7  r8  Úassigned_driver_idÚassigned_driver_emailÚverified_atr  rÌ   )	rÿ   rÅ  r  r8  rÒ  r  rÌ   rÐ  rÑ  rÆ  FTrš   N)rW   rX   rY   r   r  r   r!  Úextra_kwargsr[   rV   rN   r"  rÄ  …  s)   „ Øˆò
ˆò.

Ðð ¨¸tÑDð
‰rV   r"  Úreturnc                 ó~  — ddl m} t        |t        «      st	        j
                  ddi«      ‚g }t        «       }|D ]e  }t        |xs d«      j                  «       }|sŒ# ||«      xs |}|j                  «       }||v rŒD|j                  |«       |j                  |«       Œg |st	        j
                  ddi«      ‚|S )Nr   )Únormalize_vehicle_typerÇ  zMust be a list of strings.r5   z,Provide at least one non-empty vehicle type.)Úcore.load_discoveryrÖ  r9   r+  r	   r;   r‘  r:   r>   ÚcasefoldÚaddr®  )	rG   Ú	raw_typesrÖ  ÚcleanedÚseenÚitemÚtextÚ	canonicalÚkeys	            rN   Ú_normalize_vehicle_typesz*VehicleSerializer._normalize_vehicle_types­  sÅ   € Ý>ä˜)¤TÔ*Ü×-Ñ-¨Ð@\Ð.]Ó^Ð^ØˆÜ‹uˆØò 		&ˆDÜ�t’z˜r“?×(Ñ(Ó*ˆDÙØÙ.¨tÓ4Ò<¸ˆIØ×$Ñ$Ó&ˆCØ�d‰{ØØ�H‰H�SŒMØ�N‰N˜9Õ%ð		&ñ Ü×-Ñ-ØÐ!Oð/ó ð ð ˆrV   c                 óÄ  — |j                  d«      }d| j                  v }|r¸| j                  j                  d«      dvr›|s#| j                  €t        j                  ddi«      ‚| j                  �j|sht
        j                  j                  | j                  t
        j                  j                  ¬«      j                  «       st        j                  ddi«      ‚d| j                  v }d| j                  v }|r:| j                  | j                  j                  d«      «      |d<   |d   d   |d<   |S |r‰|j                  d«      xs | j                  j                  d«      xs d	j                  «       }|s#| j                  €t        j                  dd
i«      ‚|r | j                  |g«      |d<   |d   d   |d<   |S | j                  €t        j                  ddi«      ‚|S )NrÎ  rÏ  rs   z6NOC file is required when noc_expiry_date is provided.©r“   rÇ   rÇ  rÆ  r   r5   úThis field may not be blank.z2Provide vehicle_types (preferred) or vehicle_type.)rb   r   rO  r	   r;   r   rÑ   rÒ   rÚ   ÚNOCrÓ   rá  r>   )rG   rH   rÎ  Ú
has_expiryÚtypes_in_payloadÚtype_in_payloadr=  s          rN   r´   zVehicleSerializer.validateÄ  s  € Ø—8‘8˜JÓ'ˆØ&¨$×*;Ñ*;Ð;ˆ
Ù˜$×+Ñ+×/Ñ/Ð0AÓBÈ*ÑTÙ §¡Ð 5Ü!×1Ñ1ØÐ Xð3ó ð ð —‘Ð)Ù Ü'×/Ñ/×6Ñ6Ø ŸM™MÜ"1×">Ñ">×"BÑ"Bð 7ó ÷ ‘&“(ðô
 "×1Ñ1ØÐ Xð3ó ð ð +¨d×.?Ñ.?Ð?ÐØ(¨D×,=Ñ,=Ð=ˆÙØ$(×$AÑ$AÀ$×BSÑBS×BWÑBWÐXgÓBhÓ$iˆD�Ñ!Ø#'¨Ñ#8¸Ñ#;ˆD�Ñ ð ˆñ Ø—x‘x Ó/Ò^°4×3DÑ3D×3HÑ3HÈÓ3XÒ^Ð\^×eÑeÓgˆGÙ˜tŸ}™}Ð4Ü!×1Ñ1Ø"Ð$Bð3ó ð ñ Ø(,×(EÑ(EÀwÀiÓ(P��_Ñ%Ø'+¨OÑ'<¸QÑ'?��^Ñ$ð
 ˆð	 �]‰]Ð"Ü×-Ñ-ØÐ!Uð/ó ð ð ˆrV   c                 ó€   •— t         ‰| �  |«      }t        |d«      r|j                  «       ng }||d<   |r|d   |d<   |S )NÚ	type_listrÇ  r   rÆ  )rt   rU   Úhasattrrê  )rG   rO  rH   Útypesrx   s       €rN   rU   z#VehicleSerializer.to_representationì  sK   ø€ Ü‰wÑ(¨Ó2ˆÜ(/°¸+Ô(F�×"Ñ"Ô$ÈBˆØ %ˆˆ_ÑÙØ#(¨¡8ˆD�Ñ ØˆrV   c                 ó  — |xs dj                  «       }|st        j                  d«      ‚| j                  j	                  d«      }d }| j
                  �| j
                  j                  }n|�t        |dd «      �|j                  }|�xt        j                  j                  ||¬«      }| j
                  �&|j                  | j
                  j                  ¬«      }|j                  «       rt        j                  d«      ‚|S )Nr5   rä  r‹   r�   )r%  rÈ  r†  z9You already have a vehicle with this registration number.)r>   r	   r;   r  rb   rO  r%  r(  r�   r   rÑ   rÒ   rE  rd  rÓ   )rG   rT   Úregistrationr‹   r%  r-  s         rN   Úvalidate_registration_numberz.VehicleSerializer.validate_registration_numberô  sâ   € Øš ×*Ñ*Ó,ˆÙÜ×-Ñ-Ð.LÓMÐMà—,‘,×"Ñ" 9Ó-ˆØˆØ�=‰=Ð$Ø—M‘M×'Ñ'‰EØÐ ¤W¨W°f¸dÓ%CÐ%OØ—L‘LˆEàÐÜ—‘×'Ñ'¨eÈÐ'ÓVˆBØ�}‰}Ð(Ø—Z‘Z 4§=¡=×#3Ñ#3�ZÓ4�Ø�y‰yŒ{Ü!×1Ñ1ØOóð ð ÐrV   c                 óŽ   — |s|S t        || j                  j                  d«      d¬«      |_        |j	                  ddg¬«       |S )Nr‹   r“   r‘   r  rÌ   rÍ   )r”   r  rb   r  rŠ   )rG   r“   rw   s      rN   Ú_apply_avatarzVehicleSerializer._apply_avatar
  sI   € ÙØˆNÜ4ØØ�L‰L×Ñ˜YÓ'Øô
ˆÔð
 	�‰ L°,Ð#?ˆÔ@ØˆrV   c                 ó$  — |sy ddl m} ddlm}  |d|j	                  «       j                  d«      › �«       t        j                  j                  |t        j                  j                  ||t        j                  j                  dd d dœ¬«       y )	Nr   r~   r€   zvehicle-docs/r‚   r5   )rÈ   rÉ   rÊ   rp  rr  r¬  )r“   rÇ   Údefaults)r†   r   r‡   r�   rˆ   r‰   r   rÑ   Úupdate_or_createrÚ   rå  rÜ   rÝ   )rG   r“   rÎ  rÏ  r   r�   s         rN   Ú_apply_optional_nocz%VehicleSerializer._apply_optional_noc  s}   € ÙØÝ)å7á˜M¨(¯,©,«.×*AÑ*AÀ*Ó*MÐ)NÐOÔPÜ×Ñ×0Ñ0ØÜ)×6Ñ6×:Ñ:à Ø.Ü!0×!=Ñ!=×!EÑ!EØ "Ø#Ø#ñð 	1õ 	
rV   c                 óÜ   •— |j                  dd «      }|j                  dd «      }|j                  dd «      }t        ‰| �	  |«      }| j                  ||«       | j	                  |||«       |S )Nr÷   rÎ  rÏ  )rÔ   rt   r×   rñ  rõ  )rG   rß   r  rÎ  rÏ  r“   rx   s         €rN   r×   zVehicleSerializer.create*  so   ø€ Ø$×(Ñ(¨°4Ó8ˆØ!×%Ñ% j°$Ó7ˆØ(×,Ñ,Ð->ÀÓEˆÜ‘'‘. Ó0ˆØ×Ñ˜7 KÔ0Ø× Ñ  ¨(°OÔDØˆrV   c                 óÌ  •— |j                  dd «      }|j                  dd «      }|j                  dd «      }t        ‰| �	  ||«      }| j                  ||«       |r| j	                  |||«       |S d| j
                  v re|€ct        j                  j                  |t        j                  j                  ¬«      j                  «       }|�||_        |j                  dg¬«       |S )Nr÷   rÎ  rÏ  rã  rÉ   rÍ   )rÔ   rt   rS  rñ  rõ  r   r   rÑ   rÒ   rÚ   rå  rG  rÉ   rŠ   )	rG   rO  rß   r  rÎ  rÏ  r“   r¢  rx   s	           €rN   rS  zVehicleSerializer.update3  sé   ø€ Ø$×(Ñ(¨°4Ó8ˆØ!×%Ñ% j°$Ó7ˆØ(×,Ñ,Ð->ÀÓEˆÜ‘'‘. ¨>Ó:ˆØ×Ñ˜7 KÔ0áØ×$Ñ$ W¨h¸ÔHð ˆð  $×"3Ñ"3Ñ3¸Ð8HÜ&×.Ñ.×5Ñ5ØÜ-×:Ñ:×>Ñ>ð 6ó ÷ ‰e‹gð ð Ð#Ø'6�Ô$Ø—‘¨]¨O�Ô<ØˆrV   )rW   rX   rY   r	   rT  rÅ  rÐ  rä   rÑ  rq   r÷   Ú	ListFieldrå   rÇ  r3   rÎ  rè   rÏ  r"  r+  r:   rá  r´   rU   rï  rñ  rõ  r×   rS  ry   rz   s   @rN   r1  r1  m  sü   ø„ Ø'ˆ{×'Ñ'¨zÀTÔJ€HØ1˜×1Ñ1Ð9MÐY]Ô^ÐØ2˜K×2Ñ2Ð:QÐ]aÔbÐÙ u¸È$ÔO€FØ)�K×)Ñ)Ø#ˆk×#Ñ#¨sÀÔFØØØBô	€Mñ ØØØØUô	€Hð ,�k×+Ñ+ØØØØFô	€O÷&
ñ &
ðP°T¸#±Yó ò.&ôPòò,	ò
ô*÷ð rV   r1  c                   ó6   — e Zd Z ej                  ddd¬«      Zy)ÚVehicleDriverAssignSerializerFTN©r›   r£   rí   ©rW   rX   rY   r	   rT  Ú	driver_idr[   rV   rN   rú  rú  G  ó   „ Ø(�×(Ñ(°%ÀDÐRVÔW�IrV   rú  c                   ó&   — e Zd Z G d„ d«      Zd„ Zy)ÚPlatformSettingsSerializerc                   ó   — e Zd ZeZg d¢Zy)úPlatformSettingsSerializer.Meta)Úload_visibility_radius_kmÚload_visibility_max_radius_kmÚdefault_wallet_currencyÚdocument_reminder_daysÚ%analytics_transporter_bid_window_daysÚon_time_delivery_grace_hoursÚnearby_load_notify_radius_kmÚnearby_publish_notify_maxÚnavigation_naive_speed_kphÚpod_max_delivery_distance_kmÚadmin_stale_trip_hoursÚbidding_rate_distribution_countN)rW   rX   rY   r   r  r   r[   rV   rN   r"  r  L  s   „ Ø ˆò
‰rV   r"  c                 ó°   — |xs dj                  «       j                  «       }t        |«      dk7  s|j                  «       st	        j
                  d«      ‚|S )Nr5   rg   z.Enter a 3-letter ISO currency code (e.g. USD).)r>   r‚  rn   Úisalphar	   r;   ©rG   rT   r˜  s      rN   Ú validate_default_wallet_currencyz;PlatformSettingsSerializer.validate_default_wallet_currency]  sG   € Ø’˜×"Ñ"Ó$×*Ñ*Ó,ˆÜˆt‹9˜Š> §¡¤Ü×-Ñ-Ð.^Ó_Ð_ØˆrV   N)rW   rX   rY   r"  r  r[   rV   rN   r   r   K  s   „ ÷
ñ 
ó"rV   r   c                   ó¦   — e Zd Z ej                  «       Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z
y)ÚDriverTripStatusSerializerFTr‹  N)rW   rX   rY   r	   rå   ÚstatusÚ
FloatFieldÚlatÚlonÚDateTimeFieldÚrecorded_atr[   rV   rN   r  r  d  sN   „ Ø"ˆ[×"Ñ"Ó$€FØ
 ˆ+×
 Ñ
 ¨%¸DÔ
A€CØ
 ˆ+×
 Ñ
 ¨%¸DÔ
A€CØ+�+×+Ñ+°UÀtÔL�KrV   r  c                   ó6   — e Zd Z ej                  ddd¬«      Zy)ÚTripAssignDriverSerializerFTNrû  rü  r[   rV   rN   r  r  k  rþ  rV   r  c                   óp   — e Zd Z ej                  «       Z ej                  dd¬«      Z G d„ d«      Zd„ Z	y)ÚVehicleDocumentSerializerzreviewed_by.idTr  c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úVehicleDocumentSerializer.Meta)rÿ   r“   rÇ   rÈ   rl  rÊ   rp  rÉ   rq  rr  Úreviewed_by_id)rÊ   rp  rÉ   rq  rr  r!  N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  r   s  s   „ Øˆò
ˆò
ÑrV   r"  c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y rt  ru  r2  s     rN   rv  z&VehicleDocumentSerializer.get_file_url‹  rw  rV   N)
rW   rX   rY   r	   rV  rl  rT  r!  r"  rv  r[   rV   rN   r  r  o  s7   „ Ø0ˆ{×0Ñ0Ó2€HØ-�[×-Ñ-Ð5EÐQUÔV€N÷
ñ 
ó0rV   r  c                   ó–   — e Zd Z ej                  ej                  j                  ¬«      Z e	«       Z
 ej                  dd¬«      Zd„ Zy)ÚVehicleDocumentUploadSerializerr�   FTr‹  c                 ór   — |j                  dd «      }|�||d<   t        j                  j                  di |¤ŽS )Nr“   r[   )rÔ   r   rÑ   r×   )rG   rß   Úkwargsr“   s       rN   r×   z&VehicleDocumentUploadSerializer.create–  s<   € Ø—*‘*˜Y¨Ó-ˆØÐØ(/ˆN˜9Ñ%Ü×&Ñ&×-Ñ-Ñ?°Ñ?Ð?rV   N)rW   rX   rY   r	   ræ   r   rÚ   rž   rÇ   r3   rÈ   rè   rÉ   r×   r[   rV   rN   r$  r$  ‘  sB   „ Ø+�K×+Ñ+°O×4PÑ4P×4XÑ4XÔY€MÙÓ€DØ'�+×'Ñ'°À4ÔH€Kó@rV   r$  c                   óÖ   — e Zd Z ej                  ej                  j                  ej                  j                  g¬«      Z	 ej                  dd¬«      Z ej                  dd¬«      Zy)ÚVehicleDocumentReviewSerializerr�   FTrš   r‹  N)rW   rX   rY   r	   ræ   r   rÜ   ÚAPPROVEDÚREJECTEDrÊ   rå   rp  rè   rÉ   r[   rV   rN   r(  r(  �  sa   „ Ø+�K×+Ñ+à×(Ñ(×1Ñ1Ø×(Ñ(×1Ñ1ð
ô€Mð )�;×(Ñ(°%ÀTÔJ€LØ'�+×'Ñ'°À4ÔH�KrV   r(  c                   óT   — e Zd Z ej                  «       Z ej                  d¬«      Zy)ÚVehicleVerificationSerializerFrY  N)rW   rX   rY   r	   r  r8  r7  r[   rV   rN   r,  r,  ¨  s$   „ Ø*�+×*Ñ*Ó,€KØ(�×(Ñ(°%Ô8�IrV   r,  c                   óÒ   — e Zd Z ej                  ej                  j                  ¬«      Z e	«       Z
 ej                  ddd¬«      Z ej                  dd¬«      Zd„ Zd„ Zd	„ Zd
„ Zy)ÚKYCDocumentUploadSerializerr�   FTr¢   rŠ  r‹  c                 óÌ  — |xs dj                  «       j                  «       }| j                  j                  d«      }|€,| j                  j                  d«      }|�t	        |dd «      nd }|�[	 |j
                   t        t        j                  «      }||vr1t        j                  ddj                  t        |«      «      › d�«      ‚|S # t        j                  $ r |cY S w xY w)Nr5   r�   r‹   z,Invalid document_type for shipper. Allowed: rŽ  r7   )r>   r‚  r  rb   r(  Úshipper_profiler   r�  r‘  r   ÚSHIPPER_DOC_TYPESr	   r;   r’  r“  )rG   rT   r�   r‹   r”  s        rN   r•  z2KYCDocumentUploadSerializer.validate_document_type³  sß   € Ø’˜"×#Ñ#Ó%×+Ñ+Ó-ˆØ�|‰|×Ñ Ó'ˆØˆ<Ø—l‘l×&Ñ& yÓ1ˆGØ5<Ð5H”7˜7 F¨DÔ1ÈdˆDØÐðØ×$Ò$ô œ+×7Ñ7Ó8ˆGØ˜GÑ#Ü!×1Ñ1ØBÀ4Ç9Á9ÌVÐT[Ë_ÓC]ÐB^Ð^_Ð`óð ð ˆøô "×.Ñ.ò Ø’ðús   Á/C ÃC#Ã"C#c                 ó   — t        |«      S rQ   r§   rS   s     rN   r©   z4KYCDocumentUploadSerializer.validate_passport_numberÅ  r›  rV   c                 ó   — |j                  d«      }|t        j                  j                  k(  rš|j                  d«      }|st	        j
                  ddi«      ‚| j                  j                  d«      }d }|r/t        j                  j                  ||¬«      j                  «       }t        ||r|j                  nd ¬«       ||d<   |S d |d<   |S )NrÇ   r¬   r�  r�   rA  rž  )rb   r   rÚ   rÞ   r	   r;   r  rÑ   rÒ   rG  r°   rd  )rG   rH   r¡  r`  r�   r¢  s         rN   r´   z$KYCDocumentUploadSerializer.validateÈ  sÚ   € Ø—8‘8˜OÓ,ˆØ”{×/Ñ/×=Ñ=Ò=Ø—X‘XÐ/Ó0ˆFÙÜ!×1Ñ1Ø%Ð'Zð3ó ð ð —<‘<×#Ñ# FÓ+ˆDØˆHÙÜ&×.Ñ.×5Ñ5Ø¨Xð 6ó ç‘%“'ð ô ,ØÙ.6˜xŸ{š{¸Dõð '-ˆDÐ"Ñ#ð ˆð '+ˆDÐ"Ñ#ØˆrV   c                 ó„  — ddl m}m} |j                  dd «      }|�||d<   |j	                  d«      }|j	                  d«      }d }|r1|r/t
        j                  j                  ||¬«      j                  «       }|€U|j                  dt
        j                  j                  «       t        j                  j                  di |¤Ž}|r ||«       |S |d   |_        g d¢}	d	|v r|d	   |_        |	j                  d	«       d
|v r|d
   |_        |	j                  d
«        ||d¬«       |j#                  |	¬«        ||«       |S )Nr   r§  r�   rÇ   rA  rÊ   rÈ   )rÈ   rÊ   rp  ro  rr  r¬  rÉ   r¬   Trª  rÍ   r[   )r­  r¨  r©  rÔ   rb   r   rÑ   rÒ   rG  Ú
setdefaultrÜ   rÝ   r×   rÈ   rÉ   r®  r¬   rŠ   )
rG   rß   r&  r¨  r©  r�   rÇ   r¢  rH  rÎ   s
             rN   r×   z"KYCDocumentUploadSerializer.createß  s@  € ß_à�z‰z˜& $Ó'ˆØÐØ%)ˆN˜6Ñ"Ø×!Ñ! &Ó)ˆØ&×*Ñ*¨?Ó;ˆØˆÙ‘MÜ"×*Ñ*×1Ñ1°tÈ=Ð1ÓY×_Ñ_ÓaˆHØÐØ×%Ñ% o´{×7OÑ7O×7WÑ7WÔXÜ×%Ñ%×,Ñ,Ñ>¨~Ñ>ˆCÙÙ& tÔ,ØˆJà& vÑ.ˆŒò
ˆð ˜NÑ*Ø#1°-Ñ#@ˆHÔ Ø× Ñ  Ô/Ø Ñ.Ø'5Ð6GÑ'HˆHÔ$Ø× Ñ Ð!2Ô3Ù'¨¸tÕDØ�‰ MˆÔ2Ù˜tÔ$ØˆrV   N)rW   rX   rY   r	   ræ   r   rÚ   rž   rÇ   r3   rÈ   rå   r¬   rè   rÉ   r•  r©   r´   r×   r[   rV   rN   r.  r.  ­  sg   „ Ø+�K×+Ñ+°K×4LÑ4L×4TÑ4TÔU€MÙÓ€DØ+�k×+Ñ+°UÈÐY[Ô\€OØ'�+×'Ñ'°À4ÔH€Kòò$0òó. rV   r.  c                   óÆ   — e Zd Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z G d„ d«      Z	d„ Z
d„ Zd„ Zd„ Zd„ Zy)	ÚShipmentSerializerc                   ó    — e Zd ZeZg d¢Zg d¢Zy)úShipmentSerializer.Meta) rÿ   Ú	unique_idÚpickup_addressÚpickup_companyÚ
pickup_latÚ
pickup_lonÚpickup_country_codeÚdelivery_addressÚdropoff_companyÚdelivery_latÚdelivery_lonÚdelivery_country_codeÚ
cargo_typeÚweightÚ
dimensionsÚvehicle_type_requiredÚspecial_instructionsÚluggage_image_urlÚdistance_kmÚsuggested_priceÚcurrencyÚprice_breakdownÚ	is_returnrð   rñ   r  ÚpodÚpod_urlÚpod_urlsÚpickup_scheduled_atr  rÌ   )
r:  r  r  rÌ   rJ  rM  rN  rP  rQ  rR  N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  r9  	  s   „ Øˆò
ˆò
ÑrV   r"  c                 ó   — t        |«      S rQ   )r&   r2  s     rN   Úget_currencyzShipmentSerializer.get_currency  s   € Ü$ SÓ)Ð)rV   c                 ó^   — 	 t        |dd «      }|rt        |dd «      S 	 y # t        $ r Y y w xY w)NÚtriprP  ©r(  rA   )rG   r3  rW  s      rN   Ú_get_pod_objzShipmentSerializer._get_pod_obj!  sH   € ð	Ü˜3 ¨Ó-ˆDÙÜ˜t U¨DÓ1Ð1ð ð øô ò 	ØØð	ús   ‚   	,«,c                 óv   — | j                  |«      }|r&t        || j                  j                  d«      ¬«      S y ©Nr‹   ©r‹   ©rY  Úserialize_pod_summaryr  rb   ©rG   r3  rP  s      rN   Úget_podzShipmentSerializer.get_pod*  ó4   € Ø×Ñ Ó$ˆÙÜ(¨°d·l±l×6FÑ6FÀyÓ6QÔRÐRØrV   c                 ó  — | j                  |«      }|sy t        |dd «      }|r|j                  «       j                  «       nd }|rE|j                  r9t        | j                  j                  d«      |j                  j                  «      S y ©NÚphotosr‹   ©	rY  r(  ÚallrG  Úimager/   r  rb   rR   ©rG   r3  rP  rd  rG  s        rN   Úget_pod_urlzShipmentSerializer.get_pod_url0  ón   € Ø×Ñ Ó$ˆÙØÜ˜˜h¨Ó-ˆÙ(.�—
‘
“×"Ñ"Ô$°DˆÙ�U—[’[Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈÏÉÏÉÓYÐYØrV   c                 ó4  — | j                  |«      }|sg S t        |dd «      }|sg S g }|j                  «       D ]\  }|j                  sŒt	        | j
                  j                  d«      |j                  j                  «      }|sŒL|j                  |«       Œ^ |S rc  ©	rY  r(  rf  rg  r/   r  rb   rR   r®  ©rG   r3  rP  rd  ÚurlsÚprR   s          rN   Úget_pod_urlszShipmentSerializer.get_pod_urls:  óŠ   € Ø×Ñ Ó$ˆÙØˆIÜ˜˜h¨Ó-ˆÙØˆIØˆØ—‘“ò 	%ˆAØ�w‹wÜ.¨t¯|©|×/?Ñ/?À	Ó/JÈAÏGÉGÏKÉKÓX�ÚØ—K‘K Õ$ð		%ð
 ˆrV   N)rW   rX   rY   r	   rV  rM  rP  rQ  rR  r"  rU  rY  r`  ri  rp  r[   rV   rN   r7  r7    se   „ Ø0ˆ{×0Ñ0Ó2€HØ
+ˆ+×
+Ñ
+Ó
-€CØ/ˆk×/Ñ/Ó1€GØ0ˆ{×0Ñ0Ó2€H÷
ñ 
ò**òòòórV   r7  c                 óò   — | sy t        | dd «      }t        | dd «      }| j                  | j                  | j                  | j                  t        |dd«      xs dt        |dd «      t        |dd«      xs ddœS )NrÁ   r0  rÀ   r5   rÂ   rÃ   )rÿ   r¶   r½   r¾   rÀ   rÂ   rÃ   )r(  rÿ   r¶   r½   r¾   )ÚshipperrÁ   râ   s      rN   Úshipper_public_summaryrt  K  s}   € ÙØÜ�7˜F DÓ)€DÜ�gÐ0°$Ó7€Gà�j‰jØ—‘Ø×(Ñ(Ø×&Ñ&Ü˜˜w¨Ó+Ò1¨rÜ ¨¸Ó>Ü ¨¸Ó<ÒBÀñð rV   c                 ó@  — | syt        | dd«      }t        | dd«      }|�t        |«      n	t        «       }| j                  |v }| j                  | j                  | j
                  | j                  t        |dd«      xs dt        |dd«      t        |dd«      xs d||dœ	S )	z@Public transporter/driver card for shipper-facing trip payloads.NrÁ   r�  rÀ   r5   rÂ   rÃ   ©	rÿ   r¶   r½   r¾   rÀ   rÂ   rÃ   Úis_favouriteÚis_favorite)r(  Ú$get_shipper_favorite_transporter_idsr‘  rÿ   r¶   r½   r¾   )r�   r‹   rÁ   râ   Úfav_idsÚis_favs         rN   Útransporter_party_summaryr|  [  s£   € áØÜ�4˜ Ó&€DÜ�dÐ1°4Ó8€GØ?FÐ?RÔ2°7Ô;ÔX[ÓX]€GØ�W‰W˜Ð€Fà�g‰gØ—‘Ø—o‘oØ—^‘^Ü˜˜w¨Ó+Ò1¨rÜ ¨¸Ó>Ü ¨¸Ó<ÒBÀØØñ
ð 
rV   c                 óª   — | sy | j                   xs d| j                  xs d| j                  | j                  | j                  xs d| j
                  dœS )Nr5   )ÚaddressÚcompanyr  r  Úcountry_codeÚscheduled_at)r;  r<  r=  r>  r?  rS  ©Úshipments    rN   Útrip_pickup_summaryr„  p  sW   € ÙØà×*Ñ*Ò0¨bØ×*Ñ*Ò0¨bØ×"Ñ"Ø×"Ñ"Ø ×4Ñ4Ò:¸Ø ×4Ñ4ñð rV   c                 ó”   — | sy | j                   xs d| j                  xs d| j                  | j                  | j                  xs ddœS )Nr5   )r~  r  r  r  r€  )r@  rA  rB  rC  rD  r‚  s    rN   Útrip_dropoff_summaryr†  }  sN   € ÙØà×,Ñ,Ò2°Ø×+Ñ+Ò1¨rØ×$Ñ$Ø×$Ñ$Ø ×6Ñ6Ò<¸"ñð rV   c                   ó^   — e Zd Z ej                  «       Z G d„ dej                  «      Zd„ Zy)Ú&TransporterAvailableShipmentSerializerc                   ó@   — e Zd Zg ej                  j
                  ¢d‘Zy)ú+TransporterAvailableShipmentSerializer.Metars  N©rW   rX   rY   r7  r"  r   r[   rV   rN   r"  rŠ  Œ  s   „ Ø=Ð%×*Ñ*×1Ñ1Ð=°9Ð=‰rV   r"  c                 ó,   — t        |j                  «      S rQ   )rt  rs  r2  s     rN   Úget_shipperz2TransporterAvailableShipmentSerializer.get_shipper�  s   € Ü% c§k¡kÓ2Ð2rV   N)	rW   rX   rY   r	   rV  rs  r7  r"  r�  r[   rV   rN   rˆ  rˆ  ‰  s*   „ Ø/ˆk×/Ñ/Ó1€Gô>Ð!×&Ñ&ô >ó3rV   rˆ  c                   ó:   — e Zd ZdZ G d„ dej
                  «      Zy)ÚAdminShipmentSerializerz*Shipper id included for admin list/detail.c                   ó>   — e Zd Zdgej                  j
                  ¢Zy)úAdminShipmentSerializer.Metars  Nr‹  r[   rV   rN   r"  r‘  –  s   „ ØÐ=Ð0×5Ñ5×<Ñ<Ð=‰rV   r"  N)rW   rX   rY   rZ   r7  r"  r[   rV   rN   r�  r�  “  s   „ Ù4ô>Ð!×&Ñ&õ >rV   r�  c                   ó‚   — e Zd Z ed¬«      Z ej                  dd¬«      Z ej                  «       Z	 G d„ d«      Z
d„ Zy)	ÚRateRequestSerializerT©r  údriver.emailr  c                   ó    — e Zd ZeZg d¢Zg d¢Zy)úRateRequestSerializer.Meta)rÿ   Úshipment_idrƒ  rý  Údriver_emailÚdriver_nameÚbatch_numberr  rK  Úoffered_pricerM  Úrejection_reasonr  Úresponded_at)	rÿ   r˜  rƒ  rý  r™  rš  r›  r  rž  N)rW   rX   rY   r!   r  r   r!  r[   rV   rN   r"  r—  Ÿ  s   „ Øˆò
ˆò 

ÑrV   r"  c                 óf   — |j                   j                  «       xs |j                   j                  S rQ   )ÚdriverÚget_full_namer¶   r2  s     rN   Úget_driver_namez%RateRequestSerializer.get_driver_name½  s$   € Ø�z‰z×'Ñ'Ó)Ò=¨S¯Z©Z×-=Ñ-=Ð=rV   N)rW   rX   rY   r7  rƒ  r	   rä   r™  rV  rš  r"  r¢  r[   rV   rN   r“  r“  š  s?   „ Ù!¨DÔ1€HØ)�;×)Ñ)°È4ÔP€LØ3�+×3Ñ3Ó5€K÷
ñ 
ó<>rV   r“  c                   ó6   — e Zd Z ej                  ddd¬«      Zy)ÚRateRequestRejectSerializerFTrŸ   rŠ  N)rW   rX   rY   r	   rå   Úreasonr[   rV   rN   r¤  r¤  Á  s   „ Ø"ˆ[×"Ñ"¨E¸tÐPSÔT�FrV   r¤  c                   óº   — e Zd Z ej                  d¬«      Z ej                  d¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
d„ Zd	„ Zd
„ Zy)Ú ShipperDriverLocationsSerializerr.   )Ú	min_valueé   ©r    é
   é   ©Ú
max_digitsÚdecimal_placesc                 ód   — ddl m}m}  ||«      }|r ||«      st        j                  d«      ‚|S )Nr   )r#   r$   ú0Must be a valid ISO 3166-1 alpha-2 country code.)r{  r#   r$   r	   r;   )rG   rT   r#   r$   r˜  s        rN   Úvalidate_country_codez6ShipperDriverLocationsSerializer.validate_country_codeË  s1   € ßPá% eÓ,ˆÙÑ0°Ô6Ü×-Ñ-Ð.`ÓaÐaØˆrV   c                 óZ   — t        |«      }|dk  s|dkD  rt        j                  d«      ‚|S ©Né¦ÿÿÿéZ   z$Latitude must be between -90 and 90.©Úfloatr	   r;   ©rG   rT   r  s      rN   Úvalidate_latz-ShipperDriverLocationsSerializer.validate_latÓ  ó/   € Ü�E‹lˆØ�Š9˜˜bšÜ×-Ñ-Ð.TÓUÐUØˆrV   c                 óZ   — t        |«      }|dk  s|dkD  rt        j                  d«      ‚|S ©NéLÿÿÿé´   z'Longitude must be between -180 and 180.r·  ©rG   rT   Úlngs      rN   Úvalidate_lngz-ShipperDriverLocationsSerializer.validate_lngÙ  ó/   € Ü�E‹lˆØ�Š:˜˜sšÜ×-Ñ-Ð.WÓXÐXØˆrV   N)rW   rX   rY   r	   rT  r˜  rå   r€  ÚDecimalFieldr  rÁ  r²  rº  rÂ  r[   rV   rN   r§  r§  Å  s]   „ Ø*�+×*Ñ*°QÔ7€KØ(�;×(Ñ(°AÔ6€LØ
"ˆ+×
"Ñ
"¨bÀÔ
C€CØ
"ˆ+×
"Ñ
"¨bÀÔ
C€CòòórV   r§  c                   ó  — e Zd ZdZ ej
                  dd¬«      Z ej
                  dd¬«      Z ej
                  dd¬«      Z ej
                  dd¬«      Z	 ej                  dd¬«      Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚShipmentPriceEstimateSerializerz4Preview suggested price without creating a shipment.r«  r¬  r­  Fua   Optional driven polyline [[lng, lat], ...]. If omitted, a 2-point pickupâ†’delivery line is used.)r›   r¡   c                 ó$   — | j                  |«      S rQ   ©Ú_validate_latrS   s     rN   Úvalidate_pickup_latz3ShipmentPriceEstimateSerializer.validate_pickup_latì  ó   € Ø×!Ñ! %Ó(Ð(rV   c                 ó$   — | j                  |«      S rQ   rÈ  rS   s     rN   Úvalidate_delivery_latz5ShipmentPriceEstimateSerializer.validate_delivery_latï  rË  rV   c                 ó$   — | j                  |«      S rQ   ©Ú_validate_lngrS   s     rN   Úvalidate_pickup_lonz3ShipmentPriceEstimateSerializer.validate_pickup_lonò  rË  rV   c                 ó$   — | j                  |«      S rQ   rÏ  rS   s     rN   Úvalidate_delivery_lonz5ShipmentPriceEstimateSerializer.validate_delivery_lonõ  rË  rV   c                 óZ   — t        |«      }|dk  s|dkD  rt        j                  d«      ‚|S r´  r·  r¹  s      rN   rÉ  z-ShipmentPriceEstimateSerializer._validate_latø  r»  rV   c                 óZ   — t        |«      }|dk  s|dkD  rt        j                  d«      ‚|S r½  r·  rÀ  s      rN   rÐ  z-ShipmentPriceEstimateSerializer._validate_lngþ  rÃ  rV   c                 ó*   — |€y | j                  |«      S rQ   )Ú_normalize_route_coordsrS   s     rN   Úvalidate_route_coordsz5ShipmentPriceEstimateSerializer.validate_route_coords  s   € Øˆ=ØØ×+Ñ+¨EÓ2Ð2rV   c                 ó.  — t        |t        «      st        j                  d«      ‚g }t	        |«      D �]
  \  }}	 t        |t        t
        f«      r+t        |«      dk\  rt        |d   «      t        |d   «      }}n{t        |t        «      ret        |j                  d|j                  d|j                  d«      «      «      «      }t        |j                  d|j                  d	«      «      «      }nt        ‚d|cxk  rdk  rn nd|cxk  rdk  sn t        j                  d|› d�«      ‚|j                  ||f«       �Œ t        |«      dk  rt        j                  d«      ‚|S # t        t        t        f$ r t        j                  d
|› d�«      ‚w xY w)Nú$Must be a list of [lng, lat] points.r©  r   r.   rÁ  r  Ú	longituder  ÚlatitudeúInvalid coordinate at index ú; expected [lng, lat].r¾  r¿  rµ  r¶  ú!Coordinate out of range at index r7   ú'Provide at least two coordinate points.©r9   r+  r	   r;   rµ  Útuplern   r¸  r°  rb   Ú	TypeErrorr  ÚKeyErrorr®  ©rG   rº  ÚpointsÚidxrÝ  rÁ  r  s          rN   r×  z7ShipmentPriceEstimateSerializer._normalize_route_coords	  sk  € Ü˜#œtÔ$Ü×-Ñ-Ð.TÓUÐUØˆÜ" 3›ó 	&‰IˆC�ðÜ˜d¤T¬5 MÔ2´s¸4³yÀA²~Ü$ T¨!¡W›~¬u°T¸!±W«~˜‘CÜ ¤dÔ+Ü §¡¨°·±¸ÀÇÁÈÓ@UÓ0VÓ WÓX�CÜ §¡¨°·±¸Ó0DÓ EÓF‘Cä#�Oð
 ˜CÔ& 3Õ&¨3°#Ô+;¸Ô+;Ü!×1Ñ1Ð4UÐVYÐUZÐZ[Ð2\Ó]Ð]Ø�M‰M˜3 ˜*Ö%ð	&ô  ˆv‹;˜Š?Ü×-Ñ-Ð.WÓXÐXØˆøô œz¬8Ð4ò Ü!×1Ñ1Ø2°3°%Ð7MÐNóð ðús   »B<E&Å&.Fc                 óì   — ddl m} | j                  }|j                  d«      }|s8t	        |d   «      t	        |d   «      ft	        |d   «      t	        |d   «      fg} ||d   |d   |d   |d   |«      S )Nr   )Úestimate_suggested_priceÚroute_coordsr>  r=  rC  rB  )Úcore.pricing.serviceré  rß   rb   r¸  )rG   ré  rH   rê  s       rN   Úestimatez(ShipmentPriceEstimateSerializer.estimate!  s’   € ÝAà×"Ñ"ˆØ—x‘x Ó/ˆÙä�t˜LÑ)Ó*¬E°$°|Ñ2DÓ,EÐFÜ�t˜NÑ+Ó,¬e°D¸Ñ4HÓ.IÐJðˆLñ (Ø�ÑØ�ÑØ�Ñ Ø�Ñ Øó
ð 	
rV   N)rW   rX   rY   rZ   r	   rÄ  r=  r>  rB  rC  rf  rê  rÊ  rÍ  rÑ  rÓ  rÉ  rÐ  rØ  r×  rì  r[   rV   rN   rÆ  rÆ  à  sš   „ Ù>à)�×)Ñ)°RÈÔJ€JØ)�×)Ñ)°RÈÔJ€JØ+�;×+Ñ+°rÈ!ÔL€LØ+�;×+Ñ+°rÈ!ÔL€LØ(�;×(Ñ(ØØuô€Lò
)ò)ò)ò)òòò3ò
ó0
rV   rÆ  c                   óÂ   ‡ — e Zd Z eddd¬«      Z ej                  dd¬«      Z G d„ d«      Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zddœd„Zd„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zˆ xZS )ÚShipmentCreateUpdateSerializerFTrî   )r›   r˜   c                   ó   — e Zd ZeZg d¢Zy)ú#ShipmentCreateUpdateSerializer.Meta)r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  Úluggage_imagerK  rL  rS  rO  rð   rñ   rê  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  rð  :  s   „ Øˆò

‰rV   r"  c                 ó¼   — | j                   �d|vsd|vrt        j                  d«      ‚t        |d   |d   «       d|v r|d   �| j	                  |d   «      |d<   |S )Nrð   rñ   zHBoth country_to_country and local are required when updating a shipment.rê  )rO  r	   r;   r   r×  rK  s     rN   r´   z'ShipmentCreateUpdateSerializer.validateH  sx   € Ø�=‰=Ð$Ø#¨4Ñ/°7À$Ñ3FÜ!×1Ñ1Ø^óð ô 	˜tÐ$8Ñ9¸4À¹=ÔIØ˜TÑ! d¨>Ñ&:Ð&FØ#'×#?Ñ#?ÀÀ^Ñ@TÓ#UˆD�Ñ ØˆrV   c                 ó>  — t        |t        «      st        j                  ddi«      ‚g }t	        |«      D �]  \  }}	 t        |t        t
        f«      r+t        |«      dk\  rt        |d   «      t        |d   «      }}n{t        |t        «      ret        |j                  d|j                  d|j                  d«      «      «      «      }t        |j                  d	|j                  d
«      «      «      }nt        ‚d|cxk  rdk  rn nd|cxk  rdk  sn t        j                  dd|› d�i«      ‚|j                  ||f«       �Œ t        |«      dk  rt        j                  ddi«      ‚|S # t        t        t        f$ r t        j                  dd|› d�i«      ‚w xY w)Nrê  rÚ  r©  r   r.   rÁ  r  rÛ  r  rÜ  rÝ  rÞ  r¾  r¿  rµ  r¶  rß  r7   rà  rá  rå  s          rN   r×  z6ShipmentCreateUpdateSerializer._normalize_route_coordsS  s‹  € Ü˜#œtÔ$Ü×-Ñ-¨~Ð?eÐ.fÓgÐgØˆÜ" 3›ó 	&‰IˆC�ðÜ˜d¤T¬5 MÔ2´s¸4³yÀA²~Ü$ T¨!¡W›~¬u°T¸!±W«~˜‘CÜ ¤dÔ+Ü §¡¨°·±¸ÀÇÁÈÓ@UÓ0VÓ WÓX�CÜ §¡¨°·±¸Ó0DÓ EÓF‘Cä#�Oð
 ˜CÔ& 3Õ&¨3°#Ô+;¸Ô+;Ü!×1Ñ1Ø#Ð'HÈÈÈQÐ%OÐPóð ð �M‰M˜3 ˜*Ö%ð#	&ô$ ˆv‹;˜Š?Ü×-Ñ-ØÐ!JÐKóð ð ˆøô œz¬8Ð4ò Ü!×1Ñ1Ø#Ð'CÀCÀ5ÐH^Ð%_Ð`óð ðús   ½B<E,Å,0Fc                 óŠ   — |s|S t        || j                  j                  d«      «      |_        |j	                  ddg¬«       |S )Nr‹   rJ  rÌ   rÍ   )r�   r  rb   rJ  rŠ   )rG   rƒ  rw   s      rN   Ú_apply_luggage_imagez3ShipmentCreateUpdateSerializer._apply_luggage_imageo  sG   € ÙØˆOÜ%CØØ�L‰L×Ñ˜YÓ'ó&
ˆÔ"ð 	�‰Ð%8¸,Ð$GˆÔHØˆrV   c                 ó(   — | j                  |d¬«      S ©NT©Úoperational©Ú_validate_country_coderS   s     rN   Úvalidate_pickup_country_codez;ShipmentCreateUpdateSerializer.validate_pickup_country_codey  ó   € Ø×*Ñ*¨5¸dÐ*ÓCÐCrV   c                 ó(   — | j                  |d¬«      S r÷  rú  rS   s     rN   Úvalidate_delivery_country_codez=ShipmentCreateUpdateSerializer.validate_delivery_country_code|  rý  rV   rø  c                ó¶   — ddl m}m}m} |dv r|S  ||«      }|r ||«      st	        j
                  d«      ‚|r ||«      }|rt	        j
                  |«      ‚|S )Nr   )r#   r$   Ú$operational_region_error_for_countryrs   r±  )r{  r#   r$   r  r	   r;   )rG   rT   rù  r#   r$   r  r˜  Úregion_errors           rN   rû  z5ShipmentCreateUpdateSerializer._validate_country_code  sb   € ßvÑvà�JÑØˆLÙ% eÓ,ˆÙÑ0°Ô6Ü×-Ñ-Ð.`ÓaÐaÙÙ?ÀÓEˆLÙÜ!×1Ñ1°,Ó?Ð?ØˆrV   c                 ó˜   — ddl m} g }dD ]$  \  }}} |||||¬«      sŒ|j                  |«       Œ& |r|j                  g |¢d‘¬«       |S )Nr   )Ú#maybe_fill_country_code_from_coords))r?  r=  r>  )rD  rB  rC  )r²  Ú	lat_fieldÚ	lon_fieldrÌ   rÍ   )Úcore.geocodingr  r®  rŠ   )rG   rƒ  r  Úupdated_fieldsr²  r  r  s          rN   Ú_fill_country_codes_from_coordsz>ShipmentCreateUpdateSerializer._fill_country_codes_from_coords�  sk   € ÝFàˆð,
ò 
	-Ñ'ˆE�9˜iñ 3ØØØ#Ø#ö	ð ×%Ñ% eÕ,ð
	-ñ Ø�M‰MÐ(G¨.Ð(G¸,Ð(GˆMÔHØˆrV   c                 óæ   — ddl m} ddlm} |j                  }|s5|j
                  �)|j                  � ||j
                  |j                  «      } ||«      |_        |j                  ddg¬«       |S )Nr   )r%   )Úcountry_code_for_pointrM  rÌ   rÍ   )	Úcore.currenciesr%   rë  r  r?  r=  r>  rM  rŠ   )rG   rƒ  r%   r  Úpickups        rN   Ú_apply_pickup_currencyz5ShipmentCreateUpdateSerializer._apply_pickup_currency   si   € Ý=Ý?à×-Ñ-ˆÙ˜(×-Ñ-Ð9¸h×>QÑ>QÐ>]Ù+¨H×,?Ñ,?À×ATÑATÓUˆFÙ5°fÓ=ˆÔØ�‰ Z°Ð$>ˆÔ?ØˆrV   c                 óp   — ddl m} dD ]+  } |t        ||«      «      }|sŒt        j                  |«      ‚ y )Nr   )r  )r?  rD  )r{  r  r(  r	   r;   )rG   rƒ  r  r²  Úmessages        rN   Ú!_ensure_operational_country_codesz@ShipmentCreateUpdateSerializer._ensure_operational_country_codes«  s9   € ÝGàEò 	;ˆEÙ:¼7À8ÈUÓ;SÓTˆGÚÜ!×1Ñ1°'Ó:Ð:ñ	;rV   c                 ó|   — |j                   sy ddlm}  ||j                  «      }|rt	        j
                  |«      ‚y )Nr   )Ú$return_trip_error_for_pickup_country)rO  r{  r  r?  r	   r;   )rG   rƒ  r  r  s       rN   Ú_ensure_return_trip_allowedz:ShipmentCreateUpdateSerializer._ensure_return_trip_allowed³  s:   € Ø×!Ò!ØÝGá6°x×7SÑ7SÓTˆÙÜ×-Ñ-¨gÓ6Ð6ð rV   c                 ó0  — |rt        |«      dk\  r|S |j                  �$|j                  �|j                  �|j                  €yt        |j                  «      t        |j                  «      ft        |j                  «      t        |j                  «      fgS )uB   Prefer client polyline; else 2-point pickupâ†’delivery (lng, lat).r©  N)rn   r=  r>  rB  rC  r¸  )rG   rƒ  rê  s      rN   Ú_route_coords_for_pricingz8ShipmentCreateUpdateSerializer._route_coords_for_pricing¼  s�   € áœC Ó-°Ò2ØÐà×ÑÐ'Ø×"Ñ"Ð*Ø×$Ñ$Ð,Ø×$Ñ$Ð,àä�8×&Ñ&Ó'¬¨x×/BÑ/BÓ)CÐDÜ�8×(Ñ(Ó)¬5°×1FÑ1FÓ+GÐHð
ð 	
rV   c                 ó˜  •— ddl m} |j                  dd «      }|j                  dd «       |j                  dd «        |j                  «       5  t        ‰| �  |«      }| j                  |«      }| j                  |«       | j                  |«       | j                  |«      }| j                  ||«      }|cd d d «       S # 1 sw Y   y xY w©Nr   r   rñ  rê  rM  )Ú	django.dbr   rÔ   rÕ   rt   r×   r	  r  r  r  rõ  )rG   rß   r   Úluggage_filerƒ  rx   s        €rN   r×   z%ShipmentCreateUpdateSerializer.createÌ  sº   ø€ Ý)à%×)Ñ)¨/¸4Ó@ˆØ×Ñ˜>¨4Ô0Ø×Ñ˜: tÔ,àˆ[×ÑÓ!ñ 	Ü‘w‘~ nÓ5ˆHØ×;Ñ;¸HÓEˆHØ×2Ñ2°8Ô<Ø×,Ñ,¨XÔ6Ø×2Ñ2°8Ó<ˆHØ×0Ñ0°¸<ÓHˆHØ÷	÷ 	ò 	ús   ÁA'C Ã C	c                 óš  •— ddl m} |j                  dd «      }|j                  dd «       |j                  dd «        |j                  «       5  t        ‰| �  ||«      }| j                  |«      }| j                  |«       | j                  |«       | j                  |«      }| j                  ||«      }|cd d d «       S # 1 sw Y   y xY wr  )r  r   rÔ   rÕ   rt   rS  r	  r  r  r  rõ  )rG   rO  rß   r   r  rƒ  rx   s         €rN   rS  z%ShipmentCreateUpdateSerializer.updateÜ  s¼   ø€ Ý)à%×)Ñ)¨/¸4Ó@ˆØ×Ñ˜>¨4Ô0Ø×Ñ˜: tÔ,àˆ[×ÑÓ!ñ 	Ü‘w‘~ h°Ó?ˆHØ×;Ñ;¸HÓEˆHØ×2Ñ2°8Ô<Ø×,Ñ,¨XÔ6Ø×2Ñ2°8Ó<ˆHØ×0Ñ0°¸<ÓHˆHØ÷	÷ 	ò 	ús   ÁA(CÃC
)rW   rX   rY   rq   rñ  r	   rf  rê  r"  r´   r×  rõ  rü  rÿ  rû  r	  r  r  r  r  r×   rS  ry   rz   s   @rN   rî  rî  4  s€   ø„ Ù$¨eÀÐQUÔV€Mð )�;×(Ñ(°%ÀDÔI€L÷
ñ 
ò	òò8òDòDð <Aô òò&	ò;ò7ò
ô ÷ ð rV   rî  c                 ó  — | s
t        «       S t        | dd«      }|rt        |dd«      s
t        «       S t        | d«      s?t        t        j                  j                  |¬«      j                  dd¬	«      «      | _        | j                  S )
zOCached set of favorited transporter user IDs for the current request's shipper.r�   NÚis_authenticatedFÚ_favorite_transporter_ids_cache)rs  Útransporter_idT©Úflat)r‘  r(  rë  r   rÑ   rÒ   Úvalues_listr  )r‹   r�   s     rN   ry  ry  í  s   € áÜ‹uˆÜ�7˜F DÓ)€DÙ”w˜tÐ%7¸Ô?Ü‹uˆÜ�7Ð=Ô>Ü25Ü×'Ñ'×.Ñ.°tÐ.Ó<×HÑHÐIYÐ`dÐHÓeó3
ˆÔ/ð ×2Ñ2Ð2rV   c                   óè   — e Zd Z ej                  dd¬«      Z ej                  «       Z ej                  «       Z ej                  «       Z	 ej                  «       Z
 G d„ d«      Zd„ Zd„ Zd„ Zd	„ Zy
)ÚBidListSerializerútransporter.emailTr  c                   ó   — e Zd ZeZg d¢Zy)úBidListSerializer.Meta)rÿ   ÚtransporterÚtransporter_emailÚtransporter_namerw  rx  ÚamountrM  r  Úcounter_amountr  r  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  r'    s   „ Øˆò
‰rV   r"  c                 ó¬   — |j                   j                  › d|j                   j                  › �j                  «       xs |j                   j                  S ©Nrú   )r(  r½   r¾   r>   r¶   r2  s     rN   Úget_transporter_namez&BidListSerializer.get_transporter_name
  sD   € Ø—/‘/×,Ñ,Ð-¨Q¨s¯©×/HÑ/HÐ.IÐJ×PÑPÓRÒkÐVY×VeÑVe×VkÑVkÐkrV   c                 ó.   — t        t        |dd «      «      S ©Nrƒ  ©r&   r(  r2  s     rN   rU  zBidListSerializer.get_currency  ó   € Ü$¤W¨S°*¸dÓ%CÓDÐDrV   c                 ó€   — t        | j                  j                  d«      «      }|syt        t	        |dd «      |v «      S )Nr‹   Fr  ©ry  r  rb   r±   r(  ©rG   r3  rz  s      rN   Úget_is_favouritez"BidListSerializer.get_is_favourite  s;   € Ü6°t·|±|×7GÑ7GÈ	Ó7RÓSˆÙØÜ”G˜CÐ!1°4Ó8¸GÐCÓDÐDrV   c                 ó$   — | j                  |«      S rQ   ©r7  r2  s     rN   Úget_is_favoritez!BidListSerializer.get_is_favorite  ó   € Ø×$Ñ$ SÓ)Ð)rV   N)rW   rX   rY   r	   rä   r)  rV  r*  rM  rw  rx  r"  r/  rU  r7  r:  r[   rV   rN   r$  r$  ü  s{   „ Ø.˜×.Ñ.Ð6IÐUYÔZÐØ8�{×8Ñ8Ó:ÐØ0ˆ{×0Ñ0Ó2€HØ4�;×4Ñ4Ó6€LØ3�+×3Ñ3Ó5€K÷
ñ 
òlòEòEó*rV   r$  c                   ó6   — e Zd Z G d„ dej                  «      Zy)ÚBidDetailSerializerc                   ó8   — e Zd Zej                  j
                  Zy)úBidDetailSerializer.MetaN)rW   rX   rY   r$  r"  r   r[   rV   rN   r"  r?    s   „ Ø"×'Ñ'×.Ñ.‰rV   r"  N)rW   rX   rY   r$  r"  r[   rV   rN   r=  r=    s   „ ô/Ð ×%Ñ%õ /rV   r=  c                   ó   — e Zd Zy)ÚBidAcceptSerializerN)rW   rX   rY   r[   rV   rN   rA  rA    s   „ ØrV   rA  c                   ó\   — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Zy)ÚBidCounterSerializerrj   r©  r­  FTrš   N)rW   rX   rY   r	   rÄ  r,  rå   r  r[   rV   rN   rC  rC  #  s*   „ Ø-�[×-Ñ-¸ÈAÔN€NØ#ˆk×#Ñ#¨UÀÔE�GrV   rC  c                   ó¢   — e Zd ZdZdZedfedfgZ ej                  e¬«      Z ej                  ddd¬	«      Z
 ej                  dd
¬«      Zd„ Zy)ÚTransporterBidSubmitSerializerÚACCEPTÚCOUNTERzAccept shipper proposed ratezSubmit counter-offerr�   rj   r©  F)r®  r¯  r›   Trš   c                 óš   — |j                  d«      }|j                  d«      }|| j                  k(  r|€t        j                  ddi«      ‚|S )NÚactionr+  z%amount is required for counter-offer.)rb   ÚACTION_COUNTERr	   r;   )rG   ÚattrsrI  r+  s       rN   r´   z'TransporterBidSubmitSerializer.validate4  sL   € Ø—‘˜8Ó$ˆØ—‘˜8Ó$ˆØ�T×(Ñ(Ò(¨V¨^Ü×-Ñ-¨xÐ9`Ð.aÓbÐbØˆrV   N)rW   rX   rY   ÚACTION_ACCEPTrJ  ÚACTION_CHOICESr	   ræ   rI  rÄ  r+  rå   r  r´   r[   rV   rN   rE  rE  (  si   „ Ø€MØ€Nà	Ð6Ð7Ø	Ð/Ð0ð€Nð
 %ˆ[×$Ñ$¨^Ô<€FØ%ˆ[×%Ñ%°ÀAÐPUÔV€FØ#ˆk×#Ñ#¨UÀÔE€GórV   rE  c                   ó    — e Zd Z G d„ d«      Zy)ÚTripLocationSerializerc                   ó   — e Zd ZeZg d¢Zy)úTripLocationSerializer.Meta)rÿ   r  r  r  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  rQ  >  s   „ ØˆÚ4‰rV   r"  N©rW   rX   rY   r"  r[   rV   rN   rO  rO  =  s   „ ÷5ò 5rV   rO  c                   ó    — e Zd Z G d„ d«      Zy)ÚTripStatusRecordSerializerc                   ó   — e Zd ZeZddgZy)úTripStatusRecordSerializer.Metar  r  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  rV  D  s   „ Ø ˆØ˜MÐ*‰rV   r"  NrR  r[   rV   rN   rT  rT  C  s   „ ÷+ò +rV   rT  c                   ó4   — e Zd Z ej                  «       Zd„ Zy)ÚTripUniqueIdMixinc                 óä   — t        |dd «      }|�|j                  S |j                  rIt        j                  j                  |j                  ¬«      j                  dd¬«      j                  «       S y )Nrƒ  r†  r:  Tr   )r(  r:  r˜  r   rÑ   rÒ   r"  rG  )rG   r3  rƒ  s      rN   Úget_unique_idzTripUniqueIdMixin.get_unique_idM  sc   € Ü˜3 
¨DÓ1ˆØÐØ×%Ñ%Ð%Ø�?Š?ä× Ñ ×'Ñ'¨3¯?©?Ð'Ó;ß‘˜[¨t�Ó4ß‘“ðð
 rV   N)rW   rX   rY   r	   rV  r:  rZ  r[   rV   rN   rX  rX  J  s   „ Ø1�×1Ñ1Ó3€Ió
rV   rX  c                   óB  — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  «       Z
 ej                  dd¬«      Z ej                  d¬«      Z eddd¬	«      Z ej                   d
d¬«      Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z G d„ d«      Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z y)ÚTripListSerializerrƒ  Tr  zshipment.pickup_companyzshipment.dropoff_companyúshipment.is_returnr”  Ústatus_records©r  r0  r  r¾  c                   ó   — e Zd ZeZg d¢Zy)úTripListSerializer.Meta)rÿ   r:  r˜  r<  rA  rM  Úagreed_pricerO  r  Ústatus_timeliner(  rÐ  rw  rx  Úshipper_ratingrP  rQ  rR  Úcurrent_latÚcurrent_lonÚetar  rÌ   N©rW   rX   rY   r   r  r   r[   rV   rN   r"  ra  j  s   „ Øˆò
‰rV   r"  c                 ó¢   — t        | j                  j                  d«      «      }|syt        t	        |dd «      |v xs t	        |dd «      |v «      S ©Nr‹   Fr  rÐ  r5  r6  s      rN   r7  z#TripListSerializer.get_is_favouritet  óX   € Ü6°t·|±|×7GÑ7GÈ	Ó7RÓSˆÙØÜÜ�SÐ*¨DÓ1°WÐ<ò EÜ˜Ð1°4Ó8¸GÐCó
ð 	
rV   c                 ó$   — | j                  |«      S rQ   r9  r2  s     rN   r:  z"TripListSerializer.get_is_favorite}  r;  rV   c                 ó   — t        |d«      S ©NÚshipper_review©rë  r2  s     rN   Úget_shipper_ratingz%TripListSerializer.get_shipper_rating€  ó   € Ü�sÐ,Ó-Ð-rV   c                 ó.   — t        t        |dd «      «      S r1  r2  r2  s     rN   rU  zTripListSerializer.get_currencyƒ  r3  rV   c                 ó<   — 	 t        |dd «      S # t        $ r Y y w xY w©NrP  rX  r2  s     rN   rY  zTripListSerializer._get_pod_obj†  ó(   € ð	Ü˜3  tÓ,Ð,øÜò 	Ùð	úó   ‚ �	šc                 óv   — | j                  |«      }|r&t        || j                  j                  d«      ¬«      S y r[  r]  r_  s      rN   r`  zTripListSerializer.get_podŒ  ra  rV   c                 ó  — | j                  |«      }|sy t        |dd «      }|r|j                  «       j                  «       nd }|rE|j                  r9t        | j                  j                  d«      |j                  j                  «      S y rc  re  rh  s        rN   ri  zTripListSerializer.get_pod_url’  rj  rV   c                 ó4  — | j                  |«      }|sg S t        |dd «      }|sg S g }|j                  «       D ]\  }|j                  sŒt	        | j
                  j                  d«      |j                  j                  «      }|sŒL|j                  |«       Œ^ |S rc  rl  rm  s          rN   rp  zTripListSerializer.get_pod_urlsœ  rq  rV   N)!rW   rX   rY   r	   ÚPrimaryKeyRelatedFieldr˜  rå   r<  rA  rV  rM  r  rO  r  rT  rc  rT  rÐ  rd  rP  rQ  rR  rw  rx  r"  r7  r:  rq  rU  rY  r`  ri  rp  r[   rV   rN   r\  r\  Z  s5  „ Ø4�+×4Ñ4¸JÐRVÔW€KØ*�[×*Ñ*Ð2KÐW[Ô\€NØ+�k×+Ñ+Ð3MÐY]Ô^€OØ0ˆ{×0Ñ0Ó2€HØ(�×(Ñ(Ð0DÐPTÔU€IØ"ˆ[×"Ñ"¨TÔ2€FÙ0Ð8HÈtÐ_cÔd€OØ1˜×1Ñ1Ð9MÐY]Ô^ÐØ6�[×6Ñ6Ó8€NØ
+ˆ+×
+Ñ
+Ó
-€CØ/ˆk×/Ñ/Ó1€GØ0ˆ{×0Ñ0Ó2€HØ4�;×4Ñ4Ó6€LØ3�+×3Ñ3Ó5€K÷
ñ 
ò
ò*ò.òEòòòórV   r\  c                   ó   — e Zd ZdZ ej
                  «       Z ej
                  «       Z ej
                  «       Z ej
                  «       Z	 ej
                  «       Z
 ej
                  «       Z ej                  ddd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej$                  d	d
ddd¬«      Z G d„ dej*                  «      Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚShipperTripListSerializerzGShipper trip list with pickup/dropoff, transporter, and driver details.úshipment.pickup_scheduled_atT©r  r  r£   úshipment.cargo_typer  zshipment.weightzshipment.vehicle_type_requiredzshipment.distance_kmrj   r©  )r  r®  r¯  r  r£   c                   óN   — e Zd Z eej
                  j                  «      g d¢z   Zy)úShipperTripListSerializer.Meta)
r  ÚdropoffrS  rE  rF  rH  rK  r&  Úindividual_driverÚassigned_vehicleN)rW   rX   rY   r+  r\  r"  r   r[   rV   rN   r"  r‚  Ã  s#   „ ÙÐ(×-Ñ-×4Ñ4Ó5ò 9
ñ 
‰rV   r"  c                 ó   — t        |d«      S ©NÚreviewrp  r2  s     rN   rq  z,ShipperTripListSerializer.get_shipper_ratingÊ  ó   € Ü�s˜HÓ%Ð%rV   c                 ób   — t        t        |dd «      | j                  j                  d«      «      S ©Nr(  r‹   ©r|  r(  r  rb   r2  s     rN   Úget_transporterz)ShipperTripListSerializer.get_transporterÍ  ó-   € Ü(Ü�C˜¨Ó-Ø�L‰L×Ñ˜YÓ'ó
ð 	
rV   c                 ób   — t        t        |dd «      | j                  j                  d«      «      S ©Nr&  r‹   rŒ  r2  s     rN   Úget_assigned_driverz-ShipperTripListSerializer.get_assigned_driverÓ  ó.   € Ü(Ü�CÐ*¨DÓ1Ø�L‰L×Ñ˜YÓ'ó
ð 	
rV   c                 óx  — t        |dd«      }|r%t        || j                  j                  d«      «      S t        |dd«      }|rt        |dd«      nd}t        |dd«      }|t        j
                  j                  t        j
                  j                  fv r%t        || j                  j                  d«      «      S y)zHExecuting driver: assigned_driver when set, else individual transporter.r&  Nr‹   r(  r�  rÂ   ©r(  r|  r  rb   r   rç   r  ÚTRANSPORTER_DRIVER©rG   r3  Úassignedr(  râ   rÂ   s         rN   Úget_individual_driverz/ShipperTripListSerializer.get_individual_driverÙ  s¬   € ä˜3Ð 1°4Ó8ˆÙÜ,¨X°t·|±|×7GÑ7GÈ	Ó7RÓSÐSÜ˜c =°$Ó7ˆÙGR”'˜+Ð'<¸dÔCÐX\ˆÜ˜w¨¸Ó=ˆØÜ×*Ñ*×1Ñ1Ü×*Ñ*×=Ñ=ð
ñ 
ô -¨[¸$¿,¹,×:JÑ:JÈ9Ó:UÓVÐVØrV   c                 óÐ   — | j                   j                  d«      }t        |t        «      r&|j                  |j                  «      }t        |«      S t        |«      }t        |«      S ©NÚassigned_vehicles_by_trip_id©r  rb   r9   r°  rÿ   Úresolve_trip_assigned_vehicleÚvehicle_public_summary©rG   r3  Úcacher“   s       rN   Úget_assigned_vehiclez.ShipperTripListSerializer.get_assigned_vehicleè  óW   € Ø—‘× Ñ Ð!?Ó@ˆÜ�eœTÔ"Ø—i‘i §¡Ó'ˆGô & gÓ.Ð.ô 4°CÓ8ˆGÜ% gÓ.Ð.rV   c                 ó.   — t        t        |dd «      «      S r1  ©r„  r(  r2  s     rN   Ú
get_pickupz$ShipperTripListSerializer.get_pickupð  ó   € Ü"¤7¨3°
¸DÓ#AÓBÐBrV   c                 ó.   — t        t        |dd «      «      S r1  ©r†  r(  r2  s     rN   Úget_dropoffz%ShipperTripListSerializer.get_dropoffó  ó   € Ü#¤G¨C°¸TÓ$BÓCÐCrV   N)rW   rX   rY   rZ   r	   rV  r(  r&  r„  r…  r  rƒ  r  rS  rå   rE  rF  rH  rÄ  rK  r\  r"  rq  r�  r‘  r˜  r¡  r¥  r©  r[   rV   rN   r}  r}  ­  s  „ ÙQà3�+×3Ñ3Ó5€KØ7�k×7Ñ7Ó9€OØ9˜×9Ñ9Ó;ÐØ8�{×8Ñ8Ó:ÐØ.ˆ[×.Ñ.Ó0€FØ/ˆk×/Ñ/Ó1€GØ3˜+×3Ñ3Ø-¸È$ôÐð '�×&Ñ&Ð.CÈtÔT€JØ"ˆ[×"Ñ"Ð*;ÀtÔL€FØ1˜K×1Ñ1Ø/¸4ôÐð +�+×*Ñ*Ø%°"ÀQØ 4ô€Kô

Ð!×&Ñ&ô 
ò&ò
ò
òò/òCóDrV   r}  rÔ  c                 óâ  — t        | «      }|si S |D �ch c]  }|j                  sŒ|j                  ’Œ }}|si S t        t        j                  j	                  |¬«      j                  dddddddd	d
dd«      j                  d«      «      }i }i }|D ]N  }|j                  |j                  f}||vr|||<   |j                  �Œ1|j                  |vsŒ@|||j                  <   ŒP i }	|D ]�  }
t        |
dd«      xs t        |
dd«      }t        |
dd«      }|r|sŒ1|j                  ||j                  f«      }|€ |j                  |k(  r|j                  |«      }|€Œs||	|
j                  <   Œƒ |	S c c}w )zFMap trip.id -> Vehicle with a single query (avoids N+1 on trip lists).)Úowner_id__inrÿ   rÅ  rÐ  rÆ  rÇ  rÈ  rÉ  r  r8  r7  rÌ   r'  Nr&  r(  r  )r+  r  r   rÑ   rÒ   rF  r*  rÅ  rÐ  r(  rb   rÿ   )ÚtripsÚ	trip_listÚtÚ	owner_idsr  Úby_owner_driverÚby_owner_unassignedr“   rà  ÚresultrW  r   r  s                rN   Úresolve_trips_assigned_vehiclesr´  ÷  s¦  € ä�U“€IÙØˆ	à+4ÖI a¸×8HÓ8H�×!Ó!ÐI€IÐIÙØˆ	äÜ�‰×Ñ¨IÐÓ6ß	‰ØØØ ØØØ!ØØØØØó

÷ 
‰�-Ó	 ó€Hð" €OØÐØò <ˆØ×Ñ ×!;Ñ!;Ð<ˆØ�oÑ%Ø#*ˆO˜CÑ Ø×%Ñ%Ñ-°'×2BÑ2BÐJ]Ò2]Ø4;Ð × 0Ñ 0Ò1ð<ð €FØò 	&ˆÜ˜Ð0°$Ó7Ò]¼7À4ÈÐX\Ó;]ˆÜ  Ð'7¸Ó>ˆÙ™^ØØ!×%Ñ% ~°v·y±yÐ&AÓBˆØˆ?˜vŸy™y¨NÒ:Ø)×-Ñ-¨nÓ=ˆGØÑØ%ˆF�4—7‘7ŠOð	&ð €MùòS Js
   ”E,¦E,c                 óN   — t        | g«      j                  t        | dd«      «      S )zFVehicle assigned to the trip's executing driver (fleet or individual).rÿ   N)r´  rb   r(  )rW  s    rN   r�  r�  )  s#   € ä*¨D¨6Ó2×6Ñ6´w¸tÀTÈ4Ó7PÓQÐQrV   c           
      ó6  — | syt        | d«      r| j                  «       ng }| j                  | j                  | j                  xs	 |r|d   nd|| j
                  xs dj                  «       | j                  | j                  | j                  | j                  dœ	S )zKCompact vehicle card for trip list/detail (avoids heavy VehicleSerializer).Nrê  r   r5   )	rÿ   rÈ  rÆ  rÇ  r  rÉ  r8  r7  rÐ  )rë  rê  rÿ   rÈ  rÆ  r  r>   rÉ  r8  r7  rÐ  )r“   rì  s     rN   rž  rž  .  s�   € áØÜ#*¨7°KÔ#@ˆG×ÑÔÀb€Eà�j‰jØ&×:Ñ:Ø×,Ñ,ÒK¹U°°q²ÈØØ×)Ñ)Ò/¨R×6Ñ6Ó8Ø ×.Ñ.Ø×*Ñ*Ø×&Ñ&Ø%×8Ñ8ñ
ð 
rV   c                   ó   — e Zd Z ed¬«      Z ej                  dd¬«      Z ej                  «       Z	 e
d¬«      Z eddd¬«      Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z G d„ d«      Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚTripDetailSerializerTr”  r]  r  r^  r_  c                   ó   — e Zd ZeZg d¢Zy)úTripDetailSerializer.Meta)rÿ   r:  rƒ  rO  rM  rb  Úaccepted_bidr(  rw  rx  r  rc  rd  rP  rQ  rR  re  rf  rg  r  rÌ   Nrh  r[   rV   rN   r"  rº  L  s   „ Øˆò
‰rV   r"  c                 ó¢   — t        | j                  j                  d«      «      }|syt        t	        |dd «      |v xs t	        |dd «      |v «      S rj  r5  r6  s      rN   r7  z%TripDetailSerializer.get_is_favouriteS  rk  rV   c                 ó$   — | j                  |«      S rQ   r9  r2  s     rN   r:  z$TripDetailSerializer.get_is_favorite\  r;  rV   c                 ó   — t        |d«      S rn  rp  r2  s     rN   rq  z'TripDetailSerializer.get_shipper_rating_  rr  rV   c                 ó.   — t        t        |dd «      «      S r1  r2  r2  s     rN   rU  z!TripDetailSerializer.get_currencyb  r3  rV   c                 ó<   — 	 t        |dd «      S # t        $ r Y y w xY wru  rX  r2  s     rN   rY  z!TripDetailSerializer._get_pod_obje  rv  rw  c                 óv   — | j                  |«      }|r&t        || j                  j                  d«      ¬«      S y r[  r]  r_  s      rN   r`  zTripDetailSerializer.get_podk  ra  rV   c                 ó  — | j                  |«      }|sy t        |dd «      }|r|j                  «       j                  «       nd }|rE|j                  r9t        | j                  j                  d«      |j                  j                  «      S y rc  re  rh  s        rN   ri  z TripDetailSerializer.get_pod_urlq  rj  rV   c                 ó4  — | j                  |«      }|sg S t        |dd «      }|sg S g }|j                  «       D ]\  }|j                  sŒt	        | j
                  j                  d«      |j                  j                  «      }|sŒL|j                  |«       Œ^ |S rc  rl  rm  s          rN   rp  z!TripDetailSerializer.get_pod_urls{  rq  rV   N)rW   rX   rY   r7  rƒ  r	   r  rO  rV  rM  r$  r»  rT  rc  rd  rP  rQ  rR  rw  rx  r"  r7  r:  rq  rU  rY  r`  ri  rp  r[   rV   rN   r¸  r¸  ?  sß   „ Ù!¨DÔ1€HØ(�×(Ñ(Ð0DÐPTÔU€IØ0ˆ{×0Ñ0Ó2€HÙ$¨tÔ4€LÙ0Ð8HÈtÐ_cÔd€OØ6�[×6Ñ6Ó8€NØ
+ˆ+×
+Ñ
+Ó
-€CØ/ˆk×/Ñ/Ó1€GØ0ˆ{×0Ñ0Ó2€HØ4�;×4Ñ4Ó6€LØ3�+×3Ñ3Ó5€K÷
ñ 
ò
ò*ò.òEòòòórV   r¸  c                   óZ  — e Zd ZdZ ej
                  «       Z ej
                  «       Z ej
                  «       Z ej
                  «       Z	 ej
                  «       Z
 ej
                  «       Z ej                  ddd¬«      Z G d„ dej                  «      Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zy)ÚShipperTripDetailSerializerzRShipper trip detail: shipper_rating = whether the shipper submitted a trip review.r~  Tr  c                   óN   — e Zd Z eej
                  j                  «      g d¢z   Zy)ú ShipperTripDetailSerializer.Meta)r  rƒ  rS  r&  r„  r…  N©rW   rX   rY   r+  r¸  r"  r   r[   rV   rN   r"  rÇ  ˜  s#   „ ÙÐ*×/Ñ/×6Ñ6Ó7ò ;
ñ 
‰rV   r"  c                 ó   — t        |d«      S r‡  rp  r2  s     rN   rq  z.ShipperTripDetailSerializer.get_shipper_ratingž  r‰  rV   c                 ób   — t        t        |dd «      | j                  j                  d«      «      S r‹  rŒ  r2  s     rN   r�  z+ShipperTripDetailSerializer.get_transporter¡  rŽ  rV   c                 ób   — t        t        |dd «      | j                  j                  d«      «      S r�  rŒ  r2  s     rN   r‘  z/ShipperTripDetailSerializer.get_assigned_driver§  r’  rV   c                 óx  — t        |dd «      }|r%t        || j                  j                  d«      «      S t        |dd «      }|rt        |dd «      nd }t        |dd «      }|t        j
                  j                  t        j
                  j                  fv r%t        || j                  j                  d«      «      S y )Nr&  r‹   r(  r�  rÂ   r”  r–  s         rN   r˜  z1ShipperTripDetailSerializer.get_individual_driver­  s¬   € Ü˜3Ð 1°4Ó8ˆÙÜ,¨X°t·|±|×7GÑ7GÈ	Ó7RÓSÐSÜ˜c =°$Ó7ˆÙGR”'˜+Ð'<¸dÔCÐX\ˆÜ˜w¨¸Ó=ˆØÜ×*Ñ*×1Ñ1Ü×*Ñ*×=Ñ=ð
ñ 
ô -¨[¸$¿,¹,×:JÑ:JÈ9Ó:UÓVÐVØrV   c                 óÐ   — | j                   j                  d«      }t        |t        «      r&|j                  |j                  «      }t        |«      S t        |«      }t        |«      S rš  rœ  rŸ  s       rN   r¡  z0ShipperTripDetailSerializer.get_assigned_vehicle»  r¢  rV   c                 ó.   — t        t        |dd «      «      S r1  r¤  r2  s     rN   r¥  z&ShipperTripDetailSerializer.get_pickupÃ  r¦  rV   c                 ó.   — t        t        |dd «      «      S r1  r¨  r2  s     rN   r©  z'ShipperTripDetailSerializer.get_dropoffÆ  rª  rV   N)rW   rX   rY   rZ   r	   rV  r(  r&  r„  r…  r  rƒ  r  rS  r¸  r"  rq  r�  r‘  r˜  r¡  r¥  r©  r[   rV   rN   rÅ  rÅ  Œ  s¹   „ Ù\Ø3�+×3Ñ3Ó5€KØ7�k×7Ñ7Ó9€OØ9˜×9Ñ9Ó;ÐØ8�{×8Ñ8Ó:ÐØ.ˆ[×.Ñ.Ó0€FØ/ˆk×/Ñ/Ó1€GØ3˜+×3Ñ3Ø-¸È$ôÐô
Ð#×(Ñ(ô 
ò&ò
ò
òò/òCóDrV   rÅ  c                   óþ   — e Zd Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z	 G d„ de
j                  «      Zd„ Zd„ Zd„ Zd„ Zd„ Zy)	ÚTransporterTripDetailSerializerc                   óN   — e Zd Z eej
                  j                  «      g d¢z   Zy)ú$TransporterTripDetailSerializer.Meta)rs  r&  r…  r   rþ   NrÈ  r[   rV   rN   r"  rÓ  Ñ  s#   „ ÙÐ*×/Ñ/×6Ñ6Ó7ò ;
ñ 
‰rV   r"  c                 óH   — t        t        |dd «      dd «      }t        |«      S )Nrƒ  rs  )r(  rt  )rG   r3  rs  s      rN   r�  z+TransporterTripDetailSerializer.get_shipperÖ  s$   € Üœ' # z°4Ó8¸)ÀTÓJˆÜ% gÓ.Ð.rV   c                 óˆ  — t        |dd «      }|sy t        |dd «      }t        |dd «      }t        | j                  j                  d«      «      }|j                  |j
                  |j                  |j                  t        |dd«      xs dt        |dd «      t        |dd«      xs d|j                  |v |j                  |v d	œ	S )
Nr&  rÁ   r�  r‹   rÀ   r5   rÂ   rÃ   rv  )r(  ry  r  rb   rÿ   r¶   r½   r¾   )rG   r3  ÚdrÁ   râ   rz  s         rN   r‘  z3TransporterTripDetailSerializer.get_assigned_driverÚ  s·   € Ü�CÐ*¨DÓ1ˆÙØÜ�q˜& $Ó'ˆÜ˜!Ð2°DÓ9ˆÜ6°t·|±|×7GÑ7GÈ	Ó7RÓSˆà—$‘$Ø—W‘WØŸ,™,ØŸ™Ü˜T 7¨BÓ/Ò5°2Ü# G¨^¸TÓBÜ# G¨^¸RÓ@ÒFÀBØŸD™D G˜OØŸ4™4 7˜?ñ

ð 
	
rV   c                 ó`   — t        |«      }|sy t        || j                  ¬«      j                  S )N)r  )r�  r1  r  rH   )rG   r3  r“   s      rN   r¡  z4TransporterTripDetailSerializer.get_assigned_vehicleí  s)   € Ü/°Ó4ˆÙØÜ  °$·,±,Ô?×DÑDÐDrV   c                 ó€   — 	 |j                   j                  j                  }|rt        |«      S d S # t        $ r Y y w xY wrQ   )r(  r�  r   r:   rA   ©rG   r3  r:  s      rN   Ú	get_tc_idz)TransporterTripDetailSerializer.get_tc_idó  s?   € ð	Ø—‘×3Ñ3×9Ñ9ˆAÙ”3�q“6Ð( DÐ(øÜò 	Ùð	ús   ‚,1 ¯1 ±	=¼=c                 ón   — 	 |j                   j                  j                  }|xs d S # t        $ r Y y w xY wrQ   )r(  r�  rþ   rA   rÙ  s      rN   Úget_tc_u_idz+TransporterTripDetailSerializer.get_tc_u_idú  s8   € ð	Ø—‘×3Ñ3×;Ñ;ˆAØ’9˜ÐøÜò 	Ùð	ús   ‚%( ¨	4³4N)rW   rX   rY   r	   rV  rs  r&  r…  r   rþ   r¸  r"  r�  r‘  r¡  rÚ  rÜ  r[   rV   rN   rÑ  rÑ  Ê  s€   „ Ø/ˆk×/Ñ/Ó1€GØ7�k×7Ñ7Ó9€OØ8�{×8Ñ8Ó:ÐØ-ˆK×-Ñ-Ó/€EØ/ˆk×/Ñ/Ó1€Gô
Ð#×(Ñ(ô 
ò
/ò
ò&EòórV   rÑ  c                   ób   — e Zd ZdZ ej
                  «       Z G d„ dej                  «      Zd„ Z	y)Ú"TransporterCompletedTripSerializerz@Completed-trip list: includes settlement summary for payment UI.c                   óL   — e Zd Z eej
                  j                  «      dgz   Zy)ú'TransporterCompletedTripSerializer.MetaÚpaymentN)rW   rX   rY   r+  rÑ  r"  r   r[   rV   rN   r"  rà  	  s    „ ÙÐ5×:Ñ:×AÑAÓBÀiÀ[ÑP‰rV   r"  c                 ó   — t        |«      S rQ   r,   r2  s     rN   Úget_paymentz.TransporterCompletedTripSerializer.get_payment
	  s   € Ü6°sÓ;Ð;rV   N)
rW   rX   rY   rZ   r	   rV  rá  rÑ  r"  rã  r[   rV   rN   rÞ  rÞ  	  s/   „ ÙJà/ˆk×/Ñ/Ó1€GôQÐ.×3Ñ3ô Qó<rV   rÞ  c                   ó8  — e Zd Z ej                  dd¬«      Z ej                  «       Z ej                  «       Z ej                  «       Z	 ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z G d„ d«      Zd	„ Zd
„ Zd„ Zy)ÚMessageSerializerzsender.emailTr  zconversation.idzconversation.shipment_idzconversation.trip_idc                   ó    — e Zd ZeZg d¢ZddgZy)úMessageSerializer.Meta)rÿ   Úconversation_idr˜  Útrip_idÚsenderÚsender_emailÚsender_nameÚsender_account_typerÞ  Úmessage_typeÚ
voice_fileÚ	voice_urlr  rê  r  N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  rç  	  s   „ Øˆò
ˆð % lÐ3ÑrV   r"  c                 óš   — |j                   }|sy|j                  › d|j                  › �j                  «       }|xs |j                  xs dS ©Nr5   rú   )rê  r½   r¾   r>   r¶   )rG   r3  rê  r8   s       rN   Úget_sender_namez!MessageSerializer.get_sender_name+	  sL   € Ø—‘ˆÙØØ×#Ñ#Ð$ A f×&6Ñ&6Ð%7Ð8×>Ñ>Ó@ˆØÒ+˜Ÿ™Ò*¨Ð+rV   c                 óŽ   — |j                   }|sy t        |dd «      }|�|j                  S t        |dd «      }|�|j                  S y )Nr0  r�  )rê  r(  rÂ   )rG   r3  rê  r0  r�  s        rN   Úget_sender_account_typez)MessageSerializer.get_sender_account_type2	  sW   € Ø—‘ˆÙØÜ! &Ð*;¸TÓBˆØÐ&Ø"×/Ñ/Ð/Ü% fÐ.CÀTÓJÐØÐ*Ø&×3Ñ3Ð3ØrV   c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y rt  )rï  r/   r  rb   rR   r2  s     rN   Úget_voice_urlzMessageSerializer.get_voice_url>	  s2   € Ø�>Š>Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈÏÉ×I[ÑI[Ó\Ð\ØrV   N)rW   rX   rY   r	   rä   rë  rV  rì  rí  rð  rT  rè  r˜  ré  r"  ró  rõ  r÷  r[   rV   rN   rå  rå  	  s¢   „ Ø)�;×)Ñ)°È4ÔP€LØ3�+×3Ñ3Ó5€KØ;˜+×;Ñ;Ó=ÐØ1�×1Ñ1Ó3€IØ.�k×.Ñ.Ð6GÐSWÔX€OØ*�+×*Ñ*Ð2LÐX\Ô]€KØ&ˆk×&Ñ&Ð.DÐPTÔU€G÷4ñ 4ò&,ò
órV   rå  c                   ó&   — e Zd Z G d„ d«      Zd„ Zy)ÚMessageCreateSerializerc                   ó   — e Zd ZeZg d¢Zy)úMessageCreateSerializer.Meta)rÞ  rî  rï  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  rû  E	  s   „ ØˆÚ7‰rV   r"  c                 ó°  — |j                  d«      xs t        j                  j                  }|j                  d«      xs dj	                  «       }|j                  d«      }|t        j                  j
                  k(  r |st        j                  ddi«      ‚||d<   |S |st        j                  ddi«      ‚|rt        j                  ddi«      ‚||d<   |S )Nrî  rÞ  r5   rï  z*Voice file is required for VOICE messages.z#Text is required for TEXT messages.z,Voice file is not allowed for TEXT messages.)rb   r   ÚMessageTypeÚTEXTr>   ÚVOICEr	   r;   )rG   rK  Úmsg_typerÞ  Úvoices        rN   r´   z MessageCreateSerializer.validateI	  sâ   € Ø—9‘9˜^Ó,ÒH´×0CÑ0C×0HÑ0HˆØ—	‘	˜&Ó!Ò' R×.Ñ.Ó0ˆØ—	‘	˜,Ó'ˆà”w×*Ñ*×0Ñ0Ò0ÙÜ!×1Ñ1Ø!Ð#OÐPóð ð !ˆE�&‰Mð ˆñ Ü!×1Ñ1ØÐBÐCóð ñ Ü!×1Ñ1Ø!Ð#QÐRóð ð !ˆE�&‰MØˆrV   N)rW   rX   rY   r"  r´   r[   rV   rN   rù  rù  D	  s   „ ÷8ñ 8órV   rù  c                   ó  — e Z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j                  d	dd¬«      Z	 ej                  d
dd¬«      Z ej                  «       Z ej                  ddd¬«      Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z G d„ d«      Zd„ Zd„ Zd„ Zd„ Zd„ Zy)ÚAdminConversationListSerializerzshipment.unique_idTN)r  r  rí   zshipment.pickup_addressr5   zshipment.delivery_addressr€  ztrip.statuszshipper.emailr%  c                   ó   — e Zd ZeZg d¢Zy)ú$AdminConversationListSerializer.Meta)rÿ   rƒ  Úshipment_unique_idr;  r@  rE  rW  Útrip_statusrs  Úshipper_emailÚshipper_namer(  r)  r*  r&  Úmessages_countÚlatest_messager  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  r  p	  s   „ Øˆò
‰rV   r"  c                 óÊ   — |j                   sy|j                   j                  › d|j                   j                  › �j                  «       }|xs |j                   j                  S rò  ©rs  r½   r¾   r>   r¶   )rG   r3  r8   s      rN   Úget_shipper_namez0AdminConversationListSerializer.get_shipper_name‡	  sP   € Ø�{Š{ØØ—+‘+×(Ñ(Ð)¨¨3¯;©;×+@Ñ+@Ð*AÐB×HÑHÓJˆØÒ(�s—{‘{×(Ñ(Ð(rV   c                 ó,  — |j                   syt        |j                   dd «      }|r|j                  r|j                  S |j                   j                  › d|j                   j                  › �j                  «       }|xs |j                   j                  S )Nr5   r�  rú   )r(  r(  rÃ   r½   r¾   r>   r¶   )rG   r3  Útpr8   s       rN   r/  z4AdminConversationListSerializer.get_transporter_name�	  sv   € Ø�ŠØÜ�S—_‘_Ð&;¸TÓBˆÙ�"—/’/Ø—?‘?Ð"Ø—/‘/×,Ñ,Ð-¨Q¨s¯©×/HÑ/HÐ.IÐJ×PÑPÓRˆØÒ,�s—‘×,Ñ,Ð,rV   c                 ó  — |j                   r|j                   j                  sy |j                   j                  }|j                  › d|j                  › �j	                  «       xs |j
                  }|j                  |j
                  |dœS )Nrú   )rÿ   r¶   r8   )rW  r&  r½   r¾   r>   r¶   rÿ   )rG   r3  rÖ  r8   s       rN   r‘  z3AdminConversationListSerializer.get_assigned_driver–	  sf   € Ø�xŠx˜sŸx™x×7Ò7ØØ�H‰H×$Ñ$ˆØ—,‘,�˜q §¡ Ð.×4Ñ4Ó6ÒA¸!¿'¹'ˆØ—d‘d Q§W¡W°dÑ;Ð;rV   c                 ó6   — |j                   j                  «       S rQ   )ÚmessagesÚcountr2  s     rN   Úget_messages_countz2AdminConversationListSerializer.get_messages_count�	  s   € Ø�|‰|×!Ñ!Ó#Ð#rV   c                 óÎ   — |j                   j                  d«      j                  «       }|sy |j                  |j                  |j
                  |j                  |j                  dœS )Nz-created_at)rÿ   Ú	sender_idrî  rÞ  r  )r  r*  rG  rÿ   r  rî  rÞ  r  )rG   r3  Úmsgs      rN   Úget_latest_messagez2AdminConversationListSerializer.get_latest_message 	  sT   € Ø�l‰l×#Ñ# MÓ2×8Ñ8Ó:ˆÙØà—&‘&ØŸ™Ø×,Ñ,Ø—H‘HØŸ.™.ñ
ð 	
rV   )rW   rX   rY   r	   rå   r  r;  r@  rE  r  rä   r  rV  r	  r)  r*  r&  r
  r  r"  r  r/  r‘  r  r  r[   rV   rN   r  r  b	  s#  „ Ø.˜×.Ñ.Ð6JÐVZÐdhÔiÐØ*�[×*Ñ*Ð2KÐW[ÐegÔh€NØ,�{×,Ñ,Ð4OÐ[_ÐikÔlÐØ&�×&Ñ&Ð.CÈtÐ]_Ô`€JØ'�+×'Ñ'¨}ÈÐVZÔ[€KØ*�K×*Ñ*°/ÈTÐ[]Ô^€MØ4�;×4Ñ4Ó6€LØ.˜×.Ñ.Ð6IÐUYÐceÔfÐØ8�{×8Ñ8Ó:ÐØ7�k×7Ñ7Ó9€OØ6�[×6Ñ6Ó8€NØ6�[×6Ñ6Ó8€N÷
ñ 
ò.)ò-ò<ò$ó

rV   r  c                   óJ   — e Zd Z edd¬«      Z G d„ dej                  «      Zy)Ú!AdminConversationDetailSerializerT©r0  r  c                   ó@   — e Zd Zej                  j
                  dgz   Zy)ú&AdminConversationDetailSerializer.Metar  N)rW   rX   rY   r  r"  r   r[   rV   rN   r"  r  °	  s   „ Ø0×5Ñ5×<Ñ<À
¸|ÑK‰rV   r"  N)rW   rX   rY   rå  r  r  r"  r[   rV   rN   r  r  ­	  s#   „ Ù  d°dÔ;€HôLÐ.×3Ñ3õ LrV   r  c                   óH   — e Zd Z ej                  «       Z G d„ d«      Zd„ Zy)ÚPODPhotoSerializerc                   ó   — e Zd ZeZg d¢Zy)úPODPhotoSerializer.Meta)rÿ   rg  Ú	image_urlr  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  r"  ¸	  s   „ ØˆÚ;‰rV   r"  c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y rt  )rg  r/   r  rb   rR   r2  s     rN   Úget_image_urlz PODPhotoSerializer.get_image_url¼	  s0   € Ø�9Š9Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈÏÉÏÉÓWÐWØrV   N)rW   rX   rY   r	   rV  r#  r"  r%  r[   rV   rN   r   r   µ	  s!   „ Ø1�×1Ñ1Ó3€I÷<ñ <órV   r   c                   ó\   — e Zd Z edd¬«      Z ej                  «       Z G d„ d«      Zd„ Z	y)ÚPODSerializerTr  c                   ó   — e Zd ZeZg d¢Zy)úPODSerializer.Meta)	rÿ   Úreceiver_nameÚreceiver_signatureÚsignature_urlrB  rC  Údelivered_atrd  r  N)rW   rX   rY   r   r  r   r[   rV   rN   r"  r)  Æ	  s   „ Øˆò X‰rV   r"  c                 óŽ   — |j                   r9t        | j                  j                  d«      |j                   j                  «      S y rt  )r+  r/   r  rb   rR   r2  s     rN   Úget_signature_urlzPODSerializer.get_signature_urlÊ	  s6   € Ø×!Ò!Ü+¨D¯L©L×,<Ñ,<¸YÓ,GÈ×I_ÑI_×IcÑIcÓdÐdØrV   N)
rW   rX   rY   r   rd  r	   rV  r,  r"  r/  r[   rV   rN   r'  r'  Â	  s/   „ Ù T°TÔ:€FØ5�K×5Ñ5Ó7€M÷Xñ XórV   r'  c                 óî  — | syg }	 | j                   j                  «       }|D ]}  }|j                  r t	        ||j                  j
                  «      nd}|j                  |j                  |j                  r|j                  j
                  nd|||j                  dœ«       Œ | j                  r t	        || j                  j
                  «      nd}|r|d   d   nd}| j                  | j                  | j                  r| j                  j
                  nd|| j                  | j                  | j                  |||D �cg c]  }|d   sŒ	|d   ‘Œ c}| j                  dœS # t        $ r g }Y �ŒMw xY wc c}w )z2Serialize POD with photos and absolute media URLs.N)rÿ   rg  r#  rR   r  r   r#  )rÿ   r*  r+  r,  rB  rC  r-  rd  rQ  rR  r  )rd  rf  rA   rg  r/   rR   r®  rÿ   r  r+  r*  rB  rC  r-  )rP  r‹   Úphotos_listrd  ro  rR   Úsig_urlÚfirst_photo_urls           rN   r^  r^  Ð	  sV  € áØØ€KðØ—‘—‘Ó!ˆð ò ˆØ@AÇÂÔ& w°·±·±Ô<ÈTˆØ×ÑØ—$‘$Ø$%§G¢G�Q—W‘W—[’[°ØØØŸ,™,ñ
õ 	ðð PS×OeÒOeÔ& w°×0FÑ0F×0JÑ0JÔKÐko€GÙ5@�k !‘n [Ò1Àd€Oà�f‰fØ×*Ñ*Ø<?×<RÒ<R˜c×4Ñ4×8Ò8ÐX\Ø Ø×(Ñ(Ø×(Ñ(Ø×(Ñ(ØØ"Ø-8ÖK¨¸A¸k»N�Q�{“^ÒKØ—n‘nñð øô ò Ø‹ðüò. Ls   ‡E  Ä>
E2Å	E2Å E/Å.E/c                   ó    — e Zd Z G d„ d«      Zy)ÚWalletSerializerc                   ó   — e Zd ZeZg d¢ZeZy)úWalletSerializer.Meta)ÚbalancerM  rÌ   N)rW   rX   rY   r'   r  r   r!  r[   rV   rN   r"  r7  ö	  s   „ ØˆÚ6ˆØ!ÑrV   r"  NrR  r[   rV   rN   r5  r5  õ	  ó   „ ÷"ò "rV   r5  c                   ó    — e Zd Z G d„ d«      Zy)ÚPaymentSerializerc                   ó   — e Zd ZeZg d¢ZeZy)úPaymentSerializer.Meta)rÿ   rW  ÚpayerÚpayeeÚmethodr+  rM  r  Úprovider_refÚmetadatar  rÌ   N)rW   rX   rY   r)   r  r   r!  r[   rV   rN   r"  r=  ý	  ó   „ Øˆò
ˆð "ÑrV   r"  NrR  r[   rV   rN   r;  r;  ü	  ó   „ ÷"ò "rV   r;  c                   óH   — e Zd Z ej                  «       Z G d„ d«      Zd„ Zy)ÚInvoiceSerializerc                   ó   — e Zd ZeZg d¢ZeZy)úInvoiceSerializer.Meta)rÿ   r`  rW  rs  Ú
line_itemsÚtaxÚtotalrM  r  rá  Úis_archivedÚarchived_atÚdue_dateÚ	issued_atr  N)rW   rX   rY   r*   r  r   r!  r[   rV   rN   r"  rH  	
  rC  rV   r"  c                 óŠ   — t        |dd «      }|�|j                  S t        |dd «      }|�t        |dd «      nd }t        |«      S )Nrá  rW  rƒ  )r(  rM  r&   )rG   r3  rá  rW  rƒ  s        rN   rU  zInvoiceSerializer.get_currency
  sP   € Ü˜#˜y¨$Ó/ˆØÐØ×#Ñ#Ð#Ü�s˜F DÓ)ˆØ6:Ð6F”7˜4 ¨TÔ2ÈDˆÜ$ XÓ.Ð.rV   N)rW   rX   rY   r	   rV  rM  r"  rU  r[   rV   rN   rF  rF  
  s!   „ Ø0ˆ{×0Ñ0Ó2€H÷"ñ "ó/rV   rF  c                   ó    — e Zd Z G d„ d«      Zy)ÚLedgerEntrySerializerc                   ó   — e Zd ZeZg d¢ZeZy)úLedgerEntrySerializer.Meta)rÿ   r+  Ú
entry_typerW  rá  ÚnoteÚidempotency_keyr  N)rW   rX   rY   r(   r  r   r!  r[   rV   rN   r"  rT  
  s   „ Øˆò
ˆð "ÑrV   r"  NrR  r[   rV   rN   rR  rR  
  s   „ ÷"ò "rV   rR  c                   ó    — e Zd Z G d„ d«      Zy)ÚWithdrawalRequestSerializerc                   ó   — e Zd ZeZg d¢ZeZy)ú WithdrawalRequestSerializer.Meta)rÿ   r+  rM  r  rV  r  rÌ   N)rW   rX   rY   r+   r  r   r!  r[   rV   rN   r"  r[  $
  s   „ Ø!ˆÚ[ˆØ!ÑrV   r"  NrR  r[   rV   rN   rY  rY  #
  r9  rV   rY  c                   óî   — e Zd ZdZ ej
                  ej                  j                  dfej                  j                  dfej                  j                  dfej                  j                  dfg¬«      Zy)ÚTripPaySerializerz5Wallet, card (driver confirms), COD, or credit terms.ÚWalletÚCardÚCashzCredit termsr�   N)rW   rX   rY   rZ   r	   ræ   r)   ÚMethodÚWALLETÚCARDÚCASHÚCREDITr@  r[   rV   rN   r]  r]  *
  sd   „ Ù?Ø$ˆ[×$Ñ$à�^‰^×"Ñ" HÐ-Ø�^‰^× Ñ  &Ð)Ø�^‰^× Ñ  &Ð)Ø�^‰^×"Ñ" NÐ3ð	
ô�FrV   r]  c                   ó°   — e Zd Z ej                  dd¬«      Z ej                  dddd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z	y	)
ÚTripReviewCreateSerializerr.   é   ©r¨  Ú	max_valueFT)r›   r£   r¨  rj  r‹  rš   N)
rW   rX   rY   r	   rT  Útransporter_ratingÚdriver_ratingrý  rå   Úcommentr[   rV   rN   rg  rg  6
  sY   „ Ø1˜×1Ñ1¸AÈÔKÐØ,�K×,Ñ,°eÈÐXYÐefÔg€MØ(�×(Ñ(°%ÀDÔI€IØ#ˆk×#Ñ#¨UÀÔE�GrV   rg  c                   ó    — e Zd Z G d„ d«      Zy)ÚTripReviewSerializerc                   ó   — e Zd ZeZg d¢ZeZy)úTripReviewSerializer.Meta)	rÿ   rW  rs  r(  r   rk  rl  rm  r  N©rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  rq  >
  s   „ Øˆò
ˆð "ÑrV   r"  NrR  r[   rV   rN   ro  ro  =
  rD  rV   ro  c                   óž   — e Zd ZdZ ej
                  «       Z ej
                  «       Z ej                  ddd¬«      Z	 G d„ d«      Z
d„ Zd„ Zy	)
Ú IndividualDriverRatingSerializerz6Shipper review as seen by the rated individual driver.ztrip.shipment.unique_idTr  c                   ó   — e Zd ZeZg d¢ZeZy)ú%IndividualDriverRatingSerializer.Meta)rÿ   rW  rs  r(  r   Úratingrk  rl  rm  r	  r  r  Nrr  r[   rV   rN   r"  rv  Q
  s   „ Øˆò
ˆð "ÑrV   r"  c                 óJ   — |j                   �|j                   S |j                  S rQ   )rl  rk  r2  s     rN   Ú
get_ratingz+IndividualDriverRatingSerializer.get_ratingc
  s&   € Ø×ÑÐ(Ø×$Ñ$Ð$Ø×%Ñ%Ð%rV   c                 óŒ   — |j                   }|j                  › d|j                  › �j                  «       }|xs |j                  S r.  r  )rG   r3  rs  r8   s       rN   r  z1IndividualDriverRatingSerializer.get_shipper_nameh
  sA   € Ø—+‘+ˆØ×$Ñ$Ð% Q w×'8Ñ'8Ð&9Ð:×@Ñ@ÓBˆØÒ$�w—}‘}Ð$rV   N)rW   rX   rY   rZ   r	   rV  rw  r	  rå   r  r"  ry  r  r[   rV   rN   rt  rt  G
  sU   „ Ù@Ø.ˆ[×.Ñ.Ó0€FØ4�;×4Ñ4Ó6€LØ.˜×.Ñ.Ø(ØØôÐ÷"ñ "ò$&ó
%rV   rt  c                   ó\   — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Zy)Ú!TripShipperReviewCreateSerializerr.   rh  ri  FTrš   N)rW   rX   rY   r	   rT  rd  rå   rm  r[   rV   rN   r|  r|  n
  s*   „ Ø-�[×-Ñ-¸ÀQÔG€NØ#ˆk×#Ñ#¨UÀÔE�GrV   r|  c                   ó    — e Zd Z G d„ d«      Zy)ÚTripShipperReviewSerializerc                   ó   — e Zd ZeZg d¢ZeZy)ú TripShipperReviewSerializer.Meta)rÿ   rW  rs  r(  Úreviewerrd  rm  r  N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  r€  t
  s   „ Ø!ˆò
ˆð "ÑrV   r"  NrR  r[   rV   rN   r~  r~  s
  rD  rV   r~  c                   ó    — e Zd Z G d„ d«      Zy)ÚSavedAddressSerializerc                   ó    — e Zd ZeZg d¢Zg d¢Zy)úSavedAddressSerializer.Meta)	rÿ   ÚlabelÚaddress_liner  r  r€  Ú
is_defaultr  rÌ   )rÿ   r  rÌ   N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  r…  ~
  s   „ Øˆò
ˆò >ÑrV   r"  NrR  r[   rV   rN   rƒ  rƒ  }
  s   „ ÷>ò >rV   rƒ  c                   óp   — e Zd Z ej                  dd¬«      Z ej                  dd¬«      Z G d„ d«      Zy)ÚFavoriteTransporterSerializerztransporter.first_nameTr  ztransporter.last_namec                   ó    — e Zd ZeZg d¢ZddgZy)ú"FavoriteTransporterSerializer.Meta)rÿ   r(  r½   r¾   r  rÿ   r  N)rW   rX   rY   r   r  r   r!  r[   rV   rN   r"  rŒ  ‹
  s   „ Ø#ˆÚOˆØ  ,Ð/ÑrV   r"  N)rW   rX   rY   r	   rå   r½   r¾   r"  r[   rV   rN   rŠ  rŠ  ‡
  s8   „ Ø&�×&Ñ&Ð.FÐRVÔW€JØ%�×%Ñ%Ð-DÐPTÔU€I÷0ò 0rV   rŠ  c                   ó2   — e Zd Z ej                  d¬«      Zy)ÚFcmTokenSerializeri   rª  N)rW   rX   rY   r	   rå   Ú	fcm_tokenr[   rV   rN   rŽ  rŽ  ‘
  s   „ Ø%�×%Ñ%°Ô6�IrV   rŽ  c                   ó2   — e Zd ZdZ ej
                  «       Zy)ÚShipmentPreferencesSerializerzIArbitrary JSON preferences stored on ShipperProfile.shipment_preferences.N)rW   rX   rY   rZ   r	   rf  r^  r[   rV   rN   r‘  r‘  •
  s   „ ÙSØ0˜;×0Ñ0Ó2ÑrV   r‘  c                   ól   — e Zd Z ej                  dd ed«      ¬«      Z ej                  ddd¬«      Zy	)
ÚWithdrawalCreateSerializeré   r©  z0.01)r®  r¯  r¨  FTr5   )r›   rœ   rí   N)	rW   rX   rY   r	   rÄ  r   r+  rå   rV  r[   rV   rN   r“  r“  š
  s5   „ Ø%ˆ[×%Ñ%°ÀAÑQXÐY_ÓQ`Ôa€FØ ˆ;× Ñ ¨%¸TÈ2ÔN�DrV   r“  c                 óL   — | j                   }|j                  |j                  dœS )z=Fleet drivers inherit load-type flags from their fleet owner.)rð   rñ   )r�  rð   rñ   )Úfleet_ownerÚowner_profiles     rN   Ú_fleet_owner_load_type_kwargsr˜   
  s)   € à×3Ñ3€Mà+×>Ñ>Ø×$Ñ$ñð rV   c                   ód  — e Zd Z ej                  «       Z ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
 ej                  ddd¬«      Z eddd¬«      Z ej                   ej                  «       ddd	¬
«      Zd„ Zd„ Zy)ÚFleetDriverCreateSerializerTrh   r—   Frš   rë   rì   rî   z¶Optional KYC docs (same as individual driver): DRIVER_LICENSE, PASSPORT_COPY, PERMIT, COUNTRY_GCC, optional NOC; PASSPORT_COPY requires passport_number; each may include expiry_date.rÀ  c                 óV   — |sy t        || j                  j                  d«      d¬«      S )Nr‹   r�   r‘   )r”   r  rb   )rG   r  s     rN   Ú_avatar_urlz'FleetDriverCreateSerializer._avatar_url¼
  s-   € ÙØÜ&ØØ�L‰L×Ñ˜YÓ'Øô
ð 	
rV   c           
      óV	  — |d   j                  «       j                  «       }| j                  d   }|j                  dd «      }|j                  dd «      xs g }| j	                  |«      }| j                  j                  d«      }t        j                  j                  |¬«      j                  «       �rÝt        j                  j                  |¬«      }t        |d«      r1|j                  j                  t        j                  j                  k7  rt        j                   ddi«      ‚t"        j                  j%                  ||d	d
i¬«      \  }	}
|
s>|	j&                  rt        j                   ddi«      ‚d
|	_        |	j)                  d	dg¬«       	 |j*                  }g }|j,                  t.        j0                  j2                  k7  r{t.        j0                  j4                  |_        |j7                  d«       |j8                  |j:                  k(  r2t=        |«      }|d   |_        |d   |_        |j?                  ddg«       |�||_         |j7                  d«       |r#|j7                  d«       |j)                  |¬«       |rtE        |||¬«       |S tG        jH                  «       5  t        j                  jK                  |||d   |j                  d«      xs d|j                  d«      xs d¬«      }t        j                  jM                  |t        j                  j                  |j                  d«      xs d|j                  d«      xs d¬«       |t.        j0                  j4                  dœt=        |«      ¥}|�||d<   tO        «       }|j                  d«      xs d› d|j                  d«      xs d› �j                  «       }	 tQ        ||¬«      }||d!<   tU        |j                  d"«      «      |d#<   t/        j                  jL                  d%i |¤Ž t"        j                  jM                  ||d
¬$«       |rtE        |||¬«       d d d «       |S # t.        jB                  $ r Y �Œêw xY w# tR        $ r%}t        j                   d tU        |«      i«      ‚d }~ww xY w# 1 sw Y   S xY w)&Nr¶   r–  r÷   r´  r‹   r·   rÁ   z0This email belongs to a non-transporter account.r7  T)r(  r   ró  z,This driver is already linked to your fleet.rÌ   rÍ   rÂ   rð   rñ   r  r\  r¼   r½   r5   r¾   r¿   rÀ   rø   rë   rù   )r�   rÂ   rú   rû   rý   rþ   rÿ   r   )r(  r   r7  r[   )+r>   rÏ   r  rÔ   rœ  rb   rÐ   rÑ   rÒ   rÓ   rë  rÁ   r
   rØ   r  r	   r;   r   Úget_or_creater7  rŠ   r�  rÂ   r   rç   rõ   r•  r®  rð   rñ   r˜  r¯  r  r�  r¼  r   rÕ   rÖ   r×   r1   r0   r  r:   )rG   rß   r¶   r–  r  r´  r  r‹   r�   ÚlinkÚcreatedrâ   rÎ   Ú	load_typer  rþ   r  r	  r
  s                      rN   r×   z"FleetDriverCreateSerializer.createÅ
  sT  € Ø˜wÑ'×-Ñ-Ó/×5Ñ5Ó7ˆØ—l‘l =Ñ1ˆØ$×(Ñ(¨°4Ó8ˆØ"×&Ñ& {°DÓ9Ò?¸Rˆ	Ø×%Ñ% kÓ2ˆ
Ø—,‘,×"Ñ" 9Ó-ˆä�<‰<×Ñ¨ÐÓ.×5Ñ5Õ7Ü—<‘<×#Ñ#¨UÐ#Ó3ˆDÜ˜4 Ô(¨D¯I©I¯N©N¼h¿m¹m×>WÑ>WÒ,WÜ!×1Ñ1°7Ð<nÐ2oÓpÐpÜ1×9Ñ9×GÑGØ'°Ø% tÐ,ð Hó ‰MˆD�'ñ Ø—>’>Ü%×5Ñ5°wÐ@nÐ6oÓpÐpØ!%�”Ø—	‘	¨°lÐ(C�	ÔDðØ×2Ñ2�Ø "�Ø×'Ñ'Ô+=×+IÑ+I×+UÑ+UÒUÜ+=×+IÑ+I×+\Ñ+\�GÔ(Ø!×(Ñ(¨Ô8Ø×1Ñ1°W·]±]ÒBÜ$AÀ+Ó$N˜	Ø5>Ð?SÑ5T˜Ô2Ø(1°'Ñ(:˜œØ%×,Ñ,Ð.BÀGÐ-LÔMØÐ)Ø)3�GÔ&Ø!×(Ñ(¨Ô6Ù Ø!×(Ñ(¨Ô6Ø—L‘L¨}�LÔ=ñ Ü+¨D°)ÀWÕMØˆKä×ÑÓ!ñ "	NÜ—<‘<×+Ñ+ØØØ'¨
Ñ3Ø)×-Ñ-¨lÓ;ÒA¸rØ(×,Ñ,¨[Ó9Ò?¸Rð ,ó ˆDô ×Ñ×#Ñ#ØÜ—]‘]×.Ñ.Ø$×(Ñ(¨Ó1Ò7°RØ'×+Ñ+¨JÓ7Ò?¸4ð	 $ô ð Ü 2× >Ñ >× QÑ Qñô 0°Ó<ðˆLð
 Ð%Ø-7�˜\Ñ*Ü,Ó.ˆGØ)×-Ñ-¨lÓ;ÒA¸rÐBÀ!ÀN×DVÑDVÐWbÓDcÒDiÐgiÐCjÐk×qÑqÓsˆIðIÜ.¨wÀIÔN�ð '.ˆL˜Ñ#Ü$'¨¯
©
°4Ó(8Ó$9ˆL˜Ñ!Ü×&Ñ&×-Ñ-Ñ=°Ò=Ü!×)Ñ)×0Ñ0Ø'°Àð 1ô ñ Ü+¨D°)ÀWÕM÷E"	NðF ˆøôS &×2Ñ2ò Úðûô> ò IÜ!×1Ñ1°9¼cÀ#»hÐ2GÓHÐHûðIú÷3"	NðF ˆúsE   ÆC/Q Ê%D#RÏ	Q-ÏA3RÑQ*Ñ)Q*Ñ-	RÑ6 RÒRÒRÒR(N)rW   rX   rY   r	   rä   r¶   rå   r¼   r½   r¾   rÀ   rø   rq   r÷   rø  Ú	DictFieldr´  rœ  r×   r[   rV   rN   rš  rš  ©
  s½   „ Ø"ˆK×"Ñ"Ó$€EØ$ˆ{×$Ñ$°ÀÔC€HØ&�×&Ñ&°À4ÔH€JØ%�×%Ñ%¨uÀ$ÔG€IØ!ˆK×!Ñ!¨5¸dÔC€EØ$ˆ{×$Ñ$¨e¸TÈtÔT€HÙ u¸È$ÔO€FØ%�×%Ñ%Ø#ˆk×#Ñ#Ó%ØØðTô	€Iò
óOrV   rš  c                   óZ  — e Zd Z ej                  d¬«      Z ej                  ddd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z	 ej                  dd¬«      Z
 ej                  dd¬«      Z eddd¬«      Z ej                   ej                  «       dd¬«      Zy	)
ÚFleetDriverUpdateSerializerFrY  Trh   )r˜   r›   r™   rš   rî   )rÁ  r›   rÂ  N)rW   rX   rY   r	   rä   r¶   rå   r¼   r½   r¾   rÀ   rø   rq   r÷   rø  r¢  r´  r[   rV   rN   r¤  r¤    s¯   „ Ø"ˆK×"Ñ"¨EÔ2€EØ$ˆ{×$Ñ$°¸uÐQRÔS€HØ&�×&Ñ&°À4ÔH€JØ%�×%Ñ%¨uÀ$ÔG€IØ!ˆK×!Ñ!¨5¸dÔC€EØ$ˆ{×$Ñ$¨eÀÔF€HÙ u¸È$ÔO€FØ%�×%Ñ%Ø#ˆk×#Ñ#Ó%ØØô�IrV   r¤  c                   ó  — e Zd Z ej                  d¬«      Z ej                  d¬«      Z ej                  d¬«      Z	 ej                  d¬«      Z
 ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej                  «       Z ej&                  «       Z ej*                  d¬«      Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zy)ÚFleetDriverSerializerz	driver.idr  r•  zdriver.first_namezdriver.last_namer  c                 ób   — 	 |j                   j                  j                  S # t        $ r Y y w xY wrQ   )r   r�  rÂ   rA   r2  s     rN   Úget_account_typez&FleetDriverSerializer.get_account_type5  s/   € ð	Ø—:‘:×1Ñ1×>Ñ>Ð>øÜò 	Ùð	úó   ‚" ¢	.­.c                 ój   — 	 |j                   j                  j                  xs dS # t        $ r Y yw xY wrs   )r   rÁ   rÀ   rA   r2  s     rN   Ú	get_phonezFleetDriverSerializer.get_phone;  s2   € ð	Ø—:‘:—?‘?×(Ñ(Ò.¨BÐ.øÜò 	Ùð	úó   ‚#& ¦	2±2c                 ój   — 	 |j                   j                  j                  xs dS # t        $ r Y yw xY w)Nrë   )r   rÁ   rø   rA   r2  s     rN   Úget_languagez"FleetDriverSerializer.get_languageA  s2   € ð	Ø—:‘:—?‘?×+Ñ+Ò3¨tÐ3øÜò 	Ùð	úr¬  c                 ób   — 	 |j                   j                  j                  S # t        $ r Y yw xY w)NF)r   r�  r  rA   r2  s     rN   Úget_documents_verifiedz,FleetDriverSerializer.get_documents_verifiedG  s/   € ð	Ø—:‘:×1Ñ1×DÑDÐDøÜò 	Ùð	úr©  c                 ój   — 	 |j                   j                  j                  xs dS # t        $ r Y yw xY wrs   )r   r�  r   rA   r2  s     rN   rÚ  zFleetDriverSerializer.get_tc_idM  s4   € ð	Ø—:‘:×1Ñ1×7Ñ7Ò=¸2Ð=øÜò 	Ùð	úr¬  c                 ój   — 	 |j                   j                  j                  xs dS # t        $ r Y yw xY wrs   )r   r�  r  rA   r2  s     rN   Úget_avatar_urlz$FleetDriverSerializer.get_avatar_urlS  s4   € ð	Ø—:‘:×1Ñ1×<Ñ<ÒBÀÐBøÜò 	Ùð	úr¬  c                 óÂ   — t         j                  j                  |j                  t        ¬«      j                  d«      }t        |d| j                  ¬«      j                  S )N)r�   Údocument_type__inrC  T)r0  r  )	r   rÑ   rÒ   r   r  r*  rh  r  rH   )rG   r3  r-  s      rN   Úget_documentsz#FleetDriverSerializer.get_documentsY  sQ   € Ü× Ñ ×'Ñ'Ø—‘Ü:ð (ó 
÷ ‰(�?Ó
#ð 	ô % R¨d¸D¿L¹LÔI×NÑNÐNrV   N)rW   rX   rY   r	   rT  rÿ   rä   r¶   rå   r½   r¾   rV  rÂ   rÀ   rø   r  r   r  r´  r  r7  r  Ú	linked_atr¨  r«  r®  r°  rÚ  r³  r¶  r[   rV   rN   r¦  r¦  &  s  „ Ø	!ˆ×	!Ñ	!¨Ô	5€BØ"ˆK×"Ñ"¨.Ô9€EØ&�×&Ñ&Ð.AÔB€JØ%�×%Ñ%Ð-?Ô@€IØ4�;×4Ñ4Ó6€LØ-ˆK×-Ñ-Ó/€EØ0ˆ{×0Ñ0Ó2€HØ:˜×:Ñ:Ó<ÐØ-ˆK×-Ñ-Ó/€EØ2�×2Ñ2Ó4€JØ1�×1Ñ1Ó3€IØ(�×(Ñ(Ó*€IØ)�×)Ñ)°Ô>€IòòòòòòóOrV   r¦  c                   óŽ   — e Zd Z ej                  «       Z ej                  «       Z G d„ d«      Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zy
)ÚFreightRouteSerializerc                   ó   — e Zd ZeZdZdZg Zy)úFreightRouteSerializer.Meta)	rÿ   Úorigin_country_codeÚdestination_country_codeÚorigin_country_nameÚdestination_country_nameÚmin_freightrM  r  rÌ   )r  rÌ   N)rW   rX   rY   r    r  r   r!  Ú
validatorsr[   rV   rN   r"  r»  e  s   „ Øˆð

ˆð 8Ðà‰
rV   r"  c                 ó,   — t        |j                  «      S rQ   )r"   r¼  r2  s     rN   Úget_origin_country_namez.FreightRouteSerializer.get_origin_country_namev  s   € Ü$ S×%<Ñ%<Ó=Ð=rV   c                 ó,   — t        |j                  «      S rQ   )r"   r½  r2  s     rN   Úget_destination_country_namez3FreightRouteSerializer.get_destination_country_namey  s   € Ü$ S×%AÑ%AÓBÐBrV   c                 ó`   — t        |«      }|rt        |«      st        j                  d«      ‚|S )NzInvalid origin country code.©r$   r#   r	   r;   r  s      rN   Úvalidate_origin_country_codez3FreightRouteSerializer.validate_origin_country_code|  s.   € Ü% eÓ,ˆÙÔ0°Ô6Ü×-Ñ-Ð.LÓMÐMØˆrV   c                 ó`   — t        |«      }|rt        |«      st        j                  d«      ‚|S )Nz!Invalid destination country code.rÇ  r  s      rN   Ú!validate_destination_country_codez8FreightRouteSerializer.validate_destination_country_code‚  s.   € Ü% eÓ,ˆÙÔ0°Ô6Ü×-Ñ-Ð.QÓRÐRØˆrV   c                 óÆ   — |dv r|S t        |«      j                  «       j                  «       }t        |«      dk7  s|j	                  «       st        j                  d«      ‚|S )Nrs   rg   z*Currency must be a 3-letter ISO 4217 code.)r:   r>   r‚  rn   r  r	   r;   r  s      rN   Úvalidate_currencyz(FreightRouteSerializer.validate_currencyˆ  sT   € Ø�JÑØˆLÜ�5‹z×ÑÓ!×'Ñ'Ó)ˆÜˆt‹9˜Š> §¡¤Ü×-Ñ-Ð.ZÓ[Ð[ØˆrV   c                 óh   — |€t        j                  d«      ‚|dk  rt        j                  d«      ‚|S )Nzmin_freight is required.r   zmin_freight cannot be negative.)r	   r;   rS   s     rN   Úvalidate_min_freightz+FreightRouteSerializer.validate_min_freight�  s7   € Øˆ=Ü×-Ñ-Ð.HÓIÐIØ�1Š9Ü×-Ñ-Ð.OÓPÐPØˆrV   c                 ó.  — |j                  d«      }|€"| j                  �| j                  j                  }|j                  d«      }|€"| j                  �| j                  j                  }|r|r||k(  rt	        j
                  d«      ‚|rz|rxt        j                  j                  ||¬«      }| j                  �&|j                  | j                  j                  ¬«      }|j                  «       rt	        j
                  d«      ‚|rt        |«      |d<   |S )Nr¼  r½  z3Origin and destination must be different countries.)r¼  r½  r†  z?A freight route for this origin and destination already exists.rM  )rb   rO  r¼  r½  r	   r;   r    rÑ   rÒ   rE  rd  rÓ   r%   )rG   rK  ÚoriginÚdestinationr-  s        rN   r´   zFreightRouteSerializer.validate—  s  € Ø—‘Ð0Ó1ˆØˆ>˜dŸm™mÐ7Ø—]‘]×6Ñ6ˆFØ—i‘iÐ :Ó;ˆØÐ 4§=¡=Ð#<ØŸ-™-×@Ñ@ˆKÙ‘k f°Ò&;Ü×-Ñ-ØEóð ñ ‘kÜ×%Ñ%×,Ñ,Ø$*Ø)4ð -ó ˆBð �}‰}Ð(Ø—Z‘Z 4§=¡=×#3Ñ#3�ZÓ4�Ø�y‰yŒ{Ü!×1Ñ1ØUóð ñ Ü 9¸&Ó AˆE�*ÑØˆrV   N)rW   rX   rY   r	   rV  r¾  r¿  r"  rÃ  rÅ  rÈ  rÊ  rÌ  rÎ  r´   r[   rV   rN   r¹  r¹  a  sR   „ Ø;˜+×;Ñ;Ó=ÐØ@˜{×@Ñ@ÓBÐ÷ñ ò">òCòòòòórV   r¹  rQ   ) r?   rD   rl   ÚImportErrorÚdecimalr   r  r   Údjango.db.modelsr   Údjango.core.files.baser   Údjango.contrib.authr   Úrest_frameworkr	   Úaccounts.modelsr
   r   r   r   r   r   r   r   Úcore.load_typer   Úcore.modelsr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r{  r"   r#   r$   r  r%   r&   Úbilling.modelsr'   r(   r)   r*   r+   Úbilling.servicesr-   Ú
media_urlsr/   rý   r0   r1   rÐ   ÚFieldr3   rB   rC   rq   r�   r”   Ú
Serializerr–   rê   ÚModelSerializerr  rX  rh  r+  ÚDRIVER_DOC_TYPESr  ÚFLEET_OWNER_DOC_TYPESr~  ÚTRANSPORTER_DOC_TYPESrŸ  ÚTRANSPORTER_TWO_SIDED_DOC_TYPESr€  r¨   r°   r‰  r¼  r1  rú  r   r  r  r  r$  r(  r,  r.  r7  rt  r|  r„  r†  rˆ  r�  r“  r¤  r§  rÆ  rî  ry  r$  r=  rA  rC  rE  rO  rT  rX  r\  r}  r°  r´  r�  rž  r¸  rÅ  rÑ  rÞ  rå  rù  r  r  r   r'  r^  r5  r;  rF  rR  rY  r]  rg  ro  rt  r|  r~  rƒ  rŠ  rŽ  r‘  r“  r˜  rš  r¤  r¦  r¹  r[   rV   rN   ú<module>rå     s  ðÛ Û ðÛõ Ý !Ý å .Ý .Ý &÷	÷ 	ó 	õ 2÷÷ ÷ ÷ ñ ÷"ñ ÷
 Mß ZÕ ZÝ DÝ 0ß BáÓ€ô$,�k×'Ñ'ô $,òN	òô.�ô ò
Nð <Bô Nô"R × 6Ñ 6ô Rôl_ K×$:Ñ$:ô _ôDr ;×#>Ñ#>ô rôjN˜{×:Ñ:ô Nôb)<˜K×7Ñ7ô )<ñZ  $ K×$@Ñ$@ÓAÐ Ù$(¨×)JÑ)JÓ$KÐ !Ù˜[×>Ñ>Ó?Ð Ù"& {×'NÑ'NÓ"OÐ ò(ò1ð
 HLÐ`dô ô&P¨+×*@Ñ*@ô Póf2ô:W˜×3Ñ3ô WôtX K×$:Ñ$:ô Xô ×!<Ñ!<ô ô2M ×!7Ñ!7ô MôX ×!7Ñ!7ô Xô × ;Ñ ;ô ôD	@ k×&<Ñ&<ô 	@ôI k×&<Ñ&<ô Iô9 K×$:Ñ$:ô 9ô
R +×"8Ñ"8ô RôlD˜×4Ñ4ô DòPó ò*
ò	ô3Ð-?ô 3ô>Ð0ô >ô$>˜K×7Ñ7ô $>ôNU +×"8Ñ"8ô Uô {×'=Ñ'=ô ô6Q
 k×&<Ñ&<ô Q
ôhv [×%@Ñ%@ô vòr3ô*˜×3Ñ3ô *ô</Ð+ô /ô
	˜+×0Ñ0ô 	ôF˜;×1Ñ1ô Fô
 [×%;Ñ%;ô ô*5˜[×8Ñ8ô 5ô+ ×!<Ñ!<ô +÷ñ ô OÐ*¨K×,GÑ,Gô OôfGDÐ 2ô GDðT/¨dó /òdRò
ô"IÐ,¨k×.IÑ.Iô IôZ;DÐ"6ô ;Dô|5Ð&:ô 5ôp	<Ð)Hô 	<ô2˜×3Ñ3ô 2ôj˜k×9Ñ9ô ô<H
 k×&AÑ&Aô H
ôVLÐ(Gô Lô
˜×4Ñ4ô 
ô�K×/Ñ/ô ó ôJ"�{×2Ñ2ô "ô"˜×3Ñ3ô "ô/˜×3Ñ3ô /ô("˜K×7Ñ7ô "ô" +×"=Ñ"=ô "ô	˜×.Ñ.ô 	ôF ×!7Ñ!7ô Fô"˜;×6Ñ6ô "ô$% {×'BÑ'Bô $%ôNF¨×(>Ñ(>ô Fô
" +×"=Ñ"=ô "ô>˜[×8Ñ8ô >ô0 K×$?Ñ$?ô 0ô7˜×/Ñ/ô 7ô3 K×$:Ñ$:ô 3ô
O ×!7Ñ!7ô Oòôk +×"8Ñ"8ô kô\ +×"8Ñ"8ô ô8O˜K×2Ñ2ô 8OôvN˜[×8Ñ8õ NøðyZ ò ØƒFðús   ŠX< Ø<YÙY