From fd18cd13676e367668974959b9ca4f49f78e8945 Mon Sep 17 00:00:00 2001 From: Horilla Date: Wed, 28 Aug 2024 10:03:36 +0530 Subject: [PATCH] [UPDT] LEAVE: Add leave type with infinite number of days and apply as default to all employees option --- leave/forms.py | 38 ++++++++++++++ leave/models.py | 5 +- leave/templates/leave/job_position_field.html | 2 +- .../leave/leave_type/leave_type_creation.html | 51 +++++++++++++------ .../leave/leave_type/leave_type_update.html | 25 ++++++++- leave/views.py | 2 +- 6 files changed, 101 insertions(+), 22 deletions(-) diff --git a/leave/forms.py b/leave/forms.py index 80f9c8df0..0c58b959c 100644 --- a/leave/forms.py +++ b/leave/forms.py @@ -3,6 +3,7 @@ including leave type, leave request, leave allocation request, holidays and company leaves. """ +import math import re import uuid from datetime import date, datetime @@ -160,6 +161,18 @@ def __init__(self, *args, **kwargs): class LeaveTypeForm(ConditionForm): + employee_id = HorillaMultiSelectField( + queryset=Employee.objects.all(), + widget=HorillaMultiSelectWidget( + filter_route_name="employee-widget-filter", + filter_class=EmployeeFilter, + filter_instance_contex_name="f", + filter_template_path="employee_filters.html", + required=False, + ), + label="Employee", + ) + class Meta: model = LeaveType fields = "__all__" @@ -179,8 +192,22 @@ def clean(self): del self.errors["employee_id"] if "exceed_days" in self.errors: del self.errors["exceed_days"] + cleaned_data["total_days"] = round(cleaned_data["total_days"] * 2) / 2 + if not cleaned_data["limit_leave"]: + cleaned_data["total_days"] = math.inf return cleaned_data + def save(self, *args, **kwargs): + leave_type = super().save(*args, **kwargs) + if employees := self.data.getlist("employee_id"): + for employee_id in employees: + employee = Employee.objects.get(id=employee_id) + AvailableLeave( + leave_type_id=leave_type, + employee_id=employee, + available_days=leave_type.total_days, + ).save() + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -217,8 +244,19 @@ def clean(self): cleaned_data = super().clean() if "exceed_days" in self.errors: del self.errors["exceed_days"] + cleaned_data["count"] = round(cleaned_data["count"] * 2) / 2 + if not cleaned_data["limit_leave"]: + cleaned_data["count"] = math.inf + return cleaned_data + def save(self, *args, **kwargs): + leave_type = super().save(*args, **kwargs) + + AvailableLeave.objects.filter(leave_type_id=leave_type).update( + total_leave_days=leave_type.count + ) + def cal_effective_requested_days(start_date, end_date, leave_type_id, requested_days): requested_dates = leave_requested_dates(start_date, end_date) diff --git a/leave/models.py b/leave/models.py index f63ae8988..0ec994ab8 100644 --- a/leave/models.py +++ b/leave/models.py @@ -163,9 +163,10 @@ class LeaveType(HorillaModel): name = models.CharField(max_length=30, null=False) color = models.CharField(null=True, max_length=30) payment = models.CharField(max_length=30, choices=PAYMENT, default="unpaid") - count = models.IntegerField(null=True, default=1) + count = models.FloatField(null=True, default=1) period_in = models.CharField(max_length=30, choices=TIME_PERIOD, default="day") - total_days = models.IntegerField(null=True, default=1) + limit_leave = models.BooleanField(default=True) + total_days = models.FloatField(null=True, default=1) reset = models.BooleanField(default=False) is_encashable = models.BooleanField(default=False, verbose_name=_("Is encashable")) reset_based = models.CharField( diff --git a/leave/templates/leave/job_position_field.html b/leave/templates/leave/job_position_field.html index 895fa025c..49b665e0b 100644 --- a/leave/templates/leave/job_position_field.html +++ b/leave/templates/leave/job_position_field.html @@ -6,4 +6,4 @@ {% endif %} {{form.job_position}} {{form.job_position.errors}} - \ No newline at end of file + diff --git a/leave/templates/leave/leave_type/leave_type_creation.html b/leave/templates/leave/leave_type/leave_type_creation.html index d8bd4b1af..86cd289c1 100644 --- a/leave/templates/leave/leave_type/leave_type_creation.html +++ b/leave/templates/leave/leave_type/leave_type_creation.html @@ -55,7 +55,19 @@

{% trans "Create Leave Type" %} -
+
+
+
+ + +
+
+ {{form.limit_leave}} + {{form.limit_leave.errors}} +
+
+
+
{{form.count}} @@ -76,7 +88,7 @@

{% trans "Create Leave Type" %}

-
+
@@ -94,8 +106,8 @@

{% trans "Create Leave Type" %}{% trans "Reset Period" %}

- {{ form.reset_based }} - {{ form.reset_based.errors }} + {{ form.reset_based }} + {{ form.reset_based.errors }}
@@ -219,6 +231,14 @@

{% trans "Create Leave Type" %}

+
+
+ + +
+ {{form.employee_id}} + {{form.employee_id.errors}} +
@@ -256,8 +276,10 @@

{% trans "Create Leave Type" %}{% trans "Create Leave Type" %}{% trans "Create Leave Type" %}{% trans "Create Leave Type" %}{% trans "Create Leave Type" %} {{form.payment.errors}}

-
+
+
+
+ + +
+
+ {{form.limit_leave}} + {{form.limit_leave.errors}} +
+
+
+
{{form.count}} @@ -72,7 +84,7 @@

{{form.total_days.errors}}

-
+
@@ -258,6 +270,10 @@

"label[for='id_carryforward_expire_period']" ); var carryforward_expire_period = $("#id_carryforward_expire_period"); + var totalDaysContainer = $(".totalDaysContainer"); + var resetContainer = $(".resetContainer"); + var totalDays = $("#id_total_days"); + var limitLeave = $("#id_limit_leave"); var hiddenLabelsFields = $("[data-hidden]"); for (let index = 0; index < hiddenLabelsFields.length; index++) { @@ -274,7 +290,12 @@

else{ reset_based_span.hide() } + (limitLeave.checked) ? (totalDaysContainer.show(), resetContainer.show()) : (totalDaysContainer.hide(), resetContainer.hide(), $("#id_count").val(0)) + console.log($("#id_count").val()) + limitLeave.change(function (){ + (this.checked) ? (totalDaysContainer.show(), resetContainer.show()) : (totalDaysContainer.hide(), resetContainer.hide(), $("#id_count").val(0)) + }) // Check value of reset change field and trigger action reset.change(function () { diff --git a/leave/views.py b/leave/views.py index ea2b476cc..e79d37919 100644 --- a/leave/views.py +++ b/leave/views.py @@ -1914,7 +1914,7 @@ def user_leave_request(request, id): form.add_error( None, _("There is already a leave request for this date range..") ) - elif requested_days <= available_total_leave: + elif not leave_type.limit_leave or requested_days <= available_total_leave: if form.is_valid(): leave_request = form.save(commit=False) save = True