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 %}
+
+ {% endfor %}
+
+{% endif %}
{% include 'filter_tags.html' %}
{% if not request.GET.dashboard %}
{% for payslip in payslips %}
-
@@ -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 {
}