From e8abfe6d11b205c60a04a939c0b714826c7ca78b Mon Sep 17 00:00:00 2001 From: Horilla Date: Fri, 5 Dec 2025 19:16:16 +0530 Subject: [PATCH] [FIX] PAYROLL: Pdf showing issue in list payslip list view --- payroll/views/views.py | 134 +++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 66 deletions(-) diff --git a/payroll/views/views.py b/payroll/views/views.py index 11af44287..ef000b281 100644 --- a/payroll/views/views.py +++ b/payroll/views/views.py @@ -12,7 +12,7 @@ from urllib.parse import parse_qs import pandas as pd import pdfkit -from django.conf import settings +from django.conf import settings as pay_settings from django.contrib import messages from django.db.models import ProtectedError, Q from django.http import HttpResponse, HttpResponseRedirect, JsonResponse @@ -21,6 +21,7 @@ from django.template.loader import render_to_string from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext_lazy as _ +from django.views.decorators.http import require_http_methods from base.methods import ( closest_numbers, @@ -109,7 +110,7 @@ def contract_update(request, contract_id, **kwargs): contract = Contract.objects.filter(id=contract_id).first() if not contract: messages.info(request, _("The contract could not be found.")) - return redirect(contract_view) + return redirect("view-contract") contract_form = ContractForm(instance=contract) if request.method == "POST": contract_form = ContractForm(request.POST, request.FILES, instance=contract) @@ -184,7 +185,8 @@ def contract_status_update(request, contract_id): @permission_required("payroll.change_contract") def bulk_contract_status_update(request): status = request.POST.get("status") - ids = eval_validate(request.POST.get("ids")) + ids = request.POST.get("ids") + ids = eval_validate(ids) if ids else [] all_contracts = Contract.objects.all() contracts = all_contracts.filter(id__in=ids) @@ -218,6 +220,7 @@ def bulk_contract_status_update(request): @login_required @permission_required("payroll.change_contract") +@require_http_methods(["POST"]) def update_contract_filing_status(request, contract_id): if request.method == "POST": contract = get_object_or_404(Contract, id=contract_id) @@ -237,7 +240,7 @@ def update_contract_filing_status(request, contract_id): request, _("You selected the wrong option for filing status.") ) contract.save() - return redirect(contract_filter) + return redirect("contract-filter") @login_required @@ -473,6 +476,7 @@ def update_payslip_status(request, payslip_id): return render(request, "payroll/payslip/individual_payslip_summery.html", data) +@login_required def update_payslip_status_no_id(request): """ This method is used to update the payslip confirmation status @@ -572,13 +576,12 @@ def view_payslip_pdf(request, payslip_id): month_start_name = start_date.strftime("%B %d, %Y") month_end_name = end_date.strftime("%B %d, %Y") - # Formatted date for each format - for format_name, format_string in settings.HORILLA_DATE_FORMATS.items(): + for format_name, format_string in pay_settings.HORILLA_DATE_FORMATS.items(): if format_name == date_format: formatted_start_date = start_date.strftime(format_string) - for format_name, format_string in settings.HORILLA_DATE_FORMATS.items(): + for format_name, format_string in pay_settings.HORILLA_DATE_FORMATS.items(): if format_name == date_format: formatted_end_date = end_date.strftime(format_string) data["month_start_name"] = month_start_name @@ -723,11 +726,18 @@ def dashboard_employee_chart(request): payroll dashboard employee chart data """ - date = request.GET.get("period") - year = date.split("-")[0] - month = date.split("-")[1] + date = request.GET.get("period", datetime.now().strftime("%Y-%m")) + year, month = date.split("-") dataset = [] + employee_label = [] + list_of_employees = [] + response = { + "dataset": dataset, + "labels": employee_label, + "employees": list_of_employees, + "message": _("No payslips generated for this month."), + } is_ajax = request.headers.get("X-Requested-With") == "XMLHttpRequest" if is_ajax and request.method == "GET": employee_list = Payslip.objects.filter( @@ -771,7 +781,6 @@ def dashboard_employee_chart(request): total_pay_with_status[dataset_label][label] for label in employees ] - employee_label = [] for employee in employees: employee_label.append( f"{employee.employee_first_name} {employee.employee_last_name}" @@ -792,7 +801,7 @@ def dashboard_employee_chart(request): "employees": list_of_employees, "message": _("No payslips generated for this month."), } - return JsonResponse(response) + return JsonResponse(response) @login_required @@ -801,9 +810,8 @@ def payslip_details(request): payroll dashboard payslip details data """ - date = request.GET.get("period") - year = date.split("-")[0] - month = date.split("-")[1] + date = request.GET.get("period", datetime.now().strftime("%Y-%m")) + year, month = date.split("-") employee_list = [] employee_list = Payslip.objects.filter( Q(start_date__month=month) & Q(start_date__year=year) @@ -825,9 +833,8 @@ def dashboard_department_chart(request): payroll dashboard department chart data """ - date = request.GET.get("period") - year = date.split("-")[0] - month = date.split("-")[1] + date = request.GET.get("period", datetime.now().strftime("%Y-%m")) + year, month = date.split("-") dataset = [ { "label": "", @@ -838,57 +845,50 @@ def dashboard_department_chart(request): department = [] department_total = [] + response = { + "dataset": dataset, + "labels": department, + "department_total": department_total, + "message": _("No payslips generated for this month."), + } + is_ajax = request.headers.get("X-Requested-With") == "XMLHttpRequest" if is_ajax and request.method == "GET": - employee_list = Payslip.objects.filter( - Q(start_date__month=month) & Q(start_date__year=year) + payslips = Payslip.objects.filter( + start_date__month=month, start_date__year=year ) - for employee in employee_list: + department_totals = defaultdict(float) + + for slip in payslips: try: - department.append( - employee.employee_id.employee_work_info.department_id.department - ) + dept = slip.employee_id.get_department().department + department_totals[dept] += round(slip.net_pay, 2) except Exception as e: print(e) - department = list(set(department)) - for depart in department: - department_total.append({"department": depart, "amount": 0}) + departments = list(department_totals.keys()) - for employee in employee_list: - try: - employee_department = ( - employee.employee_id.employee_work_info.department_id.department - ) - except Exception as e: - print(e) - - for depart in department_total: - if depart["department"] == employee_department: - depart["amount"] += round(employee.net_pay, 2) - - colors = generate_colors(len(department)) + department_total = [ + {"department": dept, "amount": amount} + for dept, amount in department_totals.items() + ] + colors = generate_colors(len(departments)) dataset = [ { "label": "", - "data": [], + "data": list(department_totals.values()), "backgroundColor": colors, } ] - - for depart_total, depart in zip(department_total, department): - if depart == depart_total["department"]: - dataset[0]["data"].append(depart_total["amount"]) - response = { "dataset": dataset, - "labels": department, + "labels": departments, "department_total": department_total, "message": _("No payslips generated for this month."), } - return JsonResponse(response) + return JsonResponse(response) def contract_ending(request): @@ -1038,12 +1038,11 @@ def payslip_export(request): # Convert the string to a datetime.date object start_date = datetime.strptime(start_date_str, "%Y-%m-%d").date() end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() - - for format_name, format_string in settings.HORILLA_DATE_FORMATS.items(): + for format_name, format_string in pay_settings.HORILLA_DATE_FORMATS.items(): if format_name == date_format: formatted_start_date = start_date.strftime(format_string) - for format_name, format_string in settings.HORILLA_DATE_FORMATS.items(): + for format_name, format_string in pay_settings.HORILLA_DATE_FORMATS.items(): if format_name == date_format: formatted_end_date = end_date.strftime(format_string) @@ -1478,6 +1477,7 @@ def generate_payslip_pdf(template_path, context, html=False): return HttpResponse(f"Error generating PDF: {str(e)}", status=500) +@login_required def payslip_pdf(request, id): """ Generate the payslip as a PDF and return it in an HttpResponse. @@ -1526,7 +1526,7 @@ def payslip_pdf(request, id): end_date = datetime.strptime(end_date_str, "%Y-%m-%d").date() # Format the start and end dates - for format_name, format_string in settings.HORILLA_DATE_FORMATS.items(): + for format_name, format_string in pay_settings.HORILLA_DATE_FORMATS.items(): if format_name == date_format: formatted_start_date = start_date.strftime(format_string) formatted_end_date = end_date.strftime(format_string) @@ -1574,12 +1574,13 @@ def payslip_pdf(request, id): @permission_required("payroll.view_contract") def contract_select(request): page_number = request.GET.get("page") + contracts = Contract.objects.none() if page_number == "all": - employees = Contract.objects.all() + contracts = Contract.objects.all() - contract_ids = [str(emp.id) for emp in employees] - total_count = employees.count() + contract_ids = [str(contract.id) for contract in contracts] + total_count = contracts.count() context = {"contract_ids": contract_ids, "total_count": total_count} @@ -1591,35 +1592,35 @@ def contract_select_filter(request): page_number = request.GET.get("page") filtered = request.GET.get("filter") filters = json.loads(filtered) if filtered else {} + context = {} if page_number == "all": contract_filter = ContractFilter(filters, queryset=Contract.objects.all()) # Get the filtered queryset - filtered_employees = contract_filter.qs + filtered_contracts = contract_filter.qs - contract_ids = [str(emp.id) for emp in filtered_employees] - total_count = filtered_employees.count() + contract_ids = [str(contract.id) for contract in filtered_contracts] + total_count = filtered_contracts.count() context = {"contract_ids": contract_ids, "total_count": total_count} - return JsonResponse(context) + return JsonResponse(context) @login_required def payslip_select(request): page_number = request.GET.get("page") + payslip = Payslip.objects.none() if page_number == "all": if request.user.has_perm("payroll.view_payslip"): - employees = Payslip.objects.all() + payslip = Payslip.objects.all() else: - employees = Payslip.objects.filter( - employee_id__employee_user_id=request.user - ) + payslip = Payslip.objects.filter(employee_id__employee_user_id=request.user) - payslip_ids = [str(emp.id) for emp in employees] - total_count = employees.count() + payslip_ids = [str(emp.id) for emp in payslip] + total_count = payslip.count() context = {"payslip_ids": payslip_ids, "total_count": total_count} @@ -1631,6 +1632,7 @@ def payslip_select_filter(request): page_number = request.GET.get("page") filtered = request.GET.get("filter") filters = json.loads(filtered) if filtered else {} + context = {} if page_number == "all": payslip_filter = PayslipFilter(filters, queryset=Payslip.objects.all()) @@ -1643,7 +1645,7 @@ def payslip_select_filter(request): context = {"payslip_ids": payslip_ids, "total_count": total_count} - return JsonResponse(context) + return JsonResponse(context) @login_required