[FIX] PAYROLL: Fixed deduction form select field data not rendering properly

This commit is contained in:
Horilla
2024-12-09 11:10:00 +05:30
parent 991810f1ae
commit dc1311cf70
2 changed files with 32 additions and 67 deletions

View File

@@ -21,7 +21,7 @@ from employee.filters import EmployeeFilter
from employee.models import BonusPoint, Employee
from horilla import horilla_middlewares
from horilla.methods import get_horilla_model_class
from horilla_widgets.forms import HorillaForm
from horilla_widgets.forms import HorillaForm, orginal_template_name
from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField
from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget
from notifications.signals import notify
@@ -230,7 +230,7 @@ class DeductionForm(forms.ModelForm):
self.fields["style"].widget = widget.StyleWidget(form=self)
for field_name, field in self.fields.items():
if isinstance(field.widget, forms.Select):
field.widget.option_template_name = "horilla_widgets/select_option.html"
field.widget.option_template_name = orginal_template_name
def clean(self, *args, **kwargs):
cleaned_data = super().clean(*args, **kwargs)

View File

@@ -77,6 +77,7 @@ from payroll.methods.payslip_calc import (
from payroll.methods.tax_calc import calculate_taxable_amount
from payroll.models.models import (
Allowance,
Contract,
Deduction,
LoanAccount,
Payslip,
@@ -384,9 +385,7 @@ def view_allowance(request):
"""
This method is used render template to view all the allowance instances
"""
allowances = payroll.models.models.Allowance.objects.exclude(
only_show_under_employee=True
)
allowances = Allowance.objects.exclude(only_show_under_employee=True)
allowance_filter = AllowanceFilter(request.GET)
allowances = paginator_qry(allowances, request.GET.get("page"))
allowance_ids = json.dumps([instance.id for instance in allowances.object_list])
@@ -408,7 +407,7 @@ def view_single_allowance(request, allowance_id):
This method is used render template to view the selected allowance instances
"""
previous_data = get_urlencode(request)
allowance = payroll.models.models.Allowance.find(allowance_id)
allowance = Allowance.find(allowance_id)
allowance_ids_json = request.GET.get("instances_ids")
context = {
"allowance": allowance,
@@ -466,7 +465,7 @@ def update_allowance(request, allowance_id, **kwargs):
Args:
id : allowance instance id
"""
instance = payroll.models.models.Allowance.objects.get(id=allowance_id)
instance = Allowance.objects.get(id=allowance_id)
form = forms.AllowanceForm(instance=instance)
if request.method == "POST":
form = forms.AllowanceForm(request.POST, instance=instance)
@@ -486,9 +485,7 @@ def delete_allowance(request, allowance_id):
"""
previous_data = get_urlencode(request)
try:
allowance = payroll.models.models.Allowance.objects.filter(
id=allowance_id
).first()
allowance = Allowance.objects.filter(id=allowance_id).first()
if allowance:
allowance.delete()
messages.success(request, _("Allowance deleted successfully"))
@@ -500,7 +497,7 @@ def delete_allowance(request, allowance_id):
if (
request.path.split("/")[2] == "delete-employee-allowance"
or not payroll.models.models.Allowance.objects.exists()
or not Allowance.objects.exists()
):
return HttpResponse("<script>window.location.reload();</script>")
@@ -540,9 +537,7 @@ def view_deduction(request):
This method is used render template to view all the deduction instances
"""
deductions = payroll.models.models.Deduction.objects.exclude(
only_show_under_employee=True
)
deductions = Deduction.objects.exclude(only_show_under_employee=True)
deduction_filter = DeductionFilter(request.GET)
deductions = paginator_qry(deductions, request.GET.get("page"))
deduction_ids = json.dumps([instance.id for instance in deductions.object_list])
@@ -564,7 +559,7 @@ def view_single_deduction(request, deduction_id):
Render template to view a single deduction instance with navigation.
"""
previous_data = get_urlencode(request)
deduction = payroll.models.models.Deduction.objects.filter(id=deduction_id).first()
deduction = Deduction.objects.filter(id=deduction_id).first()
context = {"deduction": deduction, "pd": previous_data}
# Handle deduction IDs and navigation
@@ -647,7 +642,7 @@ def update_deduction(request, deduction_id, **kwargs):
"""
This method is used to update the deduction instance
"""
instance = payroll.models.models.Deduction.objects.get(id=deduction_id)
instance = Deduction.objects.get(id=deduction_id)
form = forms.DeductionForm(instance=instance)
if request.method == "POST":
form = forms.DeductionForm(request.POST, instance=instance)
@@ -730,7 +725,7 @@ def generate_payslip(request):
end_date = form.cleaned_data["end_date"]
group_name = form.cleaned_data["group_name"]
for employee in employees:
contract = payroll.models.models.Contract.objects.filter(
contract = Contract.objects.filter(
employee_id=employee, contract_status="active"
).first()
if start_date < contract.contract_start_date:
@@ -786,7 +781,7 @@ def check_contract_start_date(request):
employee_id = request.GET.get("employee_id")
start_date = request.GET.get("start_date")
contract = payroll.models.models.Contract.objects.filter(
contract = Contract.objects.filter(
employee_id=employee_id, contract_status="active"
).first()
@@ -844,7 +839,7 @@ def create_payslip(request, new_post_data=None):
)
if employee_id and start_date:
contract = payroll.models.models.Contract.objects.filter(
contract = Contract.objects.filter(
employee_id=employee_id, contract_status="active"
).first()
@@ -857,7 +852,7 @@ def create_payslip(request, new_post_data=None):
employee = form.cleaned_data["employee_id"]
start_date = form.cleaned_data["start_date"]
end_date = form.cleaned_data["end_date"]
payslip = payroll.models.models.Payslip.objects.filter(
payslip = Payslip.objects.filter(
employee_id=employee, start_date=start_date, end_date=end_date
).first()
@@ -929,7 +924,7 @@ def validate_start_date(request):
error_message = ""
response = {"valid": True, "message": error_message}
for emp_id in employee_id:
contract = payroll.models.models.Contract.objects.filter(
contract = Contract.objects.filter(
employee_id__id=emp_id, contract_status="active"
).first()
@@ -978,11 +973,9 @@ def view_payslip(request):
This method is used to render the template for viewing a payslip.
"""
if request.user.has_perm("payroll.view_payslip"):
payslips = payroll.models.models.Payslip.objects.all()
payslips = Payslip.objects.all()
else:
payslips = payroll.models.models.Payslip.objects.filter(
employee_id__employee_user_id=request.user
)
payslips = Payslip.objects.filter(employee_id__employee_user_id=request.user)
export_column = forms.PayslipExportColumnForm()
filter_form = PayslipFilter(request.GET, payslips)
payslips = filter_form.qs
@@ -1112,28 +1105,9 @@ def payslip_export(request):
data = choices_mapping.get(value, "")
if type(value) == date:
user = request.user
employee = user.employee_get
# Taking the company_name of the user
info = EmployeeWorkInformation.objects.filter(employee_id=employee)
if info.exists():
for i in info:
employee_company = i.company_id
company_name = Company.objects.filter(company=employee_company)
emp_company = company_name.first()
# Access the date_format attribute directly
date_format = (
emp_company.date_format if emp_company else "MMM. D, YYYY"
)
else:
date_format = "MMM. D, YYYY"
# Convert the string to a datetime.date object
date_format = request.user.employee_get.get_date_format()
start_date = datetime.strptime(str(value), "%Y-%m-%d").date()
# The formatted date for each format
for format_name, format_string in HORILLA_DATE_FORMATS.items():
if format_name == date_format:
data = start_date.strftime(format_string)
@@ -1217,7 +1191,7 @@ def add_bonus(request):
form = forms.BonusForm(initial={"employee_id": employee_id})
if request.method == "POST":
form = forms.BonusForm(request.POST, initial={"employee_id": employee_id})
contract = payroll.models.models.Contract.objects.filter(
contract = Contract.objects.filter(
employee_id=employee_id, contract_status="active"
).first()
employee = Employee.objects.filter(id=employee_id).first()
@@ -1893,9 +1867,12 @@ def all_deductions(pay_head):
extracted_items = []
potential_lists = [
"basic_pay_deductions",
"gross_pay_deductions",
"pretax_deductions",
"post_tax_deductions",
"tax_deductions",
"net_deductions",
]
for list_name in potential_lists:
@@ -1922,8 +1899,6 @@ def payslip_detailed_export_data(request):
payslips_data = []
totals = {}
payslips = PayslipFilter(request.GET).qs
today_date = date.today().strftime("%Y-%m-%d")
file_name = f"Payslip_excel_{today_date}.xlsx"
selected_fields = request.GET.getlist("selected_fields")
form = forms.PayslipExportColumnForm()
@@ -1934,8 +1909,8 @@ def payslip_detailed_export_data(request):
selected_fields = form.fields["selected_fields"].initial
for field in forms.excel_columns:
value = field[0]
key = field[1]
value, key = field
if value in selected_fields:
selected_columns.append((value, key))
@@ -1994,7 +1969,8 @@ def payslip_detailed_export_data(request):
totals.update(allowance_totals)
totals.update(deduction_totals)
totals.update(other_totals)
print(payslips[0].employee_id)
print(json.dumps(payslips[0].pay_head_data, indent=2))
for payslip in payslips:
payslip_data = {}
other_allowances_sum = 0
@@ -2043,21 +2019,7 @@ def payslip_detailed_export_data(request):
data = choices_mapping.get(value, "")
if isinstance(value, date):
user = request.user
employee = user.employee_get
info = EmployeeWorkInformation.objects.filter(employee_id=employee)
if info.exists():
for i in info:
employee_company = i.company_id
company_name = Company.objects.filter(company=employee_company)
emp_company = company_name.first()
date_format = (
emp_company.date_format if emp_company else "MMM. D, YYYY"
)
else:
date_format = "MMM. D, YYYY"
date_format = request.user.employee_get.get_date_format()
start_date = datetime.strptime(str(value), "%Y-%m-%d").date()
for format_name, format_string in HORILLA_DATE_FORMATS.items():
@@ -2066,6 +2028,7 @@ def payslip_detailed_export_data(request):
else:
data = str(value) if value is not None else ""
# print(allos)
if allos:
for allowance in allos:
if str(allowance["title"]) == str(column_name):
@@ -2170,6 +2133,8 @@ def payslip_detailed_export(request):
selected_columns = export_data["selected_columns"]
allowances = export_data["allowances"]
deductions = export_data["deductions"]
today_date = date.today().strftime("%Y-%m-%d")
file_name = f"Payslip_excel_{today_date}.xlsx"
thin_border = Border(
left=Side(style="thin"),
@@ -2268,7 +2233,7 @@ def payslip_detailed_export(request):
response = HttpResponse(
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
response["Content-Disposition"] = "attachment; filename=Payslip_excel.xlsx"
response["Content-Disposition"] = f"attachment; filename={file_name}.xlsx"
wb.save(response)
return response