From d0a8408121036131ec8ab06934574bcef7e0c83d Mon Sep 17 00:00:00 2001 From: i701 Date: Tue, 8 Jul 2025 16:00:30 +0500 Subject: [PATCH] =?UTF-8?q?feat(payment):=20update=20periodic=20task=20to?= =?UTF-8?q?=20run=20every=20minute=20and=20improve=20SMS=20notification=20?= =?UTF-8?q?handling=20for=20expired=20topups=20=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- billing/tasks.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/billing/tasks.py b/billing/tasks.py index 6c26cb1..1df796f 100644 --- a/billing/tasks.py +++ b/billing/tasks.py @@ -11,13 +11,18 @@ logger = logging.getLogger(__name__) @app.periodic( - cron="*/30 * * * * *", periodic_id="notify_expired_topups", queue="heavy_tasks" -) # every 30 seconds + cron="*/1 * * * * *", periodic_id="notify_expired_topups", queue="heavy_tasks" +) # every 1 minute @app.task def update_expired_topups(timestamp: int): expired_topups_qs = Topup.objects.filter( - expires_at__lte=timezone.now(), expiry_notification_sent=False, paid=False + expires_at__lte=timezone.now(), + expiry_notification_sent=False, + paid=False, ).select_related("user") + if not expired_topups_qs.exists(): + logger.info("No expired topups found.") + return {"total_expired_topups": 0} with transaction.atomic(): count = expired_topups_qs.count() @@ -30,22 +35,29 @@ def update_expired_topups(timestamp: int): amount=topup.amount, topup_id=str(topup.id), created_at=localtime(topup.created_at).isoformat(), + user=f"{topup.user.first_name + ' ' + topup.user.last_name}" + if topup.user.last_name and topup.user.first_name + else "User", ) + topup.expiry_notification_sent = True + topup.save() else: # Mark as notified even if we can't send SMS (no mobile number) topup.expiry_notification_sent = True topup.save() + return return { "total_expired_topups": count, } -# Assuming you have a separate task for sending SMS if you go that route @app.task -def send_sms_task(mobile: str, amount: float, topup_id: str, created_at: str): +def send_sms_task( + user: str, mobile: str, amount: float, topup_id: str, created_at: str +): message = ( - f"Dear {mobile}, \n\nYour topup of {amount} MVR [created at {created_at}] has expired. " + f"Dear {user}, \n\nYour topup of {amount} MVR [created at {created_at}] has expired. " "Please make a new topup to update your wallet. \n\n- SAR Link" ) send_sms(mobile, message)