[ADD] LEAVE: company_id - Company dependent fields to leave models

This commit is contained in:
Horilla
2023-11-20 14:22:43 +05:30
parent 3d65b7736a
commit d6ac9aa46c
2 changed files with 65 additions and 28 deletions

View File

@@ -182,6 +182,35 @@ class UpdateLeaveTypeForm(ConditionForm):
del self.errors["exceed_days"]
return cleaned_data
def cal_effective_requested_days(start_date,end_date,leave_type_id,requested_days):
requested_dates = leave_requested_dates(start_date, end_date)
holidays = Holiday.objects.all()
holiday_dates = holiday_dates_list(holidays)
company_leaves = CompanyLeave.objects.all()
company_leave_dates = company_leave_dates_list(company_leaves, start_date)
if (
leave_type_id.exclude_company_leave == "yes"
and leave_type_id.exclude_holiday == "yes"
):
total_leaves = list(set(holiday_dates + company_leave_dates))
total_leave_count = sum(
requested_date in total_leaves for requested_date in requested_dates
)
requested_days = requested_days - total_leave_count
else:
holiday_count = 0
if leave_type_id.exclude_holiday == "yes":
for requested_date in requested_dates:
if requested_date in holiday_dates:
holiday_count += 1
requested_days = requested_days - holiday_count
if leave_type_id.exclude_company_leave == "yes":
company_leave_count = sum(
requested_date in company_leave_dates
for requested_date in requested_dates
)
requested_days = requested_days - company_leave_count
return requested_days
class LeaveRequestCreationForm(ModelForm):
start_date = forms.DateField(widget=forms.DateInput(attrs={"type": "date"}))
@@ -232,34 +261,35 @@ class LeaveRequestCreationForm(ModelForm):
requested_days = calculate_requested_days(
start_date, end_date, start_date_breakdown, end_date_breakdown
)
requested_dates = leave_requested_dates(start_date, end_date)
holidays = Holiday.objects.all()
holiday_dates = holiday_dates_list(holidays)
company_leaves = CompanyLeave.objects.all()
company_leave_dates = company_leave_dates_list(company_leaves, start_date)
if (
leave_type_id.exclude_company_leave == "yes"
and leave_type_id.exclude_holiday == "yes"
):
total_leaves = list(set(holiday_dates + company_leave_dates))
total_leave_count = sum(
requested_date in total_leaves for requested_date in requested_dates
)
requested_days = requested_days - total_leave_count
else:
holiday_count = 0
if leave_type_id.exclude_holiday == "yes":
for requested_date in requested_dates:
if requested_date in holiday_dates:
holiday_count += 1
requested_days = requested_days - holiday_count
if leave_type_id.exclude_company_leave == "yes":
company_leave_count = sum(
requested_date in company_leave_dates
for requested_date in requested_dates
)
requested_days = requested_days - company_leave_count
if not requested_days <= total_leave_days:
# requested_dates = leave_requested_dates(start_date, end_date)
# holidays = Holiday.objects.all()
# holiday_dates = holiday_dates_list(holidays)
# company_leaves = CompanyLeave.objects.all()
# company_leave_dates = company_leave_dates_list(company_leaves, start_date)
# if (
# leave_type_id.exclude_company_leave == "yes"
# and leave_type_id.exclude_holiday == "yes"
# ):
# total_leaves = list(set(holiday_dates + company_leave_dates))
# total_leave_count = sum(
# requested_date in total_leaves for requested_date in requested_dates
# )
# requested_days = requested_days - total_leave_count
# else:
# holiday_count = 0
# if leave_type_id.exclude_holiday == "yes":
# for requested_date in requested_dates:
# if requested_date in holiday_dates:
# holiday_count += 1
# requested_days = requested_days - holiday_count
# if leave_type_id.exclude_company_leave == "yes":
# company_leave_count = sum(
# requested_date in company_leave_dates
# for requested_date in requested_dates
# )
# requested_days = requested_days - company_leave_count
effective_requested_days = cal_effective_requested_days(start_date=start_date,end_date=end_date,leave_type_id=leave_type_id,requested_days=requested_days)
if not effective_requested_days <= total_leave_days:
raise forms.ValidationError(_("Employee doesn't have enough leave days.."))
return cleaned_data

View File

@@ -6,6 +6,7 @@ from django.utils import timezone
from django.core.exceptions import ValidationError
from dateutil.relativedelta import relativedelta
from django.utils.translation import gettext_lazy as _
from base.models import Company
from employee.models import Employee
from .methods import calculate_requested_days
from django.core.files.storage import default_storage
@@ -163,8 +164,12 @@ class LeaveType(models.Model):
)
exclude_company_leave = models.CharField(max_length=30, choices=CHOICES)
exclude_holiday = models.CharField(max_length=30, choices=CHOICES)
company_id = models.ForeignKey(Company,null=True, editable=False, on_delete=models.PROTECT)
objects = models.Manager()
class Meta:
ordering = ['-id']
def get_avatar(self):
"""
Method will retun the api to the avatar or path to the profile image
@@ -186,6 +191,7 @@ class Holiday(models.Model):
start_date = models.DateField(verbose_name=_("Start Date"))
end_date = models.DateField(null=True, blank=True, verbose_name=_("End Date"))
recurring = models.BooleanField(default=False, verbose_name=_("Recurring"))
company_id = models.ForeignKey(Company,null=True, editable=False, on_delete=models.PROTECT)
objects = models.Manager()
def __str__(self):
@@ -197,6 +203,7 @@ class CompanyLeave(models.Model):
max_length=100, choices=WEEKS, blank=True, null=True
)
based_on_week_day = models.CharField(max_length=100, choices=WEEK_DAYS)
company_id = models.ForeignKey(Company,null=True, editable=False, on_delete=models.PROTECT)
objects = models.Manager()
class Meta: