Ë
    >^¡jV  ã                   óò  — d dl Z d dlmZ d dlm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y)é    N)Úmodels)Úsettingsc                   óz  — e Zd Z G d„ dej                  «      Z ej                  ej                  ej                  d¬«      Z
 ej                  dej                  ¬«      Z ej                  dd¬	«      Z ej                  d
d¬«      Z ej                   d¬«      Z ej                   d¬«      Z G d„ d«      Zd„ Zy)ÚUserRolec                   ó   — e Zd ZdZdZdZy)úUserRole.Role)ÚSHIPPERÚShipper)ÚTRANSPORTERÚTransporter)ÚADMINÚAdminN)Ú__name__Ú
__module__Ú__qualname__r	   r   r   © ó    ú)/var/www/html/truck-me/accounts/models.pyÚRoler      s   „ Ø&ˆØ2ˆØ ‰r   r   Úrole©Ú	on_deleteÚrelated_nameé   ©Ú
max_lengthÚchoicesé2   T©r   Úblanké
   Úen)r   Údefault©Úauto_now_add©Úauto_nowc                   ó   — e Zd ZdZdZy)úUserRole.Metaz	User rolez
User rolesN©r   r   r   Úverbose_nameÚverbose_name_pluralr   r   r   ÚMetar)      s   „ Ø"ˆØ*Ñr   r-   c                 ó^   — | j                   j                  «       › d| j                  «       › d�S )Nú (ú))ÚuserÚget_usernameÚget_role_display©Úselfs    r   Ú__str__zUserRole.__str__   s-   € Ø—)‘)×(Ñ(Ó*Ð+¨2¨d×.CÑ.CÓ.EÐ-FÀaÐHÐHr   N)r   r   r   r   ÚTextChoicesr   ÚOneToOneFieldr   ÚAUTH_USER_MODELÚCASCADEr1   Ú	CharFieldr   r   ÚphoneÚlanguageÚDateTimeFieldÚ
created_atÚ
updated_atr-   r6   r   r   r   r   r      s±   „ ô!ˆv×!Ñ!ô !ð
  ˆ6×ÑØ× Ñ Ø—.‘.Øô€Dð
 ˆ6×Ñ r°4·<±<Ô@€DØˆF×Ñ¨°$Ô7€EØˆv×Ñ¨2°tÔ<€HØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷+ñ +óIr   r   c                   ó
  — e Zd Z G d„ dej                  «      Z ej                  ej                  ej                  d¬«      Z
 ej                  dej                  e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j                  ddd
d¬«      Z ej&                  ddd¬«      Z ej.                  d¬«      Z ej2                  dd¬«      Z ej.                  dd¬«      Z ej8                  ed¬«      Z ej2                  d¬«      Z ej2                  d¬«      Z  G d„ d«      Z!d„ Z"y) ÚShipperProfilec                   ó   — e Zd ZdZdZy)úShipperProfile.AccountType)Ú
INDIVIDUALÚ
Individual)ÚBUSINESSzBusiness / CorporateN)r   r   r   rE   rG   r   r   r   ÚAccountTyperD   !   s   „ Ø/ˆ
Ø5‰r   rH   Úshipper_profiler   r   ©r   r   r#   éÿ   Tr   Ú z2Optional business / trading name (shipper signup).©r   r    r#   Ú	help_texté@   z'Optional tax / VAT ID (shipper signup).z8Optional national ID number collected at shipper signup.z=Optional national ID expiry date collected at shipper signup.©Únullr    rN   z5Optional passport number collected at shipper signup.z:Optional passport expiry date collected at shipper signup.F©r#   ©rQ   r    z9Admin: allow CREDIT payment method for business shippers.©r#   rN   )r#   r    r$   r&   c                   ó   — e Zd ZdZdZy)úShipperProfile.MetazShipper profilezShipper profilesNr*   r   r   r   r-   rV   \   s   „ Ø(ˆØ0Ñr   r-   c                 ó<   — d| j                   j                  «       › �S )Nz	Shipper: ©r1   r2   r4   s    r   r6   zShipperProfile.__str__`   s   € Ø˜4Ÿ9™9×1Ñ1Ó3Ð4Ð5Ð5r   N)#r   r   r   r   r7   rH   r8   r   r9   r:   r1   r;   r   rE   Úaccount_typeÚcompany_nameÚbusiness_nameÚtax_idÚnational_id_numberÚ	DateFieldÚnational_id_expiry_dateÚpassport_numberÚpassport_expiry_dateÚBooleanFieldÚkyc_verifiedr>   Úkyc_submitted_atÚcredit_approvedÚ	JSONFieldÚdictÚshipment_preferencesr?   r@   r-   r6   r   r   r   rB   rB       sÀ  „ ô6�f×(Ñ(ô 6ð  ˆ6×ÑØ× Ñ Ø—.‘.Ø&ô€Dð
 $�6×#Ñ#ØØ×#Ñ#Ø×&Ñ&ô€Lð
 $�6×#Ñ#¨s¸$Ô?€LØ$�F×$Ñ$ØØØØFô	€Mð ˆV×ÑØØØØ;ô	€Fð *˜×)Ñ)ØØØØLô	Ðð /˜f×.Ñ.ØØØQôÐð
 '�f×&Ñ&ØØØØIô	€Oð ,˜6×+Ñ+ØØØNôÐð
 '�6×&Ñ&¨uÔ5€LØ+�v×+Ñ+°¸TÔBÐØ)�f×)Ñ)ØØMô€Oð ,˜6×+Ñ+°DÀÔEÐØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷1ñ 1ó6r   rB   c                   óâ  — e Zd Z G d„ dej                  «      Z ej                  ej                  ej                  d¬«      Z
 ej                  dej                  e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d¬«      Z ej*                  dd¬«      Z ej*                  dd¬«      Z ej*                  d¬«      Z ej                  d
d¬	«      Z ej                  dddd¬«      Z ej6                  d¬«      Z ej6                  d¬«      Z G d„ d«      Zd„ Zy)ÚTransporterProfilec                   ó   — e Zd ZdZdZdZy)úTransporterProfile.AccountType)ÚDRIVERzIndividual driver)ÚTRANSPORTER_DRIVERz%Fleet driver (created by fleet owner))ÚFLEET_OWNERzTransporter / Fleet ownerN)r   r   r   rm   rn   ro   r   r   r   rH   rl   e   s   „ Ø.ˆØZÐØ@‰r   rH   Útransporter_profiler   r   rJ   rK   Tr   r   rL   z#Company office phone (fleet owner).rM   z%Company mobile contact (fleet owner).éô  z)Company location / address (fleet owner).z4Absolute URL of the transporter/driver avatar image.FzFTransporter accepts cross-border loads; mutually exclusive with local.rT   zQTransporter accepts local loads only; mutually exclusive with country_to_country.rR   r!   )r   r    ÚuniquerQ   r$   r&   c                   óŒ   — e Zd ZdZdZ ej                   ej                  dd¬«       ej                  dd¬«      z  d¬«      gZy)	úTransporterProfile.MetazTransporter profilezTransporter profilesTF)Úcountry_to_countryÚlocalÚtransporter_load_type_xor)Ú	conditionÚnameN)	r   r   r   r+   r,   r   ÚCheckConstraintÚQÚconstraintsr   r   r   r-   rt   ›   sM   „ Ø,ˆØ4Ðà"ˆF×"Ñ"Ø"˜&Ÿ(™(°dÀ%ÔHØ�&—(‘(¨e¸4Ô@ñAà0ôð
‰r   r-   c                 ó<   — d| j                   j                  «       › �S )NzTransporter: rX   r4   s    r   r6   zTransporterProfile.__str__¦   s   € Ø˜tŸy™y×5Ñ5Ó7Ð8Ð9Ð9r   N) r   r   r   r   r7   rH   r8   r   r9   r:   r1   r;   r   rm   rY   rZ   Úoffice_numberÚmobile_numberÚcompany_locationÚURLFieldÚ
avatar_urlrb   ru   rv   Údocuments_verifiedÚtc_idÚtc_u_idr>   r?   r@   r-   r6   r   r   r   rj   rj   d   s¢  „ ôA�f×(Ñ(ô Að
  ˆ6×ÑØ× Ñ Ø—.‘.Ø*ô€Dð
 $�6×#Ñ#ØØ×#Ñ#Ø×"Ñ"ô€Lð
 $�6×#Ñ#¨s¸$Ô?€LØ$�F×$Ñ$ØØØØ7ô	€Mð %�F×$Ñ$ØØØØ9ô	€Mð (�v×'Ñ'ØØØØ=ô	Ðð !�—‘ØØØØHô	€Jð -˜×,Ñ,ØØZôÐð  ˆF×ÑØØeô€Eð -˜×,Ñ,°UÔ;ÐØˆF×Ñ¨°$Ô7€EØˆf×Ñ¨"°DÀÈDÔQ€GØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷	
ñ 	
ó:r   rj   c                   ó@  — e Zd ZdZ ej
                  ej                  ej                  d¬«      Z	 ej
                  ej                  ej                  d¬«      Z
 ej                  d¬«      Z ej                  d¬«      Z ej                  d¬«      Z G d	„ d
«      Zd„ Zy)ÚTransporterDriverLinkz\
    Fleet owner <-> driver relationship (explicit, independent of vehicle assignment).
    Úfleet_driversr   Úfleet_driver_linksTrR   r$   r&   c                   ó:   — e Zd Z ej                  ddgd¬«      gZy)úTransporterDriverLink.MetaÚtransporterÚdriverÚuniq_transporter_driver_link©Úfieldsry   N©r   r   r   r   ÚUniqueConstraintr|   r   r   r   r-   r‹   ½   s$   „ à#ˆF×#Ñ#Ø% xÐ0Ø3ôð
‰r   r-   c                 óT   — | j                   › d| j                  › d| j                  › d�S )Nz -> z	 (active=r0   )Útransporter_idÚ	driver_idÚ	is_activer4   s    r   r6   zTransporterDriverLink.__str__Å   s-   € Ø×%Ñ%Ð& d¨4¯>©>Ð*:¸)ÀDÇNÁNÐCSÐSTÐUÐUr   N)r   r   r   Ú__doc__r   Ú
ForeignKeyr   r9   r:   rŒ   r�   rb   r–   r>   r?   r@   r-   r6   r   r   r   r‡   r‡   ª   s�   „ ñð $�&×#Ñ#Ø× Ñ Ø—.‘.Ø$ô€Kð
 ˆV×ÑØ× Ñ Ø—.‘.Ø)ô€Fð
 $�×#Ñ#¨DÔ1€IØ%�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷
ñ 
óVr   r‡   c                   ó<  — e Zd Z G d„ dej                  «      Z G d„ dej                  «      Z eej                  ej                  ej                  ej                  ej                  h«      Z eej                  ej                  ej                  ej                  h«      Z eej                  h«      Z eej"                  ej                  ej                  h«      Zeez  ez  Z eej(                  ej*                  ej,                  ej                  h«      Z eej                  ej                  h«      Z ej2                  ej6                  ej8                  d¬«      Z ej<                  dej>                  ¬«      Z  ej<                  d	d
dd¬«      Z! ej<                  dd
d
d
d¬«      Z" ejF                  dd¬«      Z$ ejF                  dd
d¬«      Z% ejL                  dd¬«      Z' ej<                  dej>                  ejP                  ¬«      Z) ejT                  d
d¬«      Z+ ejX                  d
¬«      Z- ejX                  d
d
¬«      Z. ej2                  ej6                  ej^                  dd
d
¬ «      Z0 ejb                  d
d
d!¬"«      Z2 G d#„ d$«      Z3d%„ Z4d&„ Z5y')(ÚKYCDocumentc                   óH   — e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZy)úKYCDocument.DocumentType)ÚIDzIdentity document)ÚBUSINESS_REGISTRATIONzBusiness registration©ÚOTHERÚOther)ÚDRIVER_LICENSEzDriver license)ÚVEHICLE_REGISTRATIONzVehicle registration)ÚPASSPORT_COPYzPassport copy)ÚPERMITzPermit (if applicable))ÚCOUNTRY_GCCzGCC ID©ÚNOCr¨   )ÚCOMPANY_LICENSEzCompany License)ÚCOMPANY_REGISTRATIONz Company Registration Certificate)ÚCOMPANY_OWNERSHIPzCompany Ownership Documents)ÚCOMPANY_ADDRESS_PROOFzCompany Address Proof)ÚOTHER_COMPLIANCEz/Other transporter-specific compliance documents)ÚTRADE_LICENSEzTrade license copyN)r   r   r   r�   rž   r    r¢   r£   r¤   r¥   r¦   r¨   r©   rª   r«   r¬   r­   r®   r   r   r   ÚDocumentTyperœ   Ê   sS   „ à&ˆØ PÐØ ˆà;ˆØMÐØ8ˆØ3ˆØ-ˆØˆà>ˆàYÐØNÐØ PÐØ`ÐØ=‰r   r¯   c                   ó   — e Zd ZdZdZdZy)úKYCDocument.ReviewStatus©ÚPENDINGÚPending©ÚAPPROVEDÚApproved©ÚREJECTEDÚRejectedN©r   r   r   r³   r¶   r¹   r   r   r   ÚReviewStatusr±   ß   ó   „ Ø&ˆØ)ˆØ)‰r   r¼   Úkyc_documentsr   é   r   é   TrL   z<ISO country code for COUNTRY_GCC uploads (GCC members only).rM   rO   z;Passport number for PASSPORT_COPY; unique across all users.)r   r    rQ   rr   rN   zkyc/%Y/%m/%d/z0Front side (or sole file for single-sided docs).)Ú	upload_torN   z.Back side for two-sided transporter documents.)rÁ   r    rN   Fz*Synced alias of review_status == APPROVED.rT   r   rJ   z)Admin rejection reason or review comment.)r    rN   r$   rS   Úreviewed_kyc_documents©r   r   rQ   r    ú(Optional; used for compliance reminders.rP   c                   ó   — e Zd ZdZdZy)úKYCDocument.MetazKYC documentzKYC documentsNr*   r   r   r   r-   rÆ   B  s   „ Ø%ˆØ-Ñr   r-   c                 ó\   — | j                   j                  «       › d| j                  «       › �S )Nú - )r1   r2   Úget_document_type_displayr4   s    r   r6   zKYCDocument.__str__F  s+   € Ø—)‘)×(Ñ(Ó*Ð+¨3¨t×/MÑ/MÓ/OÐ.PÐQÐQr   c                 óT   — | j                   | j                  j                  k(  | _        y ©N)Úreview_statusr¼   r¶   Úverifiedr4   s    r   Úsync_verified_flagzKYCDocument.sync_verified_flagI  s    € Ø×*Ñ*¨d×.?Ñ.?×.HÑ.HÑHˆ�r   N)6r   r   r   r   r7   r¯   r¼   Ú	frozensetr¢   r¤   r¥   r¦   r¨   ÚDRIVER_DOC_TYPESÚDRIVER_PERSON_KYC_TYPESr£   ÚLEGACY_VEHICLE_KYC_TYPESr©   ÚFLEET_OWNER_DOC_TYPESÚTRANSPORTER_DOC_TYPESr�   rž   r    ÚSHIPPER_DOC_TYPESÚTRANSPORTER_TWO_SIDED_TYPESr˜   r   r9   r:   r1   r;   r   Údocument_typeÚgcc_countryr`   Ú	FileFieldÚfileÚ	file_backrb   rÍ   r³   rÌ   Ú	TextFieldÚreview_notesr>   Úsubmitted_atÚreviewed_atÚSET_NULLÚreviewed_byr^   Úexpiry_dater-   r6   rÎ   r   r   r   rš   rš   É   sæ  „ ô>�v×)Ñ)ô >ô**�v×)Ñ)ô *ñ
 !Ø×#Ñ#Ø×"Ñ"Ø×ÑØ× Ñ Ø×Ñð"ó Ðñ (Ø×#Ñ#Ø×"Ñ"Ø×ÑØ× Ñ ð	)ó Ðñ  )Ø×)Ñ)ð*ó  Ðñ
 &Ø×$Ñ$Ø× Ñ Ø×"Ñ"ð'ó Ðð -Ð/DÑDÐG_Ñ_Ðá!Ø�‰Ø×*Ñ*Ø×ÑØ×"Ñ"ð	#ó Ðñ #,Ø×#Ñ#Ø× Ñ ð-ó #Ðð
 ˆ6×ÑØ× Ñ Ø—.‘.Ø$ô€Dð
 %�F×$Ñ$°¸L×<PÑ<PÔQ€MØ"�&×"Ñ"ØØØØPô	€Kð '�f×&Ñ&ØØØØØOô€Oð ˆ6×Ñ oÐAsÔt€DØ �× Ñ Ø!ØØBô€Ið
 #ˆv×"Ñ"ØØ>ô€Hð %�F×$Ñ$ØØ×$Ñ$Ø×$Ñ$ô€Mð
 $�6×#Ñ#ØØ=ô€Lð (�6×'Ñ'°TÔ:€LØ&�&×&Ñ&¨D¸Ô=€KØ#�&×#Ñ#Ø× Ñ Ø—/‘/Ø-ØØô€Kð #�&×"Ñ"ØØØ<ô€K÷.ñ .òRóIr   rš   c                   ó‚  ‡ — e Zd Z ej                  ej                  ej                  d¬«      Z ej                  ej                  ej                  ddd¬«      Z
 ej                  d¬«      Z ej                  edd¬	«      Z ej                  d¬«      Z ej"                  d
d¬«      Z ej"                  ddddd¬«      Z ej"                  ddddd¬«      Z ej"                  ddddd¬«      Z ej,                  d¬«      Z ej0                  dddd¬«      Z ej4                  d¬«      Z ej4                  d¬«      Z ej:                  dd¬«      Z ej                  ej                  ej                  ddd¬«      Z ej:                  d¬«      Z  ej:                  d¬«      Z! G d„ d«      Z"d ee#   fd!„Z$ˆ fd"„Z%d#„ Z&ˆ xZ'S )$ÚVehicleÚfleet_vehiclesr   Úassigned_fleet_vehiclesTrÃ   éd   ©r   zYAll vehicle types this unit can serve; vehicle_type is kept as the primary (first) entry.)r#   r    rN   é   rÀ   )Ú
max_digitsÚdecimal_placesé   é   z7Max cargo length (m); optional, for dimension matching.)rê   rë   rQ   r    rN   z6Max cargo width (m); optional, for dimension matching.z7Max cargo height (m); optional, for dimension matching.©r    rq   rL   z)Absolute URL of the vehicle photo/avatar.rM   FrR   rS   Úverified_fleet_vehiclesr$   r&   c                   ó@   — e Zd ZdgZ ej
                  ddgd¬«      gZy)úVehicle.Metaú-created_atÚownerÚregistration_numberÚ#uniq_vehicle_registration_per_ownerr�   N)r   r   r   Úorderingr   r’   r|   r   r   r   r-   rñ   ‚  s,   „ Ø!�?ˆà#ˆF×#Ñ#ØÐ!6Ð7Ø:ôð
‰r   r-   Úreturnc                 ó.  — t        | j                  t        «      r| j                  ng }|D �cg c]5  }t        |«      j	                  «       sŒt        |«      j	                  «       ‘Œ7 }}|r|S | j
                  xs dj	                  «       }|r|gS g S c c}w )z;Normalized non-empty type strings for matching and display.rL   )Ú
isinstanceÚvehicle_typesÚlistÚstrÚstripÚvehicle_type)r5   ÚtypesÚtÚcleanedÚprimarys        r   Ú	type_listzVehicle.type_list‹  s~   € ä&0°×1CÑ1CÄTÔ&J�×"Ò"ÐPRˆØ+0ÖC a´C¸³F·L±LµN”3�q“6—<‘<•>ÐCˆÐCÙØˆNØ×$Ñ$Ò*¨×1Ñ1Ó3ˆÙ#�ˆyÐ+¨Ð+ùò	 Ds   ­BÁBc                 óì   •— | j                  «       }|r|| _        |d   | _        n@| j                  r4| j                  j                  «       g| _        | j                  d   | _        t	        ‰| �  |i |¤Ž y )Nr   )r  rú   rþ   rý   ÚsuperÚsave)r5   ÚargsÚkwargsrÿ   Ú	__class__s       €r   r  zVehicle.save”  sm   ø€ Ø—‘Ó ˆÙØ!&ˆDÔØ % a¡ˆDÕØ×ÒØ"&×"3Ñ"3×"9Ñ"9Ó";Ð!<ˆDÔØ $× 2Ñ 2°1Ñ 5ˆDÔÜ‰‰�dÐ%˜fÓ%r   c                 ó„   — | j                  «       }|rdj                  |«      n| j                  }| j                  › d|› d�S )Nz, r/   r0   )r  Újoinrþ   rô   )r5   rÿ   Úlabels      r   r6   zVehicle.__str__ž  s@   € Ø—‘Ó ˆÙ$)�—	‘	˜%Ô ¨t×/@Ñ/@ˆØ×*Ñ*Ð+¨2¨e¨W°AÐ6Ð6r   )(r   r   r   r   r˜   r   r9   r:   ró   rà   Úassigned_driverr;   rþ   rf   rû   rú   rô   ÚDecimalFieldÚload_capacityÚmax_length_mÚmax_width_mÚmax_height_mrÜ   Úspecial_featuresr�   r‚   rb   r–   Úis_verifiedr>   Úverified_atÚverified_byr?   r@   r-   rü   r  r  r6   Ú__classcell__©r	  s   @r   rä   rä   M  së  ø„ ØˆF×ÑØ× Ñ Ø—.‘.Ø%ô€Eð
 (�f×'Ñ'Ø× Ñ Ø—/‘/Ø.ØØô€Oð $�6×#Ñ#¨sÔ3€LØ$�F×$Ñ$ØØØmô€Mð
 +˜&×*Ñ*°cÔ:ÐØ'�F×'Ñ'°2ÀaÔH€MØ&�6×&Ñ&Ø Q¨T¸ØKô€Lð &�&×%Ñ%Ø Q¨T¸ØJô€Kð '�6×&Ñ&Ø Q¨T¸ØKô€Lð (�v×'Ñ'¨dÔ3ÐØ �—‘ØØØØ=ô	€Jð $�×#Ñ#¨EÔ2€IØ%�&×%Ñ%¨eÔ4€KØ&�&×&Ñ&¨D¸Ô=€KØ#�&×#Ñ#Ø× Ñ Ø—/‘/Ø.ØØô€Kð &�×%Ñ%°4Ô8€JØ%�×%Ñ%¨tÔ4€J÷
ñ 
ð,˜4 ™9ó ,ô&ö7r   rä   c                   ó`  — e Zd Z G d„ dej                  «      Z G d„ dej                  «      Z ej                  eej                  d¬«      Z
 ej                  dej                  ¬«      Z ej                  d	¬
«      Z ej                  dej                  ej                   ¬«      Z ej$                  d¬«      Z ej(                  d¬«      Z ej(                  dd¬«      Z ej                  ej0                  ej2                  ddd¬«      Z ej6                  ddd¬«      Z G d„ d«      Zd„ Zy)ÚVehicleDocumentc                   ó    — e Zd ZdZdZdZdZdZy)úVehicleDocument.DocumentTyper§   )Ú	INSURANCEÚ	Insurance)r¥   ÚPermit)ÚFITNESSzFitness certificaterŸ   N)r   r   r   r¨   r  r¥   r   r    r   r   r   r¯   r  ¥  s   „ ØˆØ,ˆ	Ø#ˆØ2ˆØ ‰r   r¯   c                   ó   — e Zd ZdZdZdZy)úVehicleDocument.ReviewStatusr²   rµ   r¸   Nr»   r   r   r   r¼   r"  ¬  r½   r   r¼   Ú	documentsr   r   r   zvehicle-docs/%Y/%m/%d/)rÁ   rJ   Trî   r$   rS   Úreviewed_vehicle_documentsrÃ   rÄ   rP   c                   ó   — e Zd ZdgZy)úVehicleDocument.Metaz-submitted_atN)r   r   r   rö   r   r   r   r-   r&  Í  s
   „ Ø#Ð$‰r   r-   c                 ó:   — d| j                   › d| j                  › �S )Nz	Vehicle #rÈ   )Ú
vehicle_idr×   r4   s    r   r6   zVehicleDocument.__str__Ð  s!   € Ø˜4Ÿ?™?Ð+¨3¨t×/AÑ/AÐ.BÐCÐCr   N)r   r   r   r   r7   r¯   r¼   r˜   rä   r:   Úvehicler;   r   r×   rÙ   rÚ   r³   rÌ   rÜ   rÝ   r>   rÞ   rß   r   r9   rà   rá   r^   râ   r-   r6   r   r   r   r  r  ¤  s/  „ ô!�v×)Ñ)ô !ô*�v×)Ñ)ô *ð
  ˆf×ÑØØ—.‘.Ø ô€Gð
 %�F×$Ñ$°¸L×<PÑ<PÔQ€MØˆ6×ÑÐ&>Ô?€DØ$�F×$Ñ$ØØ×$Ñ$Ø×$Ñ$ô€Mð
 $�6×#Ñ#¨$Ô/€LØ'�6×'Ñ'°TÔ:€LØ&�&×&Ñ&¨D¸Ô=€KØ#�&×#Ñ#Ø× Ñ Ø—/‘/Ø1ØØô€Kð #�&×"Ñ"ØØØ<ô€K÷%ñ %óDr   r  c                   óH  ‡ — e Zd ZdZ ej
                  dddd¬«      Z ej
                  dddd	¬«      Z ej                  d
dd¬«      Z	 ej                  dd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z ej
                  dddd¬«      Z ej                  dd¬«      Z ej
                  dddd¬«      Z ej
                  dddd¬«      Z ej                  dd¬«      Z ej                  dd¬«      Z G d „ d!«      Zˆ fd"„Zd#„ Zed$„ «       Zd%„ Zˆ xZS )&ÚPlatformSettingszISingleton (pk=1): platform-wide defaults for discovery and related rules.é   rÀ   r   zGDefault search radius when transporter omits radius and distance_range.)rê   rë   r#   rN   é   rq   z(Upper cap for client-supplied radius_km.rí   ÚUSDz7ISO 4217 currency code for wallet balances and billing.)r   r#   rN   r¿   z8Days ahead to notify transporters of expiring documents.rT   éZ   z5Bid window for transporter acceptance-rate analytics.é   z?Grace period after scheduled pickup for on-time delivery stats.rì   z;FCM radius when a shipment is published (requires Traccar).z8Max transporters notified per nearby-load publish event.é-   z5Assumed speed for straight-line navigation ETA hints.r   z0POD GPS check vs delivery coords (0 = disabled).é0   z7Hours without trip update before dashboard stale alert.é   zwNumber of drivers who receive load rate requests simultaneously (1 = sequential dispatch, >1 = multi-driver broadcast).c                   ó   — e Zd ZdZdZy)úPlatformSettings.MetaúPlatform settingsNr*   r   r   r   r-   r5    s   „ Ø*ˆØ1Ñr   r-   c                 ó2   •— d| _         t        ‰| �  |i |¤Ž y )Nr3  )Úpkr  r  )r5   r  r  r	  s      €r   r  zPlatformSettings.save  s   ø€ ØˆŒÜ‰‰�dÐ%˜fÓ%r   c                  ó   — y rË   r   )r5   r  r  s      r   ÚdeletezPlatformSettings.delete  s   € Ør   c                 ó\   — ddl m} | j                  j                  d |«       ¬«      \  }}|S )Nr   )Ú"env_defaults_for_platform_settingsr3  )r8  Údefaults)Úaccounts.platform_configr<  ÚobjectsÚget_or_create)Úclsr<  ÚobjÚ_s       r   ÚloadzPlatformSettings.load  s+   € åOà—‘×*Ñ*¨aÑ:\Ó:^Ð*Ó_‰ˆˆQØˆ
r   c                  ó   — y)Nr6  r   r4   s    r   r6   zPlatformSettings.__str__%  s   € Ø"r   )r   r   r   r—   r   r  Úload_visibility_radius_kmÚload_visibility_max_radius_kmr;   Údefault_wallet_currencyÚPositiveIntegerFieldÚ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_countr-   r  r:  ÚclassmethodrD  r6   r  r  s   @r   r+  r+  Ô  s›  ø„ ÙSà 3 × 3Ñ 3ØØØØ[ô	!Ðð %8 F×$7Ñ$7ØØØØ<ô	%Ð!ð /˜f×.Ñ.ØØØKôÐð
 9˜V×8Ñ8ØØLôÐð -H¨F×,GÑ,GØØIô-Ð)ð $? 6×#>Ñ#>ØØSô$Ð ð $7 6×#6Ñ#6ØØØØOô	$Ð ð !< × ;Ñ ;ØØLô!Ðð "5 ×!4Ñ!4ØØØØIô	"Ðð $7 6×#6Ñ#6ØØØØDô	$Ð ð 9˜V×8Ñ8ØØKôÐð 'B f×&AÑ&AØð Lô'Ð#÷
2ñ 2ô&òð ñó ðö#r   r+  c                   ó¶   — e Zd ZdZ ej
                  ej                  ej                  d¬«      Z	 ej                  d¬«      Z ej                  dd¬«      Zd„ Zy)	ÚUserPushDevicez3FCM token storage (1:1 per user; last device wins).Úpush_devicer   Trî   rS   c                 ó    — d| j                   › �S )NzPushDevice user=)Úuser_idr4   s    r   r6   zUserPushDevice.__str__3  s   € Ø! $§,¡, Ð0Ð0r   N)r   r   r   r—   r   r8   r   r9   r:   r1   rÜ   Ú	fcm_tokenr>   Úfcm_token_updated_atr6   r   r   r   rU  rU  )  sX   „ Ù=Øˆ6×ÑØ× Ñ Ø—.‘.Ø"ô€Dð
 !�× Ñ  tÔ,€IØ/˜6×/Ñ/°TÀÔFÐó1r   rU  c                   óž  — e Zd ZdZdZ ej                  ddd«      Z G d„ dej                  «      Z
 ej                  de
j                  ¬«      Z ej                  «       Z ej                   «       Z ej$                  d	d
¬«      Z ej(                  ed¬«      Z ej                   ed¬«      Z ej.                  d¬«      Z G d„ d«      Zd„ Zy)ÚDocumentExpiryReminderLogzNOne row per reminder send: day windows (31/7/1) or hourly on/after expiry day.éÿÿÿÿi²  r3  c                   ó   — e Zd ZdZdZy)ú!DocumentExpiryReminderLog.DocKind)ÚKYCr`  )ÚVEHICLEzVehicle documentN)r   r   r   r`  ra  r   r   r   ÚDocKindr_  =  s   „ ØˆØ/‰r   rb  r!   r   é   zEDays before expiry for advance reminders; 0 = hourly on/after expiry.rT   zDLocal hour (0-23) for hourly reminders; -1 for day-window reminders.zFCalendar date for hourly reminders; sentinel for day-window reminders.Tr$   c                   ó:   — e Zd Z ej                  g d¢d¬«      gZy)úDocumentExpiryReminderLog.Meta)ÚkindÚdocument_idrâ   Údays_beforeÚreminder_hourÚreminder_onÚuniq_document_expiry_reminderr�   Nr‘   r   r   r   r-   re  R  s   „ à#ˆF×#Ñ#ÚlØ4ôð
‰r   r-   c                 óR   — | j                   › d| j                  › d| j                  › �S )Nú#z exp=)rf  rg  râ   r4   s    r   r6   z!DocumentExpiryReminderLog.__str__Z  s+   € Ø—)‘)�˜A˜d×.Ñ.Ð/¨u°T×5EÑ5EÐ4FÐGÐGr   N)r   r   r   r—   ÚREMINDER_HOUR_DAY_WINDOWÚdatetimeÚdateÚREMINDER_ON_DAY_WINDOWr   r7   rb  r;   r   rf  rI  rg  r^   râ   ÚPositiveSmallIntegerFieldrh  ÚSmallIntegerFieldri  rj  r>   r?   r-   r6   r   r   r   r\  r\  7  sÜ   „ ÙXà!ÐØ*˜XŸ]™]¨4°°AÓ6Ðô0�&×$Ñ$ô 0ð ˆ6×Ñ r°7·?±?ÔC€DØ-�&×-Ñ-Ó/€KØ"�&×"Ñ"Ó$€KØ2�&×2Ñ2ØØYô€Kð -�F×,Ñ,Ø(ØXô€Mð #�&×"Ñ"Ø&ØZô€Kð &�×%Ñ%°4Ô8€J÷
ñ 
óHr   r\  c                   ó®  — e Zd ZdZ ej
                  ej                  ej                  d¬«      Z	 ej                  «       Z ej                  d¬«      Z ej                  ddd¬	«      Z ej                  d
¬«      Z ej"                  d¬«      Z ej&                  «       Z ej&                  d¬«      Z G d„ d«      Zd„ Zedefd„«       Zedefd„«       Zy)ÚPasswordResetOTPzKTemporary OTP/token for password reset flow (Shipper, Transporter, Driver).Úpassword_reset_otpsr   r!   rè   rO   TrL   )r   r    r#   FrR   r   r$   c                   ón   — e Zd ZdZdZdgZ ej                  g d¢¬«       ej                  ddg¬«      gZy)	úPasswordResetOTP.MetazPassword reset OTPzPassword reset OTPsrò   )ÚemailÚotpÚis_used)r�   Útokenr{  N)	r   r   r   r+   r,   rö   r   ÚIndexÚindexesr   r   r   r-   rx  n  s=   „ Ø+ˆØ3ÐØ!�?ˆàˆF�L‰LÒ ;Ô<ØˆF�L‰L ¨)Ð 4Ô5ð
‰r   r-   c                 óT   — d| j                   › d| j                  › d| j                  › �S )NzPasswordResetOTP user=z email=z used=)rX  ry  r{  r4   s    r   r6   zPasswordResetOTP.__str__w  s'   € Ø'¨¯© ~°W¸T¿Z¹Z¸LÈÈtÏ|É|ÈnÐ]Ð]r   r÷   c                 óH   — ddl m} |j                  «       | j                  k\  S )Nr   )Útimezone)Údjango.utilsr�  ÚnowÚ
expires_at)r5   r�  s     r   Ú
is_expiredzPasswordResetOTP.is_expiredz  s   € å)Ø�|‰|‹~ §¡Ñ0Ð0r   c                 ó:   — | j                    xr | j                   S rË   )r{  r…  r4   s    r   Úis_validzPasswordResetOTP.is_valid  s   € à—<‘<ÐÒ7¨¯©Ð$7Ð7r   N)r   r   r   r—   r   r˜   r   r9   r:   r1   Ú
EmailFieldry  r;   rz  r|  rb   r{  rI  Úattemptsr>   r„  r?   r-   r6   ÚpropertyÚboolr…  r‡  r   r   r   ru  ru  ^  sð   „ ÙUàˆ6×ÑØ× Ñ Ø—.‘.Ø*ô€Dð
 ˆF×ÑÓ€EØ
ˆ&×
Ñ
 bÔ
)€CØˆF×Ñ¨°$ÀÔC€EØ!ˆf×!Ñ!¨%Ô0€GØ*ˆv×*Ñ*°1Ô5€HØ%�×%Ñ%Ó'€JØ%�×%Ñ%°4Ô8€J÷
ñ 
ò^ð ð1˜Dò 1ó ð1ð ð8˜$ò 8ó ñ8r   ru  )ro  Ú	django.dbr   Údjango.confr   ÚModelr   rB   rj   r‡   rš   rä   r  r+  rU  r\  ru  r   r   r   ú<module>r�     sÙ   ðÛ å Ý  ôIˆv�|‰|ô Iô2A6�V—\‘\ô A6ôHC:˜Ÿ™ô C:ôLV˜FŸL™Lô Vô>AI�&—,‘,ô AIôHT7ˆf�l‰lô T7ôn-D�f—l‘lô -Dô`R#�v—|‘|ô R#ôj1�V—\‘\ô 1ô$H §¡ô $HôN#8�v—|‘|õ #8r   