Ë
    >^¡j]$  ã                  ó²  — U d Z ddlm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mZ ddlmZmZ d	Zd
Zded<   ddddœddddœddddœddddœddddœdœZded<   eD � ci c]  } | j+                  «       | “Œ c} Zd/d„Zd0d„Zd0d„Zd0d„Zd1d„Zd2d„Zd3d „Zd4d!„Zd5d"„Zd4d#„Z d6d$„Z!d7d%„Z"d8d&„Z#d9d'„Z$d5d(„Z%d)„ Z&	 	 	 	 	 	 	 	 d:d*„Z'd2d+„Z(d/d,„Z)d-„ Z*d5d.„Z+yc c} w );zRLoad discovery filters: vehicle types, weight buckets, dimensions, fleet matching.é    )ÚannotationsN)ÚDecimal)Úsettings)ÚQ)ÚTransporterProfileÚVehicle)Úis_valid_country_codeÚnormalize_country_code)é
   é2   éd   )zFlat Bed 12mzContainer 40 Feet / 20 FeetzFlat Bed 15mzPickup Box 3 TonzPickup Box 7 TonzPickup Box 10 TonzBox Trailer 15mzBox Trailer 13.5mzBox Trailer 12mz3 Ton Pickupz7 Ton Pickupz10 Ton Pickup (With Lifter)zSide Curtain 7 TonzSide Curtain 10 TonzSide Curtain 13.5zSide Curtain 15mzRecovery 3 TonzRecovery 7 TonzRecovery 10 TonzLow Bed 2 AxlezLow Bed 3 AxlezCar CarrierzRefrigerator Trailer 12mzRefrigerator Trailer 13.5mzRefrigerator Trailer 15mz Container 40 Feet & 20 Feet Bothztuple[str, ...]ÚVEHICLE_TYPESzUp to 2Tg       @)ÚlabelÚmin_tonsÚmax_tonsz2-5Tg      @z5-8Tg       @z8-10Tg      $@z10T+)Úup_to_2tÚ2_5tÚ5_8tÚ8_10tÚ10t_plusz(dict[str, dict[str, str | float | None]]ÚWEIGHT_BUCKETSc                ó€   — | sy t        | «      j                  «       j                  «       }t        j	                  |«      S ©N)ÚstrÚstripÚcasefoldÚ_VEHICLE_TYPE_LOOKUPÚget)ÚvalueÚkeys     ú-/var/www/html/truck-me/core/load_discovery.pyÚnormalize_vehicle_typer"   8   s4   € ÙØÜ
ˆe‹*×
Ñ
Ó
×
%Ñ
%Ó
'€CÜ×#Ñ# CÓ(Ð(ó    c                ó   — t        | «      d uS r   )r"   ©r   s    r!   Úis_valid_vehicle_typer&   ?   s   € Ü! %Ó(°Ð4Ð4r#   c                ób   — | syt        | «      j                  «       j                  «       t        v S ©NF)r   r   Úlowerr   r%   s    r!   Úis_valid_weight_bucketr*   C   s)   € ÙØÜˆu‹:×ÑÓ×#Ñ#Ó%¬Ð7Ð7r#   c                ó~   — | syt        | «      j                  «       t        D �ch c]  }t        |«      ’Œ c}v S c c}w r(   )r   r   ÚDISTANCE_RANGES_KM)r   Úks     r!   Úis_valid_distance_ranger.   I   s3   € ÙØÜˆu‹:×ÑÓÔ2DÖ!E¨Q¤# a¥&Ò!EÐEÐEùÒ!Es   ¤:c                 ó¤   — t        t        «      t        j                  «       D � �cg c]  \  } }| |d   dœ‘Œ c}} t        t        «      dœS c c}} w )Nr   )Úidr   )Úavailable_distance_ranges_kmÚavailable_weight_bucketsÚavailable_vehicle_types)Úlistr,   r   Úitemsr   )r    Úmetas     r!   Úfilter_options_payloadr7   O   sR   € ä(,Ô-?Ó(@ô ,×1Ñ1Ó3÷%
á��Tð   g¡Ó/ó%
ô $(¬Ó#6ñð ùó%
s   ¦Ac                ó
  — | �| dk(  ry t        | «      j                  «       }t        j                  d|«      }|sy 	 t	        |j                  d«      «      }|j                  «       }t        t        j                  d|«      «      }t        t        t        dd«      «      j                  «       j                  «       }d|v r|dz  S d|v r|S d	|v r|d
z  dz  S |s|dk(  r|dz  S |S |dk(  r|dz  S |S # t        t        f$ r Y y w xY w)NÚ ú(\d+(?:\.\d+)?)é   z[a-zA-Z]ÚWEIGHT_NUMERIC_DEFAULT_UNITÚkgç     @�@ÚtonÚlbgøŠn½¦Ý?)r   r   ÚreÚsearchÚfloatÚgroupÚ	TypeErrorÚ
ValueErrorr)   ÚboolÚgetattrÚdjango_settings)Úweight_textÚ
weight_strÚmatchr   Ú	unit_textÚhas_lettersÚdefault_units          r!   Úextract_weight_tonsrP   Z   s  € ØÐ˜k¨RÒ/ØÜ�[Ó!×'Ñ'Ó)€JÜ�I‰IÐ(¨*Ó5€EÙØðÜ�e—k‘k !“nÓ%ˆð × Ñ Ó"€IÜ”r—y‘y ¨iÓ8Ó9€KÜ”wœÐ0MÈtÓTÓU×[Ñ[Ó]×cÑcÓe€LØˆyÑØ�v‰~ÐØ�	ÑØˆØˆyÑØ˜Ñ  FÑ*Ð*ÙØ˜4ÒØ˜6‘>Ð!ØˆØ�tÒØ�v‰~ÐØ€Løô# ”zÐ"ò Ùðús   ¼C0 Ã0DÄDc                óÄ   — | €yt         |   }|d   }|d   }|€|�| t        |«      k  S |€|�| t        |«      kD  S |�$|�"t        |«      | cxk  xr t        |«      k  S c S y)NFr   r   )r   rC   )ÚtonsÚ
bucket_keyr6   r   r   s        r!   Úweight_in_bucketrT   w   sˆ   € Ø€|ØÜ˜*Ñ%€DØ�JÑ€HØ�JÑ€HØÐ˜HÐ0Ø”u˜X“Ñ&Ð&ØÐ˜HÐ0Ø”e˜H“oÑ%Ð%ØÐ Ð 4Ü�X‹ Ö8¬¨x«Ñ8Ð8Ñ8Ð8Ør#   c                ó†  — | sy t        | «      j                  «       j                  «       }t        j                  d|«      }t        |«      dk  ry 	 |d d D �cg c]  }t        |«      ‘Œ }}d|v sd|v r|D �cg c]  }|dz  ‘Œ	 }}|j                  «        |d   |d   |d   fS c c}w # t        t        f$ r Y y w xY wc c}w )	Nr:   é   ÚftÚfeetgý‡ôÛ×�Ó?r   r;   é   )
r   r   r)   rA   ÚfindallÚlenrC   rE   rF   Úsort)ÚtextÚrawÚnumsÚxÚvalsÚvs         r!   Ú_dimension_triple_metersrc   †   sÊ   € ÙØÜ
ˆd‹)�/‰/Ó
×
!Ñ
!Ó
#€CÜ�:‰:Ð(¨#Ó.€DÜ
ˆ4ƒy�1‚}ØðØ"& r¨ (Ö+˜Q”�a•Ð+ˆÐ+ð ˆs�{�f ‘mØ$(Ö)˜q��F“
Ð)ˆÐ)Ø‡I�I„KØ�‰7�D˜‘G˜T !™WÐ$Ð$ùò ,øÜ”zÐ"ò Ùðüò *s*   ÁB) ÁB$Á*B) Á8B>Â$B) Â)B;Â:B;c                óv   — t        | «      }t        |«      }|�|€|du S t        d„ t        ||«      D «       «      S )zOTrue when required (shipment) sorted dims fit within capacity (filter/vehicle).Nc              3  ó2   K  — | ]  \  }}||d z   k  –— Œ y­w©ç•Ö&è.>N© )Ú.0ÚreqÚcaps      r!   ú	<genexpr>z!dimensions_fit.<locals>.<genexpr>�   s   è ø€ ÒI¡X S¨#ˆs�c˜D‘jÕ ÑIùó   ‚)rc   ÚallÚzip)Úrequired_textÚcapacity_textÚrequiredÚcapacitys       r!   Údimensions_fitrt   —   sD   € ä'¨Ó6€HÜ'¨Ó6€HØÐ˜8Ð+Ø˜4ÐÐÜÑI´°X¸xÓ1HÔIÓIÐIr#   c                ó"  — | j                   �| j                  �| j                  €y 	 t        t	        | j                   «      t	        | j                  «      t	        | j                  «      g«      }|d   |d   |d   fS # t
        t        f$ r Y y w xY w)Nr   r;   rY   )Úmax_length_mÚmax_width_mÚmax_height_mÚsortedrC   rE   rF   )Úvehiclera   s     r!   Ú_vehicle_max_dims_mr{       s—   € Ø×ÑÐ# w×':Ñ':Ð'BÀg×FZÑFZÐFbØðÜÜ�'×&Ñ&Ó'Ü�'×%Ñ%Ó&Ü�'×&Ñ&Ó'ð
ó ˆð
 �A‰w˜˜Q™  a¡Ð(Ð(øÜ”zÐ"ò Ùðús   §AA< Á<BÂBc                óÞ   — t        | «      }t        |«      }|r|r||k(  S t        | «      j                  «       j                  «       t        |«      j                  «       j                  «       k(  S r   )r"   r   r   r   )Úvehicle_typeÚshipment_type_requiredÚv_normÚs_norms       r!   Ú_types_compatibler�   ®   sa   € Ü# LÓ1€FÜ#Ð$:Ó;€FÙ‘&Ø˜ÑÐÜˆ|Ó×"Ñ"Ó$×-Ñ-Ó/´3Ð7MÓ3N×3TÑ3TÓ3V×3_Ñ3_Ó3aÑaÐar#   c                óZ  — t        | d«      r| j                  «       S t        | dd«      xs g }t        |t        «      rD|D �cg c]5  }t        |«      j                  «       sŒt        |«      j                  «       ‘Œ7 }}|r|S t        | dd«      xs dj                  «       }|r|gS g S c c}w )zEReturn all types for a vehicle (JSON list, else legacy vehicle_type).Ú	type_listÚvehicle_typesNr}   r9   )Úhasattrrƒ   rH   Ú
isinstancer4   r   r   )rz   ÚtypesÚtÚcleanedÚprimarys        r!   Úvehicle_type_listr‹   ¶   sš   € äˆw˜Ô$Ø× Ñ Ó"Ð"Ü�G˜_¨dÓ3Ò9°r€EÜ�%œÔØ+0ÖC a´C¸³F·L±LµN”3�q“6—<‘<•>ÐCˆÐCÙØˆNÜ�w °Ó5Ò;¸×BÑBÓD€GÙˆGˆ9Ð' RÐ'ùò	 Ds   ÁB(Á!B(c                ó>   ‡— t        ˆfd„t        | «      D «       «      S )zOTrue if any of the vehicle's types is compatible with the shipment requirement.c              3  ó6   •K  — | ]  }t        |‰«      –— Œ y ­wr   )r�   )ri   Úvtr~   s     €r!   rl   z0vehicle_matches_required_type.<locals>.<genexpr>Å   s!   øè ø€ ò àô 	˜"Ð4×5ñùs   ƒ)Úanyr‹   )rz   r~   s    `r!   Úvehicle_matches_required_typer�   Ã   s"   ø€ äó ä# GÓ,ôó ð r#   c                ó^   — t        | «      D ]  }t        ||«      sŒt        |«      xs |c S  y)zDReturn the first vehicle type that matches the shipment requirement.N)r‹   r�   r"   )rz   r~   rŽ   s      r!   Úmatching_vehicle_typer’   Ë   s6   € ä Ó(ò 4ˆÜ˜RÐ!7Õ8Ü)¨"Ó-Ò3°Ò3ð4ð r#   c                óX  — t        | |j                  «      syt        |j                  «      }|�$	 t	        | j
                  «      dz  }|�	||dz   kD  ryt        | «      }t        |j                  «      }|r|rt        d„ t        ||«      D «       «      ryy# t        t        f$ r d }Y Œ`w xY w)NFr>   rg   c              3  ó2   K  — | ]  \  }}||d z   kD  –— Œ y­wrf   rh   )ri   ÚsdÚvds      r!   rl   z)_vehicle_fits_shipment.<locals>.<genexpr>á   s   è ø€ Ò@¡& " bˆr�B˜‘I�~Ñ@ùrm   T)r�   Úvehicle_type_requiredrP   ÚweightrC   Úload_capacityrE   rF   r{   rc   Ú
dimensionsr�   ro   )rz   ÚshipmentÚshipment_tonsÚcapacity_tonsÚv_dimsÚs_dimss         r!   Ú_vehicle_fits_shipmentr    Ó   s¯   € Ü(¨°(×2PÑ2PÔQØÜ'¨¯©Ó8€MØÐ ð	!Ü! '×"7Ñ"7Ó8¸6ÑAˆMð Ð$¨¸ÈÑ9MÒ)MØÜ  Ó)€FÜ% h×&9Ñ&9Ó:€FÙ‘&ÜÑ@¬C°¸Ó,?Ô@Ô@ØØøô œ:Ð&ò 	!Ø ŠMð	!ús   °B ÂB)Â(B)c                ó2   — |D ]  }t        || «      sŒ|c S  y r   )r    )r›   Úvehiclesrz   s      r!   Úfind_matching_vehicler£   æ   s%   € Øò ˆÜ! '¨8Õ4ØŠNðð r#   c               ó´   — |rt        | j                  «      }||k7  ry|r t        t        | j                  «      |«      sy|rt        | j                  |«      syy)NFT)r"   r—   rT   rP   r˜   rt   rš   )r›   r}   Úweight_bucketrš   rr   s        r!   Ú!shipment_passes_discovery_filtersr¦   í   sU   € ñ Ü)¨(×*HÑ*HÓIˆØ�|Ò#ØÙÜÔ 3°H·O±OÓ DÀmÔTØÙÜ˜h×1Ñ1°:Ô>ØØr#   c                ó^   — 	 t        | j                  «      dz  S # t        t        f$ r Y y w xY w)Nr>   )rC   r™   rE   rF   )rz   s    r!   Úvehicle_capacity_tonsr¨     s4   € ðÜ�W×*Ñ*Ó+¨fÑ4Ð4øÜ”zÐ"ò Ùðús   ‚ š,«,c                óp   — | rt        | «      j                  «       syt        | «      }|rt        |«      sy|S )z@Return normalized ISO country code or None when missing/invalid.N)r   r   r
   r	   )r   Úcodes     r!   Úparse_required_country_coder«     s4   € áœ˜E›
×(Ñ(Ô*ØÜ! %Ó(€DÙÔ,¨TÔ2ØØ€Kr#   c                ó  — t         j                  j                  dd¬«      }|t        j                  j
                  k(  rt        |j                  | ¬«      «      S t        |j                  t        | ¬«      t        | ¬«      z  «      «      S )NT)Úis_verifiedÚ	is_active)Úowner)Úassigned_driver)r   ÚobjectsÚfilterr   ÚAccountTypeÚFLEET_OWNERr4   r   )ÚuserÚaccount_typeÚqss      r!   Ú$transporter_verified_active_vehiclesr¸     sh   € Ü	�‰×	Ñ	¨D¸DÐ	Ó	A€BØÔ)×5Ñ5×AÑAÒAÜ�B—I‘I D�IÓ)Ó*Ð*Ü�—	‘	œ! $œ-¬!¸DÔ*AÑAÓBÓCÐCr#   c                ó,   ‡ — t        ˆ fd„|D «       «      S )Nc              3  óJ   •K  — | ]  }t        |‰j                  «      –— Œ y ­wr   )r�   r—   )ri   rb   r›   s     €r!   rl   z=shipment_matches_transporter_vehicle_types.<locals>.<genexpr>  s&   øè ø€ ò àô 	& a¨×)GÑ)G×Hñùs   ƒ #)r�   )r›   r¢   s   ` r!   Ú*shipment_matches_transporter_vehicle_typesr»     s   ø€ Üó àôó ð r#   )r   ú
str | NoneÚreturnr¼   )r   r¼   r½   rG   )r½   Údict)r½   úfloat | None)rR   r¿   rS   r   r½   rG   )r½   z!tuple[float, float, float] | None)r½   rG   )r}   r   r~   r   r½   rG   )r½   z	list[str])r~   r   r½   rG   )r~   r   r½   r¼   )r}   r¼   r¥   r¼   rš   r¼   r½   rG   ),Ú__doc__Ú
__future__r   rA   Údecimalr   Údjango.confr   rI   Údjango.db.modelsr   Úaccounts.modelsr   r   Úcore.countriesr	   r
   r,   r   Ú__annotations__r   r   r   r"   r&   r*   r.   r7   rP   rT   rc   rt   r{   r�   r‹   r�   r’   r    r£   r¦   r¨   r«   r¸   r»   )Únames   0r!   ú<module>rÉ      s/  ðÚ Xå "ã 	Ý å 3Ý ç 7ß Hà"Ð ð"€ˆó ð< %°$ÀCÑHØ¨#¸3Ñ?Ø¨#¸3Ñ?Ø¨C¸TÑBØ ¨dÀÑEñ<€Ð8ó ð ;HÖH°$˜Ÿ™›¨Ñ-ÒHÐ ó)ó5ó8óFóóó:ó%ó"Jóóbó
(óóóò&ðð ðð ð	ð
 ðð 
óó(óòDôùòI Is   ÁC