Ë
    Xß–jwP  ã                   óN  — d 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 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 ddlmZmZmZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4  e«       Z5d„ Z6d„ Z7d„ Z8 edg«       eee)g«      d„ «       «       Z9 edg«       eee)g«      d„ «       «       Z:d„ Z; edg«       eee*g«      d„ «       «       Z< edg«       eee'g«      d„ «       «       Z= edg«       eee(g«      d„ «       «       Z> edg«       eeg«      d„ «       «       Z? edg«       eee*g«      d„ «       «       Z@ edg«       eee*g«      d„ «       «       ZA edg«       eee(g«      d„ «       «       ZB G d „ d!ej†                  «      ZD G d"„ d#ejŠ                  «      ZF G d$„ d%ej†                  «      ZG ed&g«       eee)g«      d'„ «       «       ZH edg«       eee*g«      d(„ «       «       ZI edg«       eee*g«      d)„ «       «       ZJy*)+u3   Ratings, saved addresses, favorites (plan Â§8â€“9).é    )Ú	timedelta)Úsettings)Úget_user_model)ÚAvgÚCountÚ
FloatFieldÚQÚSum)ÚCoalesce)Útimezone)Úgenerics)Úapi_viewÚpermission_classes)ÚIsAuthenticated)ÚKYCDocumentÚUserRoleÚVehicleÚVehicleDocument)ÚBidÚProofOfDeliveryÚTripÚ
TripReviewÚTripShipperReviewÚSavedAddressÚFavoriteTransporteré   )ÚIsFleetDriverTransporterÚIsIndividualDriverTransporterÚ	IsShipperÚIsTransporter)Úapi_response)Ú IndividualDriverRatingSerializerÚTripReviewCreateSerializerÚTripReviewSerializerÚ!TripShipperReviewCreateSerializerÚTripShipperReviewSerializerÚSavedAddressSerializerÚFavoriteTransporterSerializerc                 óš  — t        t        t        dd«      «      }t        |¬«      }d}d}d}| j	                  d«      D ]J  }	 |j
                  }|j                  j                  }|s|dz  }Œ.|dz  }|j                  ||z   k  sŒF|dz  }ŒL |r||z  nd}	|	�t        |	dz  d	«      nd}
|	|
|||d
|› d�dœS # t        j                  $ r Y Œ‹w xY w)zPShare of eligible completed trips delivered on time (POD + pickup_scheduled_at).ÚON_TIME_DELIVERY_GRACE_HOURSé   )Úhoursr   Úshipmentr   Néd   é   z¬Among completed trips with POD and non-null shipment.pickup_scheduled_at: share where proof_of_delivery.delivered_at <= pickup_scheduled_at + ON_TIME_DELIVERY_GRACE_HOURS (zh).)Úon_time_delivery_rateÚon_time_delivery_percentageÚon_time_deliveries_countÚon_time_eligible_trips_countÚ#on_time_insufficient_schedule_countÚon_time_definition)ÚintÚgetattrÚdj_settingsr   Úselect_relatedÚpodr   ÚDoesNotExistr-   Úpickup_scheduled_atÚdelivered_atÚround)Útrips_qsÚgrace_hoursÚgraceÚon_timeÚon_time_eligibleÚon_time_insufficientÚtripr:   ÚschÚrateÚ
percentages              ú,/var/www/html/truck-me/api/engagement_api.pyÚ_on_time_delivery_statsrJ      s  € ä”gœkÐ+IÈ2ÓNÓO€KÜ˜KÔ(€EØ€GØÐØÐØ×'Ñ'¨
Ó3ò ˆð	Ø—(‘(ˆCð �m‰m×/Ñ/ˆÙØ  AÑ%Ð ØØ˜AÑÐØ×Ñ˜s U™{Ó*Ø�q‰L‰Gðñ ,<ˆGÐ&Ò&À€DØ)-Ð)9”�t˜c‘z 1Ô%¸t€Jà!%Ø'1Ø$+Ø(8Ø/Cð-à-8¨M¸ð>ñð øô ×+Ñ+ò 	Ùð	ús   ÁB4Â4C
Ã	C
c                 ó¤   — t         j                  j                  t        | ¬«      t        | ¬«      z  t        | ¬«      z  «      j	                  «       S )zPTrips the individual driver won, was assigned to, or holds the accepted bid for.©Útransporter©Úassigned_driver)Úaccepted_bid__transporter)r   ÚobjectsÚfilterr	   Údistinct©Úusers    rI   Ú_individual_driver_trip_qsrV   A   sD   € ä�<‰<×ÑÜ	�dÔÜ
˜DÔ
!ñ	"ä
 dÔ
+ñ	,ó÷ �hƒjð	ó    c                 óJ   — t        t        | «      j                  d«      ¬«      S )zRReviews on trips the user participated in (by trip linkage, not review FKs alone).Úid)Útrip_id__in)r	   rV   ÚvaluesrT   s    rI   Ú!_individual_driver_reviews_filterr\   J   s   € äÔ3°DÓ9×@Ñ@ÀÓFÔGÐGrW   ÚPOSTc                 óÆ  — 	 t         j                  j                  d«      j                  || j                  ¬«      }|j                  t         j                  j                  t         j                  j                  t         j                  j                  fvrt        ddd	¬«      S t        j                  j                  |¬
«      j                  «       rt        ddd¬«      S t        | j                   ¬«      }|j#                  «       st        dd|j$                  ¬«      S |j&                  }|j(                  xs |j&                  }|j*                  j                  d«      }|�!	 t,        j                  j                  |¬«      }t        j                  j/                  || j                  |||j*                  d   |j*                  j                  d«      |j*                  j                  d«      xs d¬«      }t        ddt1        |«      j                   ¬«      S # t         j
                  $ r t        ddd¬«      cY S w xY w# t,        j
                  $ r t        ddd¬«      cY S w xY w)Nr-   )ÚpkÚshipment__shipperé”  úTrip not found.ú
Not found.©Úerroré�  ú2Trip must be delivered or completed before review.úInvalid trip status.©rE   úReview already submitted.ú
Duplicate.©ÚdataúValidation failed.Ú	driver_id©r_   zInvalid driver_id.zInvalid driver.Útransporter_ratingÚdriver_ratingÚcommentÚ )rE   ÚshipperrM   Údriverrq   rr   rs   éÉ   úReview submitted successfully.)r   rQ   r9   ÚgetrU   r;   r!   ÚstatusÚStatusÚ	DELIVEREDÚ	COMPLETEDÚCLOSEDr   rR   Úexistsr#   rm   Úis_validÚerrorsrM   rO   Úvalidated_dataÚUserÚcreater$   )ÚrequestÚtrip_pkrE   ÚserrM   Údriver_userÚdidÚrevs           rI   Úshipper_submit_trip_reviewr‹   O   s  € ðHÜ�|‰|×*Ñ*¨:Ó6×:Ñ:¸gÐY`×YeÑYeÐ:Ófˆð ‡{�{œ4Ÿ;™;×0Ñ0´$·+±+×2GÑ2GÌÏÉ×I[ÑI[Ð\Ñ\Ü˜CÐ!UÐ]sÔtÐtÜ×Ñ× Ñ  dÐ Ó+×2Ñ2Ô4Ü˜CÐ!<ÀLÔQÐQÜ
$¨'¯,©,Ô
7€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHØ×"Ñ"€KØ×&Ñ&Ò:¨$×*:Ñ*:€KØ
×
Ñ
×
 Ñ
  Ó
-€CØ
€ð	TÜŸ,™,×*Ñ*¨cÐ*Ó2ˆKô ×
Ñ
×
#Ñ
#ØØ—‘ØØØ×-Ñ-Ð.BÑCØ×(Ñ(×,Ñ,¨_Ó=Ø×"Ñ"×&Ñ& yÓ1Ò7°Rð $ó €Cô ˜Ð=ÔDXÐY\ÓD]×DbÑDbÔcÐcøô5 ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô × Ñ ò 	TÜ Ð%9ÐARÔSÒSð	Tús#   ‚:H Å! H< È!H9È8H9È<!I ÉI ÚGETc                 óø  — 	 t         j                  j                  |¬«      }	 |j
                  j
                  t        j                  j                  k7  rt	        ddd¬«      S 	 t        j                  j                  |¬	«      j                  d
«      d d }t	        ddt        |d¬«      j                  ¬«      S # t         j                  $ r t	        ddd¬«      cY S w xY w# t        $ r t	        ddd¬«      cY S w xY w)Nrp   ra   zUser not found.rc   rd   rf   úUser is not a transporter.úInvalid role.rL   ú-created_até2   éÈ   úReviews retrieved successfully.T©Úmanyrl   )rƒ   rQ   ry   r;   r!   Úroler   ÚRoleÚTRANSPORTERÚ	Exceptionr   rR   Úorder_byr$   rm   )r…   Útransporter_idÚuÚqss       rI   Úshipper_transporter_reviewsrž   q   sì   € ðHÜ�L‰L×Ñ ÐÓ/ˆðVØ�6‰6�;‰;œ(Ÿ-™-×3Ñ3Ò3Ü Ð%AÈÔYÐYð 4ô 
×	Ñ	×	"Ñ	"¨qÐ	"Ó	1×	:Ñ	:¸=Ó	IÈ#È2Ð	N€BÜ˜Ð>ÔEYÐZ\ÐcgÔEh×EmÑEmÔnÐnøô ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHûô
 ò VÜ˜CÐ!=À_ÔUÒUðVús"   ‚ B8 £>C Â8!CÃCÃC9Ã8C9c          
      óø  — 	 t         j                  j                  dddd«      j                  |¬«      }|dk(  r1|j                  | j                  j                  k7  r€t        ddd¬	«      S |dk(  r1|j                  | j                  j                  k7  rJt        ddd¬	«      S | j                  j                  |j                  |j                  fvrt        ddd¬	«      S |j                  t         j                  j                  t         j                  j                  t         j                  j                  fvrt        d
dd¬	«      S t        j                  j!                  |¬«      j#                  «       rt        d
dd¬	«      S t%        | j&                  ¬«      }|j)                  «       st        d
d|j*                  ¬	«      S t        j                  j-                  ||j.                  j0                  |j2                  | j                  |j4                  d   |j4                  j                  d«      xs d¬«      }t        ddt7        |«      j&                  ¬«      S # t         j                  $ r t        ddd¬	«      cY S w xY w)zf
    access: 'participant' (transporter or assigned driver), 'assigned_driver', or 'transporter'.
    r-   r`   rM   rO   rp   ra   rb   rc   rd   rf   rg   rh   ri   rj   rk   rl   rn   Úshipper_ratingrs   rt   )rE   ru   rM   Úreviewerr    rs   rw   rx   )r   rQ   r9   ry   r;   r!   Úassigned_driver_idrU   rY   r›   rz   r{   r|   r}   r~   r   rR   r   r%   rm   r€   r�   r„   r-   ru   rM   r‚   r&   )r…   r†   ÚaccessrE   r‡   rŠ   s         rI   Ú_submit_trip_shipper_reviewr¤   �   s  € ðHÜ�|‰|×*Ñ*¨:Ð7JÈMÐ[lÓm×qÑqØð ró 
ˆð Ð"Ò"Ø×"Ñ" g§l¡l§o¡oÒ5Ü Ð%6¸lÔKÐKØ	�=Ò	 Ø×Ñ '§,¡,§/¡/Ò1Ü Ð%6¸lÔKÐKØ	�‰�‰ ×!4Ñ!4°d×6MÑ6MÐ NÑ	NÜ˜CÐ!2¸,ÔGÐGà‡{�{œ4Ÿ;™;×0Ñ0´$·+±+×2GÑ2GÌÏÉ×I[ÑI[Ð\Ñ\Ü˜CÐ!UÐ]sÔtÐtÜ× Ñ ×'Ñ'¨TÐ'Ó2×9Ñ9Ô;Ü˜CÐ!<ÀLÔQÐQä
+°·±Ô
>€CØ�<‰<Œ>Ü˜CÐ!5¸S¿Z¹ZÔHÐHä
×
#Ñ
#×
*Ñ
*ØØ—‘×%Ñ%Ø×$Ñ$Ø—‘Ø×)Ñ)Ð*:Ñ;Ø×"Ñ"×&Ñ& yÓ1Ò7°Rð +ó €Cô ˜Ð=ÔD_Ð`cÓDd×DiÑDiÔjÐjøô; ×Ñò HÜ˜CÐ!2¸,ÔGÒGðHús   ‚2I É!I9É8I9c                 ó   — t        | |d¬«      S )zEFleet owner, individual driver, or assigned fleet driver on the trip.Úparticipant©r£   ©r¤   ©r…   r†   s     rI   Ú!transporter_submit_shipper_reviewrª   ©   ó   € ô ' w°ÀÔNÐNrW   c                 ó   — t        | |d¬«      S )z?Fleet driver rates the shipper for a trip they are assigned to.rO   r§   r¨   r©   s     rI   Ú"fleet_driver_submit_shipper_reviewr­   °   s   € ô ' w°Ð@QÔRÐRrW   c                 ó   — t        | |d¬«      S )z7Individual driver rates the shipper for their own trip.rM   r§   r¨   r©   s     rI   Ú'individual_driver_submit_shipper_reviewr¯   ·   r«   rW   c                 óH  — 	 t         j                  j                  dd«      j                  |¬«      }	 |j                  j                  t        j                  j                  k7  rt        dd	d
¬«      S 	 t        |dd «      }t        j                  j                  t        |¬«      t        |¬«      z  dd¬«      j                  dd«      }|j!                  «       }t"        j                  j                  |¬«      j                  d«      }|j%                  t'        d«      t)        d«      t+        d«      ¬«      }g }|j                  d«      d d D ]š  }	|	j,                  j.                  › d|	j,                  j0                  › �j3                  «       xs |	j,                  j4                  }
|j7                  |	j8                  |	j:                  |	j<                  xs d|
|	j>                  dœ«       Œœ t        dd|j8                  |j4                  |j.                  |j0                  t        t        |dd «      dd«      xs d|r|j@                  nd|rtC        |jD                  «      nddœ|r:|j8                  |jF                  |jH                  |jJ                  |jL                  dœnd |d    xs d!tO        |d"   xs d!«      |d#   �tQ        tS        |d#   «      d$«      nd |d%œd&œ¬'«      S # t         j                  $ r t        ddd¬«      cY S w xY w# t        $ r t        dd	d
¬«      cY S w xY w)(Nr–   Útransporter_profilerp   ra   úTransporter not found.rc   rd   rf   rŽ   r�   )ÚownerrN   T)Ú	is_activeÚis_verifiedz-updated_atr�   rL   rY   rq   )Úreview_countÚ
rating_sumÚaverage_ratingru   é   Ú rt   )rY   Úratingrs   Úshipper_nameÚ
created_atr’   z+Transporter profile retrieved successfully.ÚphoneF)rY   ÚemailÚ
first_nameÚ	last_namer¾   Úcompany_nameÚdocuments_verified)rY   Úvehicle_typeÚregistration_numberr´   rµ   r¶   r   r·   r¸   r/   )r¶   r·   r¸   Úrecent_reviews)rM   Úcurrent_vehicleÚratingsrl   )*rƒ   rQ   r9   ry   r;   r!   r–   r   r—   r˜   r™   r7   r   rR   r	   rš   Úfirstr   Ú	aggregater   r
   r   ru   rÀ   rÁ   Ústripr¿   ÚappendrY   rq   rs   r½   rÂ   ÚboolrÃ   rÄ   rÅ   r´   rµ   r6   r>   Úfloat)r…   r›   rM   ÚprofileÚ	vehicle_qrÇ   Ú	review_qsÚ
review_aggÚrecentÚrowr¼   s              rI   Útransporter_public_profilerÕ   ¾   s  € ðOÜ—l‘l×1Ñ1°&Ð:OÓP×TÑTÐXfÐTÓgˆðVØ×Ñ× Ñ ¤H§M¡M×$=Ñ$=Ò=Ü Ð%AÈÔYÐYð >ô
 �kÐ#8¸$Ó?€Gä—‘×&Ñ&Ü	�Ôœq°Ô=Ñ=ØØð 'ó ÷ �hˆ}˜mÓ,ð	 ð
  —o‘oÓ'€Oä×"Ñ"×)Ñ)°kÐ)ÓB×KÑKÈMÓZ€IØ×$Ñ$Ü˜4“[ÜÐ+Ó,ÜÐ/Ó0ð %ó €Jð €FØ×'Ñ'¨	Ó2°2°AÐ6ò 

ˆØŸ+™+×0Ñ0Ð1°°3·;±;×3HÑ3HÐ2IÐJ×PÑPÓRÒgÐVY×VaÑVa×VgÑVgˆØ�‰à—f‘fØ×0Ñ0ØŸ;™;Ò,¨"Ø ,Ø!Ÿn™nñõ	
ð

ô ØØ5ð "—n‘nØ$×*Ñ*Ø)×4Ñ4Ø(×2Ñ2Ü ¤¨°f¸dÓ!CÀWÈbÓQÒWÐUWÙ8? × 4Ò 4ÀRÙJQ¤d¨7×+EÑ+EÔ&FÐW\ññ" #ð *×,Ñ,Ø$3×$@Ñ$@Ø+:×+NÑ+NØ!0×!:Ñ!:Ø#2×#>Ñ#>òð ð !+¨>Ñ :Ò ?¸aÜ! *¨\Ñ":Ò"?¸aÓ@ð "Ð"2Ñ3Ð?ô œ% 
Ð+;Ñ <Ó=¸qÔAàà"(ñ	ñ+
ô#ð #øôM ×Ñò OÜ˜CÐ!9ÀÔNÒNðOûô ò VÜ˜CÐ!=À_ÔUÒUðVús"   ‚0K  ³>L Ë !LÌLÌL!Ì L!c                 óê   — t         j                  j                  | j                  ¬«      j	                  t        d«      t        d«      ¬«      }t        dd|d   �t        |d   «      nd |d   d	œ¬
«      S )NrL   rq   rY   ©Úavg_tÚcntr’   z&Rating summary retrieved successfully.rØ   rÙ   )Úaverage_transporter_ratingr¶   rl   )	r   rQ   rR   rU   rÊ   r   r   r!   rÎ   )r…   Úaggs     rI   Útransporter_ratings_summaryrÜ     s{   € ô ×
Ñ
×
#Ñ
#°·±Ð
#Ó
=×
GÑ
GÜÐ&Ó'Ü�$‹Kð Hó €Cô ØØ0àADÀWÁÐAY¬%°°G±Ô*=Ð_cØ ™Jñ
ôð rW   c                 óÀ   — t         j                  j                  | j                  ¬«      j	                  d«      d d }t        ddt        |d¬«      j                  ¬«      S )	NrL   r�   r.   r’   r“   Tr”   rl   )r   rQ   rR   rU   rš   r!   r$   rm   )r…   r�   s     rI   Útransporter_ratings_receivedrÞ      sU   € ô 
×	Ñ	×	"Ñ	"¨w¯|©|Ð	"Ó	<×	EÑ	EÀmÓ	TÐUYÐVYÐ	Z€BÜ˜Ð>ÔEYÐZ\ÐcgÔEh×EmÑEmÔnÐnrW   c                 óÜ  — | j                   }t        j                  j                  |t        j                  j
                  ¬«      }|j                  «       }t        |«      }t        j                  j                  |«      j                  t        t        ddt        «       ¬«      «      t        d«      ¬«      }t        j                  j                  |«      j                  ddd	«      j                  d
«      j!                  «       }|d   }t#        |«      }t%        dd||�t'        t)        |«      d«      nd|d   xs d|d   |d   |d   |d   |d   t+        |d¬«      j,                  dœ	¬«      S )z>Performance summary for individual drivers (not fleet-linked).)rM   rz   rr   rq   )Úoutput_fieldrY   )Ú
avg_ratingr¶   ru   rE   Útrip__shipmentr�   rá   r’   z$Driver stats retrieved successfully.Nr/   r¶   r   r1   r2   r3   r4   r5   Tr”   )	Úcompleted_trips_countr¸   r¶   r1   r2   r3   r4   r5   rÈ   rl   )rU   r   rQ   rR   r{   r}   Úcountr\   r   rÊ   r   r   r   r   r9   rš   rS   rJ   r!   r>   rÎ   r"   rm   )	r…   rU   Úcompleted_tripsrã   Úreviews_filterrÒ   rÑ   r¸   rB   s	            rI   Úindividual_driver_statsrç   '  s]  € ð �<‰<€DÜ—l‘l×)Ñ)°dÄ4Ç;Á;×CXÑCXÐ)ÓY€OØ+×1Ñ1Ó3Ðä6°tÓ<€NÜ×#Ñ#×*Ñ*¨>Ó:×DÑDÜÜ�_Ð&:ÌËÔVó
ô ˜4“[ð	 Eó €Jô 	×Ñ×!Ñ! .Ó1ß	‰˜	 6Ð+;Ó	<ß	‰�-Ó	 ß	‰‹ð	 ð   Ñ-€NÜ% oÓ6€GäØØ.à%:ØAOÐA[œe¤E¨.Ó$9¸1Ô=ÐaeØ& ~Ñ6Ò;¸!Ø+2Ð3PÑ+QØ(/Ð0JÑ(KØ,3Ð4RÑ,SØ3:Ð;`Ñ3aØ")Ð*>Ñ"?Ü7¸	ÈÔM×RÑRñ

ôð rW   c                   ó*   — e Zd ZeegZeZd„ Zd„ Z	d„ Z
y)ÚSavedAddressListCreatec                 ój   — t         j                  j                  | j                  j                  ¬«      S ©NrT   ©r   rQ   rR   r…   rU   ©Úselfs    rI   Úget_querysetz#SavedAddressListCreate.get_querysetT  ó&   € Ü×#Ñ#×*Ñ*°·±×0AÑ0AÐ*ÓBÐBrW   c                 ót   — | j                  | j                  «       d¬«      }t        dd|j                  ¬«      S )NTr”   r’   z!Addresses retrieved successfully.rl   ©Úget_serializerrï   r!   rm   ©rî   r…   ÚargsÚkwargsr‡   s        rI   ÚlistzSavedAddressListCreate.listW  ó4   € Ø×!Ñ! $×"3Ñ"3Ó"5¸DÐ!ÓAˆÜ˜CÐ!DÈ3Ï8É8ÔTÐTrW   c                 óÒ  — | j                  |j                  ¬«      }|j                  «       st        dd|j                  ¬«      S |j                  |j                  ¬«      }|j                  rUt        j                  j                  |j                  d¬«      j                  |j                  ¬«      j                  d	¬
«       t        dd| j                  |«      j                  ¬«      S )Nrl   rf   rn   rd   rT   T©rU   Ú
is_defaultrp   F©rû   rw   zAddress saved successfully.)ró   rm   r€   r!   r�   ÚsaverU   rû   r   rQ   rR   Úexcluder_   Úupdate)rî   r…   rõ   rö   r‡   Úobjs         rI   r„   zSavedAddressListCreate.create[  s´   € Ø×!Ñ! w§|¡|Ð!Ó4ˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØ�h‰h˜GŸL™LˆhÓ)ˆØ�>Š>Ü× Ñ ×'Ñ'¨W¯\©\ÀdÐ'ÓK×SÑSÐWZ×W]ÑW]ÐSÓ^×eÑeÐqvÐeÔwÜ˜CÐ!>ÀT×EXÑEXÐY\ÓE]×EbÑEbÔcÐcrW   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r'   Úserializer_classrï   r÷   r„   © rW   rI   ré   ré   P  s%   „ Ø)¨9Ð5ÐØ-ÐòCòUódrW   ré   c                   ó0   — e Zd ZeegZeZd„ Zd„ Z	d„ Z
d„ Zy)ÚSavedAddressDetailc                 ój   — t         j                  j                  | j                  j                  ¬«      S rë   rì   rí   s    rI   rï   zSavedAddressDetail.get_queryseti  rð   rW   c                 óp   — | j                  «       }t        dd| j                  |«      j                  ¬«      S )Nr’   zAddress retrieved successfully.rl   )Ú
get_objectr!   ró   rm   )rî   r…   rõ   rö   r   s        rI   ÚretrievezSavedAddressDetail.retrievel  s0   € Ø�o‰oÓˆÜ˜CÐ!BÈ×I\ÑI\Ð]`ÓIa×IfÑIfÔgÐgrW   c                 ó  — |j                  dd«      }| j                  «       }| j                  ||j                  |¬«      }|j	                  «       st        dd|j                  ¬«      S |j                  «       }|j                  rUt        j                  j                  |j                  d¬«      j                  |j                  ¬«      j                  d	¬
«       t        dd| j                  |«      j                  ¬«      S )NÚpartialT)rm   r  rf   rn   rd   rú   rp   Frü   r’   zAddress updated successfully.rl   )Úpopr
  ró   rm   r€   r!   r�   rý   rû   r   rQ   rR   rU   rþ   r_   rÿ   )rî   r…   rõ   rö   r  r   r‡   Úupdateds           rI   rÿ   zSavedAddressDetail.updatep  sÍ   € Ø—*‘*˜Y¨Ó-ˆØ�o‰oÓˆØ×!Ñ! #¨G¯L©LÀ'Ð!ÓJˆØ�|‰|Œ~Ü Ð%9ÀÇÁÔLÐLØ—(‘(“*ˆØ×ÒÜ× Ñ ×'Ñ'¨W¯\©\ÀdÐ'ÓK×SÑSÐW^×WaÑWaÐSÓb×iÑiÐuzÐiÔ{Ü˜CÐ!@Àt×GZÑGZÐ[bÓGc×GhÑGhÔiÐirW   c                 óV   — | j                  «       j                  «        t        dd«      S )Nr’   zAddress deleted successfully.)r
  Údeleter!   )rî   r…   rõ   rö   s       rI   ÚdestroyzSavedAddressDetail.destroy{  s#   € Ø�‰Ó× Ñ Ô"Ü˜CÐ!@ÓAÐArW   N)r  r  r  r   r   r   r'   r  rï   r  rÿ   r  r  rW   rI   r  r  e  s+   „ Ø)¨9Ð5ÐØ-ÐòCòhò	jóBrW   r  c                   ó*   — e Zd ZeegZeZd„ Zd„ Z	d„ Z
y)ÚFavoriteTransporterListCreatec                 óˆ   — t         j                  j                  | j                  j                  ¬«      j                  d«      S )N)ru   rM   )r   rQ   rR   r…   rU   r9   rí   s    rI   rï   z*FavoriteTransporterListCreate.get_queryset„  s2   € Ü"×*Ñ*×1Ñ1¸$¿,¹,×:KÑ:KÐ1ÓL×[Ñ[Ð\iÓjÐjrW   c                 ót   — | j                  | j                  «       d¬«      }t        dd|j                  ¬«      S )NTr”   r’   z!Favorites retrieved successfully.rl   rò   rô   s        rI   r÷   z"FavoriteTransporterListCreate.list‡  rø   rW   c                 óŽ  — |j                   j                  d«      }|st        ddd¬«      S 	 t        j                  j                  t        |«      ¬«      }	 |j                  j                  t        j                  j                  k7  rt        dd
d¬«      S 	 t        j                  j                  |j                   |¬«      \  }}|rdnd}|rdnd}	t        ||	| j#                  |«      j                   ¬«      S # t        j                  t        t        f$ r t        ddd	¬«      cY S w xY w# t        $ r t        dd
d¬«      cY S w xY w)NrM   rf   z transporter user id is required.zMissing transporter.rd   rp   ra   r²   rc   rŽ   r�   )ru   rM   rw   r’   zFavorite added successfully.zFavorite already exists.rl   )rm   ry   r!   rƒ   rQ   r6   r;   Ú	TypeErrorÚ
ValueErrorr–   r   r—   r˜   r™   r   Úget_or_createrU   ró   )
rî   r…   rõ   rö   Útidrœ   r   ÚcreatedÚcodeÚmsgs
             rI   r„   z$FavoriteTransporterListCreate.create‹  s,  € Ø�l‰l×Ñ˜}Ó-ˆÙÜ Ð%GÐOeÔfÐfð	SÜ—‘× Ñ ¤C¨£HÐ Ó-ˆAð	ZØ�v‰v�{‰{œhŸm™m×7Ñ7Ò7Ü# CÐ)EÈ_Ô]Ð]ð 8ô +×2Ñ2×@Ñ@ÈÏÉÐcdÐ@Óe‰ˆˆWÙ‰s 3ˆÙ07Ñ,Ð=WˆÜ˜D #¨D×,?Ñ,?ÀÓ,D×,IÑ,IÔJÐJøô ×!Ñ!¤9¬jÐ9ò 	SÜ Ð%=À\ÔRÒRð	Sûô
 ò 	ZÜ Ð%AÈÔYÒYð	Zús#   ­)C8 Á>D* Ã8,D'Ä&D'Ä*EÅEN)r  r  r  r   r   r   r(   r  rï   r÷   r„   r  rW   rI   r  r  €  s%   „ Ø)¨9Ð5ÐØ4ÐòkòUóKrW   r  ÚDELETEc                 ó²   — t         j                  j                  || j                  ¬«      j	                  «       \  }}|st        ddd¬«      S t        dd«      S )N)r_   ru   ra   zFavorite not found.rc   rd   r’   zFavorite removed successfully.)r   rQ   rR   rU   r  r!   )r…   r_   ÚdeletedÚ_s       rI   Úfavorite_transporter_deleter#  ž  sQ   € ô %×,Ñ,×3Ñ3°rÀ7Ç<Á<Ð3ÓP×WÑWÓY�J€GˆQÙÜ˜CÐ!6¸lÔKÐKÜ˜Ð=Ó>Ð>rW   c                 ó„  — t        t        t        dd«      «      }t        j                  «       t        |¬«      z
  }t        j                  j                  | j                  |¬«      }|j                  «       }|j                  t        j                  j                  ¬«      j                  «       }|r||z  nd }t        j                  j                  | j                  ¬«      j                  t        d«      t!        d«      ¬	«      }t"        j                  j                  | j                  t"        j                  j$                  t"        j                  j&                  t"        j                  j(                  f|¬
«      }t+        |«      }	t-        dd||d   �t/        |d   «      nd |d   ||||	d   |	d   |	d   |	d   dœ
¬«      S )NÚ%ANALYTICS_TRANSPORTER_BID_WINDOW_DAYSéZ   ©Údays)rM   Úcreated_at__gte)rz   rL   rq   rY   r×   )rM   Ú
status__inÚupdated_at__gter’   z!Analytics retrieved successfully.rØ   rÙ   r0   r3   r4   r5   )
Úwindow_daysrÚ   r¶   Úbids_submitted_countÚbids_accepted_countÚacceptance_rater0   Ú/on_time_denominator_trips_with_schedule_and_podr4   r5   rl   )r6   r7   r8   r   Únowr   r   rQ   rR   rU   rä   r{   ÚACCEPTEDr   rÊ   r   r   r   r|   r}   r~   rJ   r!   rÎ   )
r…   r,  ÚsinceÚbidsÚ
total_bidsÚacceptedr/  rÛ   rå   rB   s
             rI   Útransporter_analyticsr7  §  s…  € ô ”gœkÐ+RÐTVÓWÓX€KÜ�L‰L‹NœY¨KÔ8Ñ8€EÜ�;‰;×Ñ¨'¯,©,ÈÐÓN€DØ—‘“€JØ�{‰{¤#§*¡*×"5Ñ"5ˆ{Ó6×<Ñ<Ó>€HÙ1;�x *Ò,À€Oä
×
Ñ
×
#Ñ
#°·±Ð
#Ó
=×
GÑ
GÜÐ&Ó'Ü�$‹Kð Hó €Cô
 —l‘l×)Ñ)Ø—L‘LÜ—K‘K×)Ñ)¬4¯;©;×+@Ñ+@Ä$Ç+Á+×BTÑBTÐUØð *ó €Oô
 & oÓ6€GäØØ+à&ØADÀWÁÐAY¬%°°G±Ô*=Ð_cØ ™JØ$.Ø#+Ø.Ø%,Ð-DÑ%EØ?FÐGeÑ?fØ3:Ð;`Ñ3aØ")Ð*>Ñ"?ñ
ôð rW   c                 óp  ‡‡— t        j                  «       Št        t        t        dd«      «      }‰t        |¬«      z   Šˆˆfd„}t        j                  j                  | j                  ¬«      }t        j                  j                  | j                  ¬«      }t        dd ||«       ||«      |d	œ¬
«      S )NÚDOCUMENT_REMINDER_DAYSé   r'  c                 óÒ   •— | j                  ‰‰¬«      j                  «       }| j                  ‰¬«      j                  «       }| j                  d¬«      j                  «       }|||dœS )N)Úexpiry_date__gteÚexpiry_date__lte)Úexpiry_date__ltT)Úexpiry_date__isnull)Úexpiring_within_windowÚexpiredÚno_expiry_set)rR   rä   )r�   ÚexpiringrA  ÚmissingÚhorizonÚtodays       €€rI   Ú_countsz/transporter_compliance_summary.<locals>._countsÖ  s^   ø€ Ø—9‘9¨eÀg�9ÓN×TÑTÓVˆØ—)‘)¨E�)Ó2×8Ñ8Ó:ˆØ—)‘)°�)Ó5×;Ñ;Ó=ˆØ*2¸wÐY`ÑaÐarW   rT   )Úvehicle__ownerr’   z*Compliance summary retrieved successfully.)Úkyc_documentsÚvehicle_documentsÚdocument_reminder_horizon_daysrl   )r   Ú	localdater6   r7   r8   r   r   rQ   rR   rU   r   r!   )r…   Úhorizon_daysrG  ÚkycÚvdocrE  rF  s        @@rI   Útransporter_compliance_summaryrP  Ï  s¡   ù€ ô ×ÑÓ €EÜ”wœ{Ð,DÀbÓIÓJ€LØ”i \Ô2Ñ2€Gõbô ×
Ñ
×
$Ñ
$¨'¯,©,Ð
$Ó
7€CÜ×"Ñ"×)Ñ)¸¿¹Ð)ÓF€DÜØØ4á$ S›\Ù!(¨£Ø.:ñ
ôð rW   N)KÚ__doc__Údatetimer   Údjango.confr   r8   Údjango.contrib.authr   Údjango.db.modelsr   r   r   r	   r
   Údjango.db.models.functionsr   Údjango.utilsr   Úrest_frameworkr   Úrest_framework.decoratorsr   r   Úrest_framework.permissionsr   Úaccounts.modelsr   r   r   r   Úcore.modelsr   r   r   r   r   r   r   Úpermissionsr   r   r   r    Úresponser!   Úserializersr"   r#   r$   r%   r&   r'   r(   rƒ   rJ   rV   r\   r‹   rž   r¤   rª   r­   r¯   rÕ   rÜ   rÞ   rç   ÚListCreateAPIViewré   ÚRetrieveUpdateDestroyAPIViewr  r  r#  r7  rP  r  rW   rI   ú<module>rb     sÝ  ðÙ 9Ý å /Ý .ß ;Õ ;Ý /Ý !Ý #ß BÝ 6ç KÓ Kß t× tÑ tß jÓ jÝ "÷÷ ñ ñ Ó€ò òFòHñ
 
ˆ6ˆ(ÓÙ�_ iÐ0Ó1ñdó 2ó ðdñ@ 
ˆ5ˆ'ÓÙ�_ iÐ0Ó1ñoó 2ó ðoò%kñP 
ˆ6ˆ(ÓÙ�_ mÐ4Ó5ñOó 6ó ðOñ
 
ˆ6ˆ(ÓÙ�_Ð&>Ð?Ó@ñSó Aó ðSñ
 
ˆ6ˆ(ÓÙ�_Ð&CÐDÓEñOó Fó ðOñ
 
ˆ5ˆ'ÓÙ�_Ð%Ó&ñLó 'ó ðLñ^ 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñó 6ó ðñ 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñoó 6ó ðoñ
 
ˆ5ˆ'ÓÙ�_Ð&CÐDÓEñ$ó Fó ð$ôNd˜X×7Ñ7ô dô*B˜×>Ñ>ô Bô6K H×$>Ñ$>ô Kñ< 
ˆ8ˆ*ÓÙ�_ iÐ0Ó1ñ?ó 2ó ð?ñ 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñ#ó 6ó ð#ñL 
ˆ5ˆ'ÓÙ�_ mÐ4Ó5ñó 6ó ñrW   