Ë
    ;½Tj£"  ã                   óz  — 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 e
j                  j                   e
j                  j"                  fZej&                  Zej*                  ZdZd„ Zdd	œd
ededefd„Zdd	œd
ededefd„Zdededdfd„Zdededdfd„Zdefd„Z dedefd„Z!defd„Z"e"Z#de$fd„Z%y)zFDocument expiry FCM reminders for fleet owners and individual drivers.é    )Ú	timedelta)Úsettings)Útimezone)ÚDocumentExpiryReminderLogÚKYCDocumentÚTransporterProfileÚUserRoleÚVehicleDocument)Únotify_usersc                  óH   — t        t        dd«      } t        d„ | D «       «      S )NÚ$DOCUMENT_EXPIRY_REMINDER_DAYS_BEFORE)é   é   é   c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w)N)Úint)Ú.0Úds     ú</var/www/html/truck-me/accounts/document_expiry_reminders.pyú	<genexpr>z(_reminder_days_before.<locals>.<genexpr>   s   è ø€ Ò%˜A”�Q—Ñ%ùs   ‚)Úgetattrr   Útuple)Úraws    r   Ú_reminder_days_beforer      s"   € Ü
”(ÐBÀJÓ
O€CÜÑ% Ô%Ó%Ð%ó    N©ÚtodayÚdocument_labelÚdays_beforeÚreturnc                ó¦   — |xs t        j                  «       }||k  r	d| › d|› d�S |t        k(  r	d| › d|› d�S |dk(  r	d| › d|› d�S d| › d|› d	|› d
�S )NzYour z expired on ú. Please update it.z expires today (ú).r   z expires tomorrow (z expires in ú	 days on ú.©r   Ú	localdateÚHOURLY_DAYS_BEFORE©r   Úexpiry_dater   r   s       r   Ú_expiry_reminder_bodyr+       s�   € ØÒ)”X×'Ñ'Ó)€EØ�UÒØ�~Ð& l°;°-Ð?RÐSÐSØÔ(Ò(Ø�~Ð&Ð&6°{°mÀ2ÐFÐFØ�aÒØ�~Ð&Ð&9¸+¸ÀbÐIÐIØ�>Ð" ,¨{¨m¸9À[ÀMÐQRÐSÐSr   c                ó¦   — |xs t        j                  «       }||k  r	d| › d|› d�S |t        k(  r	d| › d|› d�S |dk(  r	d| › d|› d�S d| › d|› d	|› d
�S )NzA vehicle document (z) expired on r"   z) expires today (r#   r   z) expires tomorrow (z) expires in r$   r%   r&   r)   s       r   Ú_vehicle_expiry_reminder_bodyr-   +   s”   € ØÒ)”X×'Ñ'Ó)€EØ�UÒØ% nÐ%5°]À;À-ÐObÐcÐcØÔ(Ò(Ø% nÐ%5Ð5FÀ{ÀmÐSUÐVÐVØ�aÒØ% nÐ%5Ð5IÈ+ÈÐVXÐYÐYØ! .Ð!1°¸{¸mÈ9ÐU`ÐTaÐabÐcÐcr   Úreminder_hourc                ó¼  — | j                  «       }dt        | j                  «      t        | j                  «      | j                  j                  «       t        |«      dœ}|dk\  r!t        |«      |d<   |j                  «       |d<   | j                  |k  rd|d<   t        | j                  gd|| j                  |k\  rd	nd
t        || j                  ||¬«      ¬«       y )NÚKYC)ÚkindÚdocument_idÚdocument_typer*   r   r   r.   Úreminder_onÚtrueÚexpiredÚDOCUMENT_EXPIRINGzDocument expiringzDocument expiredr   ©ÚtitleÚbody)	Úget_document_type_displayÚstrÚpkr3   r*   Ú	isoformatr   Úuser_idr+   ©Údocr   r.   r4   r   ÚlabelÚpayloads          r   Ú_notify_kyc_expiryrD   6   sÈ   € Ø×)Ñ)Ó+€EàÜ˜3Ÿ6™6“{Ü˜S×.Ñ.Ó/Ø—‘×0Ñ0Ó2Ü˜;Ó'ñ€Gð ˜ÒÜ#& }Ó#5ˆ�Ñ Ø!,×!6Ñ!6Ó!8ˆ�ÑØ
‡�˜ÒØ#ˆ�	ÑÜØ	�‰ˆØØØ%(§_¡_¸Ò%=Ñ!ÐCUÜ" 5¨#¯/©/¸;ÈeÔTör   c                óø  — | j                  «       }dt        | j                  «      t        | j                  «      t        | j                  «      | j
                  j                  «       t        |«      dœ}|dk\  r!t        |«      |d<   |j                  «       |d<   | j
                  |k  rd|d<   t        | j                  j                  gd|| j
                  |k\  rd	nd
t        || j
                  ||¬«      ¬«       y )NÚVEHICLE)r1   r2   Ú
vehicle_idr3   r*   r   r   r.   r4   r5   r6   r7   zVehicle document expiringzVehicle document expiredr   r8   )r;   r<   r=   rG   r3   r*   r>   r   ÚvehicleÚowner_idr-   r@   s          r   Ú_notify_vehicle_expiryrJ   M   sÜ   € Ø×)Ñ)Ó+€EàÜ˜3Ÿ6™6“{Ü˜#Ÿ.™.Ó)Ü˜S×.Ñ.Ó/Ø—‘×0Ñ0Ó2Ü˜;Ó'ñ€Gð ˜ÒÜ#& }Ó#5ˆ�Ñ Ø!,×!6Ñ!6Ó!8ˆ�ÑØ
‡�˜ÒØ#ˆ�	ÑÜØ	�‰×	Ñ	ÐØØØ-0¯_©_ÀÒ-EÑ)ÐKeÜ*¨5°#·/±/À;ÐV[Ô\ör   c                 óh   — t         j                  j                  | |||||¬«      \  }}|sy |«        y)N)r1   r2   r*   r   r.   r4   FT)r   ÚobjectsÚget_or_create)	r1   r2   r*   r   r.   r4   Ú	notify_fnÚ_Úcreateds	            r   Ú_try_send_reminderrQ   e   sF   € ô +×2Ñ2×@Ñ@ØØØØØ#Øð Aó �J€A€wñ ØÙ„KØr   c                 ó  — t        j                  «       }|t        | ¬«      z   }d}t        j                  j                  t        j                  j                  t        |¬«      j                  d«      }|j                  «       D ]S  }t        t        j                  j                  |j                   |j"                  | t$        t&        || |fd„¬«      sŒO|dz  }ŒU t(        j                  j                  t        j                  j                  t        |¬«      j                  d	«      }|j                  «       D ]S  }t        t        j                  j*                  |j                   |j"                  | t$        t&        || |fd
„¬«      sŒO|dz  }ŒU |S )zQNotify transporters whose documents expire exactly `days_before` days from today.)Údaysr   )Úuser__role__roleÚ+user__transporter_profile__account_type__inr*   Úuserc                 ó2   — t        | |t        t        |¬«      S ©N)r   r.   r4   r   )rD   ÚDAY_WINDOW_HOURÚDAY_WINDOW_ON©r   ÚdbÚtds      r   ú<lambda>z@send_document_expiry_reminders_for_days_before.<locals>.<lambda>‘   s   € Ô>PØØÜ-Ü)Øô?€ r   ©r1   r2   r*   r   r.   r4   rN   r   )Úvehicle__owner__role__roleÚ5vehicle__owner__transporter_profile__account_type__inr*   Úvehicle__ownerc                 ó2   — t        | |t        t        |¬«      S rX   )rJ   rY   rZ   r[   s      r   r^   z@send_document_expiry_reminders_for_days_before.<locals>.<lambda>©   s   € Ô>TØØÜ-Ü)Øô?€ r   )r   r'   r   r   rL   Úfilterr	   ÚRoleÚTRANSPORTERÚ TRANSPORTER_EXPIRY_ACCOUNT_TYPESÚselect_relatedÚiteratorrQ   r   ÚDocKindr0   r=   r*   rY   rZ   r
   rF   )r   r   Útarget_dateÚsentÚkyc_qsrA   Úvdoc_qss          r   Ú.send_document_expiry_reminders_for_days_beforero   }   sd  € ä×ÑÓ €EØœ)¨Ô5Ñ5€KØ€Dä× Ñ ×'Ñ'Ü!Ÿ™×2Ñ2Ü4TØð (ó ÷ �n�VÓð	 ð �‰Ó ò ˆÜÜ*×2Ñ2×6Ñ6ØŸ™ØŸ™Ø#Ü)Ü%Ø" {°uò ö
ð �A‰I‰Dð!ô$ ×%Ñ%×,Ñ,Ü#+§=¡=×#<Ñ#<Ü>^Øð -ó ÷ �nÐ%Ó&ð	 ð ×ÑÓ!ò ˆÜÜ*×2Ñ2×:Ñ:ØŸ™ØŸ™Ø#Ü)Ü%Ø" {°uò ö
ð �A‰I‰Dð!ð$ €Kr   c                  ó*  — t        j                  «       } t        j                  «       j                  }d}t        j
                  j                  t        j                  j                  t        | ¬«      j                  d«      }|j                  «       D ]O  }t        t        j                  j                   |j"                  |j$                  t&        || ||| fd„¬«      sŒK|dz  }ŒQ t(        j
                  j                  t        j                  j                  t        | ¬«      j                  d«      }|j                  «       D ]O  }t        t        j                  j*                  |j"                  |j$                  t&        || ||| fd	„¬«      sŒK|dz  }ŒQ |S )
z¹
    On expiry day and after: at most one reminder per document per local hour per day.
    Celery may run every minute; idempotency uses (expiry_date, reminder_hour, reminder_on).
    r   )rT   rU   Úexpiry_date__lterV   c                 ó*   — t        | t        |||¬«      S rX   )rD   r(   ©r   Úrhr]   s      r   r^   z.send_expiry_hourly_reminders.<locals>.<lambda>Í   s   € Ô@RØÜ.Ø ØØôA€ r   r_   r   )r`   ra   rq   rb   c                 ó*   — t        | t        |||¬«      S rX   )rJ   r(   rs   s      r   r^   z.send_expiry_hourly_reminders.<locals>.<lambda>å   s   € Ô@VØÜ.Ø ØØôA€ r   )r   r'   Ú	localtimeÚhourr   rL   rd   r	   re   rf   rg   rh   ri   rQ   r   rj   r0   r=   r*   r(   r
   rF   )r   r.   rl   rm   rA   rn   s         r   Úsend_expiry_hourly_remindersrx   ¶   sk  € ô
 ×ÑÓ €EÜ×&Ñ&Ó(×-Ñ-€MØ€Dä× Ñ ×'Ñ'Ü!Ÿ™×2Ñ2Ü4TØð (ó ÷ �n�VÓð	 ð �‰Ó ò ˆÜÜ*×2Ñ2×6Ñ6ØŸ™ØŸ™Ü*Ø'ØØ" }¸ò ö
ð �A‰I‰Dð!ô$ ×%Ñ%×,Ñ,Ü#+§=¡=×#<Ñ#<Ü>^Øð -ó ÷ �nÐ%Ó&ð	 ð ×ÑÓ!ò ˆÜÜ*×2Ñ2×:Ñ:ØŸ™ØŸ™Ü*Ø'ØØ" }¸ò ö
ð �A‰I‰Dð!ð$ €Kr   c                  ó€   — i ddœ} t        t        «       d¬«      D ]  }t        |«      | d   |<   Œ t        «       | d<   | S )z=Run day-window reminders (31/7/1) and hourly on/after expiry.r   )r   Úexpiry_hourlyT)Úreverser   rz   )Úsortedr   ro   rx   )Úresultsr   s     r   Ú!run_all_document_expiry_remindersr~   ö   sO   € à °1Ñ5€GÜÔ3Ó5¸tÔDò jˆÜ.\Ð]hÓ.iˆ�Ñ˜{Ò+ðjä;Ó=€GˆOÑØ€Nr   )&Ú__doc__Údatetimer   Údjango.confr   Údjango.utilsr   Úaccounts.modelsr   r   r   r	   r
   Ú
api.notifyr   ÚAccountTypeÚDRIVERÚFLEET_OWNERrg   ÚREMINDER_HOUR_DAY_WINDOWrY   ÚREMINDER_ON_DAY_WINDOWrZ   r(   r   r<   r   r+   r-   rD   rJ   ÚboolrQ   ro   rx   Ú send_expiry_day_hourly_remindersÚdictr~   © r   r   ú<module>rŽ      s3  ðÙ Lå å  Ý !÷õ õ $ð ×"Ñ"×)Ñ)Ø×"Ñ"×.Ñ.ð$Ð  ð
 ,×DÑD€Ø)×@Ñ@€ØÐ ò&ð
 X\ò T¨#ð TÈð TÐ`có Tð `dò d°#ð dÐQTð dÐhkó dð¨Cð Àð Ð\`ó ð.°ð ÀCð Ð`dó ð0ð 
óð06Àð 6Èó 6ðr9 có 9ðz $@Ð  ð¨4ô r   