diff --git a/base/apps.py b/base/apps.py index fe9dce1eb..9f4282168 100644 --- a/base/apps.py +++ b/base/apps.py @@ -14,6 +14,8 @@ class BaseConfig(AppConfig): name = "base" def ready(self) -> None: + from base import signals + super().ready() try: from base.models import EmployeeShiftDay diff --git a/base/middleware.py b/base/middleware.py index 18e90b1c9..63011ecf5 100644 --- a/base/middleware.py +++ b/base/middleware.py @@ -140,7 +140,6 @@ class CompanyMiddleware: "loanaccount", "payslip", "reimbursement", - "workrecord", ], "helpdesk": ["ticket"], "offboarding": ["offboarding"], diff --git a/base/migrations/__init__.py b/base/migrations/__init__.py index 3e93ef548..e69de29bb 100644 --- a/base/migrations/__init__.py +++ b/base/migrations/__init__.py @@ -1,149 +0,0 @@ -from django.apps import apps - -try: - RecruitmentMailTemplate = apps.get_model("recruitment", "RecruitmentMailTemplate") - HorillaMailTemplate = apps.get_model("base", "HorillaMailTemplate") - - recruitment_mail_templates = RecruitmentMailTemplate.objects.all() - for recruitment_mail in recruitment_mail_templates: - if not HorillaMailTemplate.objects.filter( - title=recruitment_mail.title - ).exists(): - horilla_mail = HorillaMailTemplate( - id=recruitment_mail.id, - title=recruitment_mail.title, - body=recruitment_mail.body, - company_id=recruitment_mail.company_id, - ) - horilla_mail.save() - - horilla_mail_templates = HorillaMailTemplate.objects.all() - RecruitmentMailTemplate.objects.all().delete() -except Exception as e: - pass - -try: - LeaveHoliday = apps.get_model("leave", "Holiday") - BaseHoliday = apps.get_model("base", "Holidays") - - leave_holidays = LeaveHoliday.objects.all() - for holiday in leave_holidays: - if not BaseHoliday.objects.filter( - name=holiday.name, - start_date=holiday.start_date, - end_date=holiday.end_date, - ).exists(): - horilla = BaseHoliday( - id=holiday.id, - name=holiday.name, - start_date=holiday.start_date, - end_date=holiday.end_date, - ) - horilla.save() - - base_leaves = BaseHoliday.objects.all() - LeaveHoliday.objects.all().delete() -except Exception as e: - pass - -try: - PenaltyAccount = apps.get_model("attendance", "PenaltyAccount") - PenaltyAccounts = apps.get_model("base", "PenaltyAccounts") - - penalties = PenaltyAccount.objects.all() - for penalty in penalties: - filter_conditions = { - "employee_id": penalty.employee_id, - "penalty_amount": penalty.penalty_amount, - } - if apps.is_installed("attendance"): - filter_conditions.update( - { - "late_early_id": penalty.late_early_id, - } - ) - if apps.is_installed("leave"): - filter_conditions.update( - { - "leave_request_id": penalty.leave_request_id, - "leave_type_id": penalty.leave_type_id, - "minus_leaves": penalty.minus_leaves, - "deduct_from_carry_forward": penalty.deduct_from_carry_forward, - } - ) - - if not PenaltyAccounts.objects.filter(**filter_conditions).exists(): - horilla = PenaltyAccounts( - id=penalty.id, - employee_id=penalty.employee_id, - penalty_amount=penalty.penalty_amount, - ) - if apps.is_installed("attendance"): - horilla.late_early_id = penalty.late_early_id - if apps.is_installed("leave"): - horilla.leave_request_id = penalty.leave_request_id - horilla.leave_type_id = penalty.leave_type_id - horilla.minus_leaves = penalty.minus_leaves - horilla.deduct_from_carry_forward = penalty.deduct_from_carry_forward - horilla.save() - penalty_accounts = PenaltyAccounts.objects.all() - PenaltyAccount.objects.all().delete() -except Exception as e: - pass - -try: - CompanyLeave = apps.get_model("leave", "CompanyLeave") - BaseCompanyLeave = apps.get_model("base", "CompanyLeaves") - - company_leaves = CompanyLeave.objects.all() - for leave in company_leaves: - if not BaseCompanyLeave.objects.filter( - based_on_week=leave.based_on_week, - based_on_week_day=leave.based_on_week_day, - ).exists(): - horilla = BaseCompanyLeave( - id=leave.id, - based_on_week=leave.based_on_week, - based_on_week_day=leave.based_on_week_day, - ) - horilla.save() - - base_leaves = BaseCompanyLeave.objects.all() - CompanyLeave.objects.all().delete() -except Exception as e: - pass - -try: - WorkRecord = apps.get_model("payroll", "WorkRecord") - WorkRecords = apps.get_model("attendance", "WorkRecords") - - work_records = WorkRecord.objects.all() - for work_record in work_records: - if not WorkRecords.objects.filter( - record_name=work_record.record_name, - employee_id=work_record.employee_id, - date=work_record.date, - ).exists(): - new_work_record = WorkRecords( - id=work_record.id, - record_name=work_record.record_name, - work_record_type=work_record.work_record_type, - employee_id=work_record.employee_id, - date=work_record.date, - at_work=work_record.at_work, - min_hour=work_record.min_hour, - at_work_second=work_record.at_work_second, - min_hour_second=work_record.min_hour_second, - note=work_record.note, - message=work_record.message, - is_attendance_record=work_record.is_attendance_record, - is_leave_record=work_record.is_leave_record, - day_percentage=work_record.day_percentage, - last_update=work_record.last_update, - ) - new_work_record.save() - - new_work_records = WorkRecords.objects.all() - WorkRecord.objects.all().delete() -except Exception as e: - pass diff --git a/base/models.py b/base/models.py index 6903bf47f..1faedb18b 100644 --- a/base/models.py +++ b/base/models.py @@ -14,14 +14,11 @@ from django.contrib import messages from django.contrib.auth.models import AbstractUser, User from django.core.exceptions import ValidationError from django.db import models -from django.db.models.signals import post_save -from django.dispatch import receiver from django.utils.translation import gettext_lazy as _ from base.horilla_company_manager import HorillaCompanyManager from horilla import horilla_middlewares from horilla.horilla_middlewares import _thread_locals -from horilla.methods import get_horilla_model_class from horilla.models import HorillaModel from horilla_audit.models import HorillaAuditInfo, HorillaAuditLog @@ -1793,53 +1790,4 @@ class NotificationSound(models.Model): sound_enabled = models.BooleanField(default=False) -@receiver(post_save, sender=PenaltyAccounts) -def create_deduction_cutleave_from_penalty(sender, instance, created, **kwargs): - """ - This is post save method, used to create deduction and cut availabl leave days""" - # only work when creating - if created: - penalty_amount = instance.penalty_amount - if apps.is_installed("payroll") and penalty_amount: - Deduction = get_horilla_model_class(app_label="payroll", model="deduction") - penalty = Deduction() - if instance.late_early_id: - penalty.title = f"{instance.late_early_id.get_type_display()} penalty" - penalty.one_time_date = ( - instance.late_early_id.attendance_id.attendance_date - ) - elif instance.leave_request_id: - penalty.title = f"Leave penalty {instance.leave_request_id.end_date}" - penalty.one_time_date = instance.leave_request_id.end_date - else: - penalty.title = f"Penalty on {datetime.today()}" - penalty.one_time_date = datetime.today() - penalty.include_active_employees = False - penalty.is_fixed = True - penalty.amount = instance.penalty_amount - penalty.only_show_under_employee = True - penalty.save() - penalty.include_active_employees = False - penalty.specific_employees.add(instance.employee_id) - penalty.save() - - if ( - apps.is_installed("leave") - and instance.leave_type_id - and instance.minus_leaves - ): - available = instance.employee_id.available_leave.filter( - leave_type_id=instance.leave_type_id - ).first() - unit = round(instance.minus_leaves * 2) / 2 - if not instance.deduct_from_carry_forward: - available.available_days = max(0, (available.available_days - unit)) - else: - available.carryforward_days = max( - 0, (available.carryforward_days - unit) - ) - - available.save() - - User.add_to_class("is_new_employee", models.BooleanField(default=False)) diff --git a/base/signals.py b/base/signals.py index e69de29bb..a1c214831 100644 --- a/base/signals.py +++ b/base/signals.py @@ -0,0 +1,82 @@ +from datetime import datetime + +from django.apps import apps +from django.db.models import Max +from django.db.models.signals import post_migrate, post_save +from django.dispatch import receiver + +from base.models import PenaltyAccounts +from horilla.methods import get_horilla_model_class + + +@receiver(post_save, sender=PenaltyAccounts) +def create_deduction_cutleave_from_penalty(sender, instance, created, **kwargs): + """ + This is post save method, used to create deduction and cut availabl leave days""" + # only work when creating + if created: + penalty_amount = instance.penalty_amount + if apps.is_installed("payroll") and penalty_amount: + Deduction = get_horilla_model_class(app_label="payroll", model="deduction") + penalty = Deduction() + if instance.late_early_id: + penalty.title = f"{instance.late_early_id.get_type_display()} penalty" + penalty.one_time_date = ( + instance.late_early_id.attendance_id.attendance_date + ) + elif instance.leave_request_id: + penalty.title = f"Leave penalty {instance.leave_request_id.end_date}" + penalty.one_time_date = instance.leave_request_id.end_date + else: + penalty.title = f"Penalty on {datetime.today()}" + penalty.one_time_date = datetime.today() + penalty.include_active_employees = False + penalty.is_fixed = True + penalty.amount = instance.penalty_amount + penalty.only_show_under_employee = True + penalty.save() + penalty.include_active_employees = False + penalty.specific_employees.add(instance.employee_id) + penalty.save() + + if ( + apps.is_installed("leave") + and instance.leave_type_id + and instance.minus_leaves + ): + available = instance.employee_id.available_leave.filter( + leave_type_id=instance.leave_type_id + ).first() + unit = round(instance.minus_leaves * 2) / 2 + if not instance.deduct_from_carry_forward: + available.available_days = max(0, (available.available_days - unit)) + else: + available.carryforward_days = max( + 0, (available.carryforward_days - unit) + ) + + available.save() + + +@receiver(post_migrate) +def clean_work_records(sender, **kwargs): + if sender.label not in ["attendance"]: + return + from attendance.models import WorkRecords + + latest_records = ( + WorkRecords.objects.exclude(work_record_type="DFT") + .values("employee_id", "date") + .annotate(latest_id=Max("id")) + ) + + # Delete all but the latest WorkRecord + deleted_count = 0 + for record in latest_records: + deleted_count += ( + WorkRecords.objects.filter( + employee_id=record["employee_id"], date=record["date"] + ) + .exclude(id=record["latest_id"]) + .delete()[0] + ) diff --git a/base/templates/company_leave/company_leave_update_form.html b/base/templates/company_leave/company_leave_update_form.html index 7d426b241..27d7a6cc2 100644 --- a/base/templates/company_leave/company_leave_update_form.html +++ b/base/templates/company_leave/company_leave_update_form.html @@ -1,41 +1,60 @@ -{% load i18n %} -{% if messages %} - - -{% endif %} -{% if form.errors %} -
-
- {% for error in form.non_field_errors %} -
{{ error }}
- {% endfor %} + }, 1000);" +> + +{% endif %} {% if form.errors %} +
+
+ {% for error in form.non_field_errors %} +
+ {{ error }}
+ {% endfor %}
+
{% endif %}
- {% trans "Update Company Leaves" %} + {% trans "Update Company Leaves" %}
-
+ - {{form.based_on_week}} + {{form.based_on_week}} {{form.based_on_week.errors}} - {{form.based_on_week_day}} + {{form.based_on_week_day}} {{form.based_on_week_day.errors}} + + {{form.company_id}} {{form.company_id.errors}}
diff --git a/base/templates/holiday/holiday_update_form.html b/base/templates/holiday/holiday_update_form.html index 228b0fba1..a7f573770 100644 --- a/base/templates/holiday/holiday_update_form.html +++ b/base/templates/holiday/holiday_update_form.html @@ -19,27 +19,48 @@
-
-
+
+
+
+ + {{ form.company_id }} {{ form.company_id.errors }} +
+
+
+ +
+ {{ form.recurring }} {{ form.recurring.errors }}
- - -
{{form.recurring}} {{form.recurring.errors}}
- - -
{{ form.company_id }} {{ form.company_id.errors }}