115 lines
4.1 KiB
Python
115 lines
4.1 KiB
Python
from datetime import datetime
|
|
|
|
from django.apps import apps
|
|
from django.db.models.signals import post_save, pre_save
|
|
from django.dispatch import receiver
|
|
|
|
from employee.models import EmployeeWorkInformation
|
|
from payroll.methods.deductions import create_deductions
|
|
from payroll.models.models import Allowance, Contract, Deduction, LoanAccount, Payslip
|
|
|
|
|
|
@receiver(pre_save, sender=EmployeeWorkInformation)
|
|
def employeeworkinformation_pre_save(sender, instance, **_kwargs):
|
|
"""
|
|
This method is used to override the save method for EmployeeWorkInformation Model
|
|
"""
|
|
active_employee = (
|
|
instance.employee_id
|
|
if instance.employee_id and instance.employee_id.is_active == True
|
|
else None
|
|
)
|
|
if active_employee is not None:
|
|
all_contracts = Contract.objects.entire()
|
|
contract_exists = all_contracts.filter(employee_id_id=active_employee).exists()
|
|
if not contract_exists:
|
|
contract = Contract()
|
|
contract.contract_name = f"{active_employee}'s Contract"
|
|
contract.employee_id = active_employee
|
|
contract.contract_start_date = (
|
|
instance.date_joining if instance.date_joining else datetime.today()
|
|
)
|
|
contract.wage = (
|
|
instance.basic_salary if instance.basic_salary is not None else 0
|
|
)
|
|
contract.save()
|
|
|
|
|
|
@receiver(post_save, sender=LoanAccount)
|
|
def create_installments(sender, instance, created, **kwargs):
|
|
"""
|
|
Post save method for loan account
|
|
"""
|
|
installments = []
|
|
asset = True
|
|
if apps.is_installed("asset"):
|
|
asset = True if instance.asset_id is None else False
|
|
|
|
if created and asset and instance.type != "fine":
|
|
loan = Allowance()
|
|
loan.amount = instance.loan_amount
|
|
loan.title = instance.title
|
|
loan.include_active_employees = False
|
|
loan.amount = instance.loan_amount
|
|
loan.only_show_under_employee = True
|
|
loan.is_fixed = True
|
|
loan.is_fixed = True
|
|
loan.one_time_date = instance.provided_date
|
|
loan.is_loan = True
|
|
loan.include_active_employees = False
|
|
loan.save()
|
|
loan.specific_employees.add(instance.employee_id)
|
|
instance.allowance_id = loan
|
|
super(LoanAccount, instance).save()
|
|
else:
|
|
deductions = instance.deduction_ids.values_list("id", flat=True)
|
|
payslips_with_deductions = Payslip.objects.filter(
|
|
installment_ids__in=deductions
|
|
)
|
|
balance_deduction = [
|
|
deduction_id
|
|
for deduction_id in deductions
|
|
if not payslips_with_deductions.filter(
|
|
installment_ids=deduction_id
|
|
).exists()
|
|
]
|
|
installment_dict = instance.get_installments()
|
|
|
|
if not payslips_with_deductions and not instance.settled:
|
|
Deduction.objects.filter(id__in=deductions).delete()
|
|
for (
|
|
installment_date,
|
|
installment_amount,
|
|
) in installment_dict.items():
|
|
installment = create_deductions(
|
|
instance, installment_amount, installment_date
|
|
)
|
|
|
|
installments.append(installment)
|
|
|
|
instance.deduction_ids.add(*installments)
|
|
return
|
|
|
|
if instance.settled:
|
|
Deduction.objects.filter(id__in=balance_deduction).delete()
|
|
|
|
else:
|
|
if not balance_deduction:
|
|
for (
|
|
installment_date,
|
|
installment_amount,
|
|
) in installment_dict.items():
|
|
if not Deduction.objects.filter(
|
|
one_time_date=installment_date,
|
|
specific_employees=instance.employee_id,
|
|
is_installment=True,
|
|
title=instance.title,
|
|
).exists():
|
|
installment = create_deductions(
|
|
instance, installment_amount, installment_date
|
|
)
|
|
|
|
installments.append(installment)
|
|
|
|
instance.deduction_ids.add(*installments)
|