[UPDT] BASE: Restructure signals and work record updates to base module functions
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -140,7 +140,6 @@ class CompanyMiddleware:
|
||||
"loanaccount",
|
||||
"payslip",
|
||||
"reimbursement",
|
||||
"workrecord",
|
||||
],
|
||||
"helpdesk": ["ticket"],
|
||||
"offboarding": ["offboarding"],
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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]
|
||||
)
|
||||
|
||||
@@ -1,41 +1,60 @@
|
||||
{% load i18n %}
|
||||
{% if messages %}
|
||||
<span hx-trigger="load" hx-target="#companyLeave" hx-get="{% url 'company-leave-filter' %}" hx-on-htmx-after-request="setTimeout(() => {
|
||||
{% load i18n %} {% if messages %}
|
||||
<span
|
||||
hx-trigger="load"
|
||||
hx-target="#companyLeave"
|
||||
hx-get="{% url 'company-leave-filter' %}"
|
||||
hx-on-htmx-after-request="setTimeout(() => {
|
||||
$('.oh-modal__close').click();
|
||||
}, 1000);">
|
||||
</span>
|
||||
{% endif %}
|
||||
{% if form.errors %}
|
||||
<div class="oh-wrapper">
|
||||
<div class="oh-alert-container">
|
||||
{% for error in form.non_field_errors %}
|
||||
<div class="oh-alert oh-alert--animated oh-alert--danger">{{ error }}</div>
|
||||
{% endfor %}
|
||||
}, 1000);"
|
||||
>
|
||||
</span>
|
||||
{% endif %} {% if form.errors %}
|
||||
<div class="oh-wrapper">
|
||||
<div class="oh-alert-container">
|
||||
{% for error in form.non_field_errors %}
|
||||
<div class="oh-alert oh-alert--animated oh-alert--danger">
|
||||
{{ error }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="oh-modal__dialog-header pb-0">
|
||||
<span class="oh-modal__dialog-title" id="editDialogDialog">{% trans "Update Company Leaves" %}</span>
|
||||
<span class="oh-modal__dialog-title" id="editDialogDialog"
|
||||
>{% trans "Update Company Leaves" %}</span
|
||||
>
|
||||
<button class="oh-modal__close" aria-label="Close">
|
||||
<ion-icon name="close-outline"></ion-icon>
|
||||
</button>
|
||||
</div>
|
||||
<div class="oh-modal__dialog-body pt-1">
|
||||
<form hx-post="{% url 'company-leave-update' id %}" hx-target="#objectUpdateModalTarget" class="oh-profile-section">
|
||||
<form
|
||||
hx-post="{% url 'company-leave-update' id %}"
|
||||
hx-target="#objectCreateModalTarget"
|
||||
class="oh-profile-section pt-1"
|
||||
>
|
||||
<label class="oh-label d-block">{% trans "Based On Week" %}</label>
|
||||
{{form.based_on_week}}
|
||||
{{form.based_on_week}} {{form.based_on_week.errors}}
|
||||
<label class="oh-label d-block">{% trans "Based On Week Day" %}</label>
|
||||
{{form.based_on_week_day}}
|
||||
{{form.based_on_week_day}} {{form.based_on_week_day.errors}}
|
||||
<label class="oh-label d-block">{% trans "Company" %}</label>
|
||||
{{form.company_id}} {{form.company_id.errors}}
|
||||
<div class="oh-modal__dialog-footer p-0 mt-3">
|
||||
<button type="submit" class="oh-btn oh-btn--secondary oh-btn--shadow">
|
||||
<button
|
||||
type="submit"
|
||||
class="oh-btn oh-btn--secondary oh-btn--shadow"
|
||||
>
|
||||
{% trans "Save" %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<script>
|
||||
var week_select = $('#objectUpdateModalTarget #id_based_on_week');
|
||||
week_select.find('option').filter(function () {
|
||||
return $(this).text() === '---------';
|
||||
}).text('All');
|
||||
var week_select = $("#objectUpdateModalTarget #id_based_on_week");
|
||||
week_select
|
||||
.find("option")
|
||||
.filter(function () {
|
||||
return $(this).text() === "---------";
|
||||
})
|
||||
.text("All");
|
||||
</script>
|
||||
|
||||
@@ -19,27 +19,48 @@
|
||||
<div class="row">
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<div class="oh-input__group">
|
||||
<label class="oh-input__label" for="{{form.start_date.id_for_label}}">
|
||||
<label
|
||||
class="oh-input__label"
|
||||
for="{{form.start_date.id_for_label}}"
|
||||
>
|
||||
{% trans "Start Date" %}
|
||||
</label>
|
||||
{{form.start_date }} {{form.start_date.errors }}
|
||||
{{ form.start_date }} {{ form.start_date.errors }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<div class="oh-input__group">
|
||||
<label class="oh-input__label" for="{{form.end_date.id_for_label}}">
|
||||
<label
|
||||
class="oh-input__label"
|
||||
for="{{form.end_date.id_for_label}}"
|
||||
>
|
||||
{% trans "End Date" %}
|
||||
</label>
|
||||
{{form.end_date }} {{form.end_date.errors}}
|
||||
{{ form.end_date }} {{ form.end_date.errors }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<div class="oh-input__group">
|
||||
<label
|
||||
class="oh-input__label"
|
||||
for="{{form.end_date.id_for_label}}"
|
||||
>
|
||||
{% trans "Company" %}
|
||||
</label>
|
||||
{{ form.company_id }} {{ form.company_id.errors }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-sm-12 col-md-6 col-lg-6">
|
||||
<label
|
||||
class="oh-label d-block"
|
||||
for="{{ form.name.id_for_label }}"
|
||||
>{% trans "Recurring" %}</label
|
||||
>
|
||||
<div class="oh-switch">
|
||||
{{ form.recurring }} {{ form.recurring.errors }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<label class="oh-label d-block" for="{{ form.recurring.id_for_label }}">{% trans "Recurring" %}</label>
|
||||
<div class="oh-switch">{{form.recurring}} {{form.recurring.errors}}</div>
|
||||
|
||||
<label class="oh-label d-block" for="{{ form.recurring.id_for_label }}">{% trans "Company" %}</label>
|
||||
<div class="oh-switch">{{ form.company_id }} {{ form.company_id.errors }}</div>
|
||||
<div class="oh-modal__dialog-footer p-0">
|
||||
<button type="submit" class="oh-btn oh-btn--secondary oh-btn--shadow">
|
||||
{% trans "Save" %}
|
||||
|
||||
Reference in New Issue
Block a user