156 lines
5.3 KiB
Python
156 lines
5.3 KiB
Python
# leave/signals.py
|
|
|
|
import threading
|
|
|
|
from django.apps import apps
|
|
from django.db.models.signals import post_migrate, post_save, pre_delete, pre_save
|
|
from django.dispatch import receiver
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from horilla.methods import get_horilla_model_class
|
|
from leave.models import LeaveRequest
|
|
|
|
if apps.is_installed("attendance"):
|
|
|
|
@receiver(pre_save, sender=LeaveRequest)
|
|
def leaverequest_pre_save(sender, instance, **_kwargs):
|
|
"""
|
|
Overriding LeaveRequest model save method
|
|
"""
|
|
WorkRecords = get_horilla_model_class(
|
|
app_label="attendance", model="workrecords"
|
|
)
|
|
if (
|
|
instance.start_date == instance.end_date
|
|
and instance.end_date_breakdown != instance.start_date_breakdown
|
|
):
|
|
instance.end_date_breakdown = instance.start_date_breakdown
|
|
super(LeaveRequest, instance).save()
|
|
|
|
period_dates = instance.requested_dates()
|
|
if instance.status == "approved":
|
|
for date in period_dates:
|
|
try:
|
|
work_entry = (
|
|
WorkRecords.objects.filter(
|
|
date=date,
|
|
employee_id=instance.employee_id,
|
|
).first()
|
|
if WorkRecords.objects.filter(
|
|
date=date,
|
|
employee_id=instance.employee_id,
|
|
).exists()
|
|
else WorkRecords()
|
|
)
|
|
work_entry.employee_id = instance.employee_id
|
|
work_entry.is_leave_record = True
|
|
work_entry.leave_request_id = instance
|
|
work_entry.day_percentage = (
|
|
0.50
|
|
if instance.start_date == date
|
|
and instance.start_date_breakdown == "first_half"
|
|
or instance.end_date == date
|
|
and instance.end_date_breakdown == "second_half"
|
|
else 0.00
|
|
)
|
|
status = (
|
|
"CONF"
|
|
if instance.start_date == date
|
|
and instance.start_date_breakdown == "first_half"
|
|
or instance.end_date == date
|
|
and instance.end_date_breakdown == "second_half"
|
|
else "ABS"
|
|
)
|
|
work_entry.work_record_type = status
|
|
work_entry.date = date
|
|
work_entry.message = (
|
|
"Leave"
|
|
if status == "ABS"
|
|
else _("Half day Attendance need to validate")
|
|
)
|
|
work_entry.save()
|
|
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
else:
|
|
for date in period_dates:
|
|
WorkRecords.objects.filter(
|
|
is_leave_record=True,
|
|
date=date,
|
|
employee_id=instance.employee_id,
|
|
).delete()
|
|
|
|
@receiver(pre_delete, sender=LeaveRequest)
|
|
def leaverequest_pre_delete(sender, instance, **kwargs):
|
|
from attendance.models import WorkRecords
|
|
|
|
work_records = WorkRecords.objects.filter(leave_request_id=instance).delete()
|
|
|
|
|
|
@receiver(post_save, sender=LeaveRequest)
|
|
def update_available(sender, instance, **kwargs):
|
|
"""
|
|
post save method to update the available leaves
|
|
"""
|
|
|
|
_sender = sender
|
|
|
|
def update_leaves():
|
|
try:
|
|
if instance.leave_type_id:
|
|
available_leaves = instance.employee_id.available_leave.filter(
|
|
leave_type_id=instance.leave_type_id
|
|
)
|
|
for assigned in available_leaves:
|
|
assigned.save()
|
|
except Exception as e:
|
|
pass
|
|
|
|
thread = threading.Thread(target=update_leaves)
|
|
thread.start()
|
|
|
|
|
|
@receiver(post_migrate)
|
|
def add_missing_leave_to_workrecords(sender, **kwargs):
|
|
if sender.label not in ["attendance", "leave"]:
|
|
return
|
|
|
|
if not apps.is_installed("attendance"):
|
|
return
|
|
try:
|
|
from attendance.models import WorkRecords
|
|
from leave.models import LeaveRequest
|
|
|
|
work_records = WorkRecords.objects.filter(
|
|
is_leave_record=True, leave_request_id__isnull=True
|
|
)
|
|
if not work_records.exists():
|
|
return
|
|
|
|
leave_requests = LeaveRequest.objects.all()
|
|
date_leave_map = {}
|
|
|
|
for leave in leave_requests:
|
|
for date in leave.requested_dates():
|
|
key = (leave.employee_id, date)
|
|
date_leave_map[key] = leave
|
|
|
|
records_to_update = []
|
|
for record in work_records:
|
|
leave_request = date_leave_map.get((record.employee_id, record.date))
|
|
if leave_request:
|
|
record.leave_request_id = leave_request
|
|
records_to_update.append(record)
|
|
|
|
if records_to_update:
|
|
WorkRecords.objects.bulk_update(
|
|
records_to_update, ["leave_request_id"], batch_size=500
|
|
)
|
|
print(
|
|
f"Successfully updated {len(records_to_update)} work records with leave information"
|
|
)
|
|
|
|
except Exception as e:
|
|
print(f"Error in leave/work records sync: {e}")
|