From b340dc3956f2148ff65fb58180a6d5691a8ac276 Mon Sep 17 00:00:00 2001
From: Ishaan Mittal <ishaanmittal123@gmail.com>
Date: Sat, 21 Dec 2024 02:45:50 +0530
Subject: [PATCH] improve and clean the rebate view(Error Prone)

---
 home/signals.py                  |  26 +++--
 home/utils/month.py              |   2 +-
 home/utils/rebate_bills_saver.py |   2 +-
 home/views.py                    | 177 +++++++++++++++----------------
 4 files changed, 103 insertions(+), 104 deletions(-)

diff --git a/home/signals.py b/home/signals.py
index b4523e6..5f7be3d 100644
--- a/home/signals.py
+++ b/home/signals.py
@@ -37,19 +37,24 @@ def create_bill(sender, instance, created, **kwargs):
 
 
 @receiver(post_save, sender=Rebate)
-def direct_update_bill(sender, instance, created, **kwargs):
+def direct_update_bill(sender, instance: Rebate, created, **kwargs):
+    logger.info("Signal called for Creating Short Rebate")
     try:
         if created:
-            email = instance.email
+            student = instance.email
             allocation = instance.allocation_id
             start_date = instance.start_date
             end_date = instance.end_date
             days = count(start_date, end_date)
             save_short_bill(
-                email, allocation.period, days, allocation.high_tea, allocation.caterer
+                student,
+                allocation.period,
+                days,
+                allocation.high_tea,
+                allocation.caterer,
             )
             rebate_mail(
-                instance.start_date, instance.end_date, instance.approved, email.email
+                instance.start_date, instance.end_date, instance.approved, student.email
             )
             logger.info("Saved")
     except Exception as e:
@@ -57,8 +62,8 @@ def direct_update_bill(sender, instance, created, **kwargs):
 
 
 @receiver(pre_save, sender=Rebate)
-def update_short_bill(sender, instance, **kwargs):
-    logger.info("Signal called for Short Rebate")
+def update_short_bill(sender, instance: Rebate, **kwargs):
+    logger.info("Signal called for Updating Short Rebate")
     try:
         old_instance = Rebate.objects.get(pk=instance.pk)
         if old_instance.approved != instance.approved:
@@ -67,8 +72,10 @@ def update_short_bill(sender, instance, **kwargs):
             start_date = instance.start_date
             end_date = instance.end_date
             days = count(start_date, end_date)
+            if days < 0:
+                raise ValueError("Days are negative")
             logger.info(old_instance.approved, instance.approved)
-            if instance.approved is True and days > 0:
+            if instance.approved is True:
                 save_short_bill(
                     email,
                     allocation.period,
@@ -94,10 +101,11 @@ def update_short_bill(sender, instance, **kwargs):
 
 
 @receiver(pre_save, sender=LongRebate)
-def update_long_bill(sender, instance, **kwargs):
+def update_long_bill(sender, instance: LongRebate, **kwargs):
+    logger.info("Signal called for Updating Long Rebate")
     try:
         old_instance = LongRebate.objects.get(pk=instance.pk)
-        logger.info(old_instance.approved, instance.approved)
+        logger.info(instance.approved, instance.reason)
         if (
             old_instance.approved != instance.approved
             or old_instance.reason != instance.reason
diff --git a/home/utils/month.py b/home/utils/month.py
index 56b10fd..3f66139 100644
--- a/home/utils/month.py
+++ b/home/utils/month.py
@@ -28,7 +28,7 @@ def fill_periods(email, start_date, end_date):
             days_per_period.append((period, days_in_period))
             current_date = current_date + timedelta(days=days_in_period)
 
-    if current_date <= end_date and (end_date - current_date).days + 1 > 0:
+    if current_date <= end_date:
         days_per_period.append((current_date, end_date))
 
     for period_no, days in days_per_period:
diff --git a/home/utils/rebate_bills_saver.py b/home/utils/rebate_bills_saver.py
index 4454f5b..583bd2c 100644
--- a/home/utils/rebate_bills_saver.py
+++ b/home/utils/rebate_bills_saver.py
@@ -12,7 +12,7 @@
 )
 
 
-def save_short_bill(student, period, days, high_tea, caterer):
+def save_short_bill(student: Student, period: Period, days, high_tea, caterer):
     rebate = StudentBills.objects.get(email=student, semester=period.semester)
     print(caterer, student)
     catererBill = CatererBills.objects.get(caterer=caterer, semester=period.semester)
diff --git a/home/views.py b/home/views.py
index e4becc7..3c47fe9 100644
--- a/home/views.py
+++ b/home/views.py
@@ -151,117 +151,108 @@ def rebate(request):
 
     :template:`rebateForm.html`
     """
-    text = ""
-    list = []
+    message = ""
     period_obj = None
-    allocation_id = None
+    allocation = None
     try:
-        student = Student.objects.filter(email__iexact=str(request.user.email))
-        try:
-            for period in Period.objects.all():
-                if period.end_date > date.today() + timedelta(1):
-                    period_obj = period
-                    try:
-                        allocation_id = Allocation.objects.get(
-                            email__email__iexact=str(request.user.email), period=period
-                        )
-                        break
-                    except:
-                        continue
-            key = str(allocation_id.student_id)
-        except Exception as e:
-            logger.error(e)
-            key = "You are not allocated for current period, please contact the dining warden to allocate you to a caterer"
+        student = Student.objects.get(email__iexact=request.user.email)
     except Student.DoesNotExist:
-        key = "Signed in account does not does not have any allocation ID"
+        message = "Signed in account does not have any allocation ID"
+        return render(request, "rebateForm.html", {"text": message})
+
+    try:
+        period_obj = next(
+            period
+            for period in Period.objects.all()
+            if period.end_date > date.today() + timedelta(1)
+        )
+        allocation = Allocation.objects.get(
+            email__iexact=request.user.email, period=period_obj
+        )
+    except Exception as e:
+        logger.error(e)
+        message = "You are not allocated for current period, please contact the dining warden to allocate you to a caterer"
     if request.method == "POST" and request.user.is_authenticated:
-        if not period_obj or not allocation_id:
-            text = "You are not allocated for current period, please contact the dining warden to allocate you to a caterer"
-            request.session["text"] = text
+        if not period_obj or not allocation:
+            message = "You are not allocated for current period, please contact the dining warden to allocate you to a caterer"
+            request.session["text"] = message
             return redirect(request.path)
+
         try:
             start_date = parse_date(request.POST["start_date"])
             end_date = parse_date(request.POST["end_date"])
             rebate_days = ((end_date - start_date).days) + 1
             before_rebate_days = (start_date - date.today()).days
-            try:
-                student = Student.objects.filter(
-                    email__iexact=str(request.user.email)
-                ).first()
-                period = period_obj.Sno
-                period_start = period_obj.start_date
-                period_end = period_obj.end_date
-                if rebate_days > 7:
-                    text = "Max no of days for rebate is 7"
-                elif before_rebate_days < 2:
-                    text = "Form needs to be filled atleast 2 days prior the comencement of leave."
-                elif not is_not_duplicate(student, start_date, end_date):
-                    text = "You have already applied for rebate during this duration"
-                elif 0 < rebate_days < 2:
-                    text = "Min no of days for rebate is 2"
-                else:
-                    additional_text = ""
-                    if not period_start <= start_date <= period_end:
-                        short_left_rebate = LeftShortRebate(
-                            email=student.email,
-                            start_date=start_date,
-                            end_date=end_date,
-                            date_applied=date.today(),
-                        )
+
+            if rebate_days > 7:
+                message = "Max no of days for rebate is 7"
+            elif before_rebate_days < 2:
+                message = "Form needs to be filled atleast 2 days prior the comencement of leave."
+            elif not is_not_duplicate(student, start_date, end_date):
+                message = "You have already applied for rebate during this duration"
+            elif 0 < rebate_days < 2:
+                message = "Min no of days for rebate is 2"
+            else:
+                additional_message = ""
+                if not period_obj.start_date <= start_date <= period_obj.end_date:
+                    short_left_rebate = LeftShortRebate(
+                        email=student.email,
+                        start_date=start_date,
+                        end_date=end_date,
+                        date_applied=date.today(),
+                    )
+                    short_left_rebate.save()
+                    message = "You have successfully submitted the rebate, it will get added to your bills in the next period."
+                    upper_cap_check = -1
+                elif not period_obj.start_date <= end_date <= period_obj.end_date:
+                    short_left_rebate = LeftShortRebate(
+                        email=student.email,
+                        start_date=period_obj.end_date + timedelta(days=1),
+                        end_date=end_date,
+                        date_applied=date.today(),
+                    )
+                    end_date = period_obj.end_date
+                    upper_cap_check = max_days_rebate(
+                        student, start_date, period_obj.end_date, period_obj
+                    )
+                    if upper_cap_check < 0:
                         short_left_rebate.save()
-                        text = "You have successfully submitted the rebate, it will get added to your bills in the next period."
-                        upper_cap_check = -1
-                    elif not period_start <= end_date <= period_end:
-                        short_left_rebate = LeftShortRebate(
-                            email=student.email,
-                            start_date=period_end + timedelta(days=1),
-                            end_date=end_date,
-                            date_applied=date.today(),
-                        )
-                        end_date = period_end
-                        upper_cap_check = max_days_rebate(
-                            student, start_date, period_end, period_obj
-                        )
-                        if upper_cap_check < 0:
-                            short_left_rebate.save()
-                        additional_text = " Note: The days after the current period end date will be added to your bills in the next period."
-                    else:
-                        upper_cap_check = max_days_rebate(
-                            student, start_date, end_date, period_obj
-                        )
-                    if upper_cap_check >= 0:
-                        text = (
-                            "You can only apply for max 8 days in a period. Days left for this period: "
-                            + str(upper_cap_check)
-                        )
-                    elif text == "":
-                        r = Rebate(
-                            email=student,
-                            allocation_id=allocation_id,
-                            start_date=start_date,
-                            end_date=end_date,
-                            approved=True,
-                        )
-                        r.save()
-                        text = "You have successfully submitted the rebate. Thank You! You shall recieve a confirmation mail, If not please contact the Dining Warden."
-                        if additional_text:
-                            text += additional_text
-                    elif not text:
-                        text = "Your rebate application has been rejected due to non-compliance of the short term rebate rules"
-            except Allocation.DoesNotExist:
-                text = "Email ID does not match with the allocation ID"
+                        additional_message = " Note: The days after the current period end date will be added to your bills in the next period."
+                else:
+                    upper_cap_check = max_days_rebate(
+                        student, start_date, end_date, period_obj
+                    )
+                if upper_cap_check >= 0:
+                    message = (
+                        "You can only apply for max 8 days in a period. Days left for this period: "
+                        + str(upper_cap_check)
+                    )
+                elif not message:
+                    rebate = Rebate(
+                        email=student,
+                        allocation_id=allocation,
+                        start_date=start_date,
+                        end_date=end_date,
+                        approved=True,
+                    )
+                    rebate.save()
+                    message = "You have successfully submitted the rebate. Thank You! You shall recieve a confirmation mail, If not please contact the Dining Warden."
+                    if additional_message:
+                        message += additional_message
+                elif not message:
+                    message = "Your rebate application has been rejected due to non-compliance of the short term rebate rules"
         except Exception as e:
             logger.error(e)
-            text = (
+            message = (
                 "Ohh No! an unknown ERROR occured, Please inform about it immediatly to the Dining Wadern. Possible Error: "
-                + key
+                + str(e)
             )
-        request.session["text"] = text
+        request.session["text"] = message
         return redirect(request.path)
     text = request.session.get("text", "")
     if text != "":
         del request.session["text"]
-    context = {"text": text, "key": key, "list": list}
+    context = {"text": text, "key": allocation.student_id}
     return render(request, "rebateForm.html", context)
 
 
@@ -336,7 +327,7 @@ def addLongRebateBill(request):
                     text = "Long Term rebate added Successfully"
                 except Exception as e:
                     text = "An error occurred while processing your form submission. If you're submitting an application, try compressing it before resubmitting. If the issue persists, please report it to the admin."
-                    print(e)
+                    logger.error(e)
         except Exception as e:
             logger.error(e)
             text = "Email ID does not exist in the database. Please login using the correct email ID"