diff --git a/leave/forms.py b/leave/forms.py index 2e4c1b81e..3fa982902 100644 --- a/leave/forms.py +++ b/leave/forms.py @@ -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 diff --git a/leave/models.py b/leave/models.py index 04438ba7c..f206883a0 100644 --- a/leave/models.py +++ b/leave/models.py @@ -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: