diff --git a/base/methods.py b/base/methods.py index 1fcecc6ad..dd15b10aa 100644 --- a/base/methods.py +++ b/base/methods.py @@ -56,7 +56,9 @@ def filter_own_and_subordinate_recordes(request, queryset, perm=None): user = request.user if user.has_perm(perm): return queryset - queryset = filter_own_records(request, queryset, perm) | filtersubordinates(request, queryset, perm) + queryset = filter_own_records(request, queryset, perm) | filtersubordinates( + request, queryset, perm + ) return queryset @@ -146,7 +148,7 @@ def sortby(request, queryset, key): orderingList = [item for item in orderingList if item["id"] != id] orderingList.append(ordering) order = f'{ordering["ordering"]}{sortby}' - setattr(request, 'sort_option', {}) + setattr(request, "sort_option", {}) request.sort_option["order"] = order return queryset @@ -454,7 +456,9 @@ def export_data(request, model, form_class, filter_class, file_name): company_name = Company.objects.filter(id=employee_company.id) emp_company = company_name.first() # Access the date_format attribute directly - time_format = emp_company.time_format if emp_company else "hh:mm A" + time_format = ( + emp_company.time_format if emp_company else "hh:mm A" + ) else: time_format = "hh:mm A" @@ -485,7 +489,9 @@ def export_data(request, model, form_class, filter_class, file_name): emp_company = company_name.first() # Access the date_format attribute directly - date_format = emp_company.date_format if emp_company else "MMM. D, YYYY" + date_format = ( + emp_company.date_format if emp_company else "MMM. D, YYYY" + ) else: date_format = "MMM. D, YYYY" # Define date formats diff --git a/base/translator.py b/base/translator.py index 8aebe731c..275db4654 100644 --- a/base/translator.py +++ b/base/translator.py @@ -309,6 +309,6 @@ _("resignation-requests-view"), _("action-type"), _("general-settings"), _("candidate-update"), -_(""), +_("create-payslip"), _(""), _(""), diff --git a/payroll/templates/payroll/payslip/payslip_table.html b/payroll/templates/payroll/payslip/payslip_table.html index 7d9e7e09b..7cf0db890 100644 --- a/payroll/templates/payroll/payslip/payslip_table.html +++ b/payroll/templates/payroll/payslip/payslip_table.html @@ -1,5 +1,16 @@ {% load static %} {% load i18n %} +{% if messages %} +
+ {% for message in messages %} +
+
+ {{ message }} +
+
+ {% endfor %} +
+{% endif %} {% include 'filter_tags.html' %} {% if not request.GET.dashboard %}
{% for payslip in payslips %} -
+
{{payslip.end_date}}
-
- {% for opt in payslip.status_choices %} {% endfor %} @@ -143,22 +154,26 @@
- - - {% if perms.payroll.add_payslip %} - - {% endif %} - {% if perms.payroll.delete_payslip %} -
-
- {% csrf_token %} - -
-
- {% endif %} -
+
+ {% csrf_token %} + +
+ {% if perms.payroll.add_payslip %} + + {% endif %} + {% if perms.payroll.delete_payslip %} + + {% endif %} +
-
+ {% endfor %}
@@ -220,10 +235,10 @@ {% endif %} ") + return redirect(filter_allowance) @login_required @@ -476,8 +482,12 @@ def delete_deduction(request, deduction_id): Args: id : deduction instance id """ - payroll.models.models.Deduction.objects.get(id=deduction_id).delete() - messages.success(request, _("Deduction deleted successfully")) + deduction = payroll.models.models.Deduction.objects.filter(id=deduction_id) + if deduction: + deduction.delete() + messages.success(request, _("Deduction deleted successfully")) + else: + messages.error(request, _("Deduction not found")) return redirect(view_deduction) @@ -821,7 +831,9 @@ def payslip_export(request): emp_company = company_name.first() # Access the date_format attribute directly - date_format = emp_company.date_format if emp_company else "MMM. D, YYYY" + date_format = ( + emp_company.date_format if emp_company else "MMM. D, YYYY" + ) else: date_format = "MMM. D, YYYY" # Define date formats @@ -884,21 +896,21 @@ def send_slip(request): if not len(EMAIL_HOST_USER): messages.error(request, "Email server is not configured") return redirect(view_payslip) - pasylip_ids = request.GET.getlist("id") - payslips = Payslip.objects.filter(id__in=pasylip_ids) + payslip_ids = request.GET.getlist("id") + payslips = Payslip.objects.filter(id__in=payslip_ids) result_dict = defaultdict( lambda: {"employee_id": None, "instances": [], "count": 0} ) - for pasylip in payslips: - employee_id = pasylip.employee_id + for payslip in payslips: + employee_id = payslip.employee_id result_dict[employee_id]["employee_id"] = employee_id - result_dict[employee_id]["instances"].append(pasylip) + result_dict[employee_id]["instances"].append(payslip) result_dict[employee_id]["count"] += 1 - mail_thread = MailSendThread(request, result_dict=result_dict, ids=pasylip_ids) + mail_thread = MailSendThread(request, result_dict=result_dict, ids=payslip_ids) mail_thread.start() messages.info(request, "Mail processing") - return redirect(view_payslip) + return redirect(filter_payslip) @login_required @@ -906,7 +918,7 @@ def send_slip(request): def add_bonus(request): employee_id = request.GET["employee_id"] payslip_id = request.GET.get("payslip_id") - if payslip_id: + if payslip_id != "None" and payslip_id: instance = Payslip.objects.get(id=payslip_id) form = forms.PayslipAllowanceForm( initial={"employee_id": employee_id, "date": instance.start_date} @@ -918,7 +930,7 @@ def add_bonus(request): if form.is_valid(): form.save() messages.success(request, _("Bonus Added")) - if payslip_id: + if payslip_id != "None" and payslip_id: new_post_data = QueryDict(mutable=True) new_post_data.update( { @@ -1078,6 +1090,7 @@ def search_loan(request): """ records = LoanAccountFilter(request.GET).qs data_dict = parse_qs(request.GET.urlencode()) + get_key_instances(LoanAccount,data_dict) return render( request, "payroll/loan/records.html", @@ -1155,7 +1168,7 @@ def view_reimbursement(request): "pd": request.GET.urlencode(), "filter_dict": data_dict, "view": view, - 'reimbursement_exists':reimbursement_exists + "reimbursement_exists": reimbursement_exists, }, ) @@ -1194,7 +1207,7 @@ def search_reimbursement(request): template = "payroll/reimbursement/request_cards.html" if view == "list": template = "payroll/reimbursement/reimbursement_list.html" - data_dict.pop("view",None) + get_key_instances(Reimbursement, data_dict) return render( request, template, @@ -1259,7 +1272,7 @@ def approve_reimbursements(request): recipient=emp.employee_user_id, verb="Your reimbursement request has been rejected.", verb_ar="تم رفض طلب استرداد النفقات الخاص بك.", - verb_de= "Ihr Erstattungsantrag wurde abgelehnt.", + verb_de="Ihr Erstattungsantrag wurde abgelehnt.", verb_es="Su solicitud de reembolso ha sido rechazada.", verb_fr="Votre demande de remboursement a été rejetée.", redirect=f"/payroll/view-reimbursement?id={reimbursement.id}", diff --git a/payroll/views/views.py b/payroll/views/views.py index 7717b12bf..b4751beae 100644 --- a/payroll/views/views.py +++ b/payroll/views/views.py @@ -89,7 +89,10 @@ def contract_update(request, contract_id, **kwargs): Otherwise, renders the contract update form. """ - contract = Contract.objects.get(id=contract_id) + contract = Contract.objects.filter(id=contract_id).first() + if not contract: + messages.info(request,_("The contract could not be found.")) + return redirect(contract_view) contract_form = ContractForm(instance=contract) if request.method == "POST": contract_form = ContractForm(request.POST, request.FILES, instance=contract) @@ -109,6 +112,11 @@ def contract_update(request, contract_id, **kwargs): def contract_status_update(request, contract_id): if request.method == "POST": contract = Contract.objects.get(id=contract_id) + if request.POST.get("view"): + contract.contract_status = request.POST.get("status") + contract.save() + messages.success(request,_("The contract status has been updated successfully.")) + return redirect(contract_filter) contract_form = ContractForm(request.POST, request.FILES, instance=contract) if contract_form.is_valid(): contract_form.save() @@ -346,6 +354,7 @@ def update_payslip_status(request, payslip_id): This method is used to update the payslip confirmation status """ status = request.POST.get("status") + view = request.POST.get("view") payslip = Payslip.objects.filter(id=payslip_id).first() if payslip: payslip.status = status @@ -353,6 +362,10 @@ def update_payslip_status(request, payslip_id): messages.success(request, _("Payslip status updated")) else: messages.error(request, _("Payslip not found")) + if view: + from .component_views import filter_payslip + + return redirect(filter_payslip) data = payslip.pay_head_data data["employee"] = payslip.employee_id data["payslip"] = payslip @@ -451,6 +464,8 @@ def delete_payslip(request, payslip_id): Args: payslip_id (int): Payslip model instance id """ + from .component_views import filter_payslip + try: Payslip.objects.get(id=payslip_id).delete() messages.success(request, _("Payslip deleted")) @@ -458,7 +473,7 @@ def delete_payslip(request, payslip_id): messages.error(request, _("Payslip not found.")) except ProtectedError: messages.error(request, _("Something went wrong")) - return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + return redirect(filter_payslip) @login_required diff --git a/static/index/index.js b/static/index/index.js index d3ac024f1..5530983e6 100644 --- a/static/index/index.js +++ b/static/index/index.js @@ -30,7 +30,6 @@ function getCookie(name) { return cookieValue; } - var originalConfirm = window.confirm; // Override the default confirm function with SweetAlert window.confirm = function (message) { @@ -73,6 +72,15 @@ window.confirm = function (message) { htmx.ajax("GET", path, hxTarget); } } + } else { + var path = event.target["htmx-internal-data"].path; + var verb = event.target["htmx-internal-data"].verb; + var hxTarget = $(event.target).attr("hx-target"); + if (verb === "post") { + htmx.ajax("POST", path, hxTarget); + } else { + htmx.ajax("GET", path, hxTarget); + } } } else { }