diff --git a/attendance/models.py b/attendance/models.py
index 6152b9bd7..59e286f5a 100644
--- a/attendance/models.py
+++ b/attendance/models.py
@@ -859,7 +859,9 @@ def create_initial_stage(sender, instance, created, **kwargs):
penalty.amount = instance.penalty_amount
penalty.only_show_under_employee = True
penalty.save()
+ penalty.include_active_employees = False
penalty.specific_employees.add(instance.employee_id)
+ penalty.save()
if instance.leave_type_id and instance.minus_leaves:
available = instance.employee_id.available_leave.filter(
@@ -869,9 +871,6 @@ def create_initial_stage(sender, instance, created, **kwargs):
if not instance.deduct_from_carry_forward:
available.available_days = max(0, (available.available_days - unit))
else:
- print("=================")
- print(available.carryforward_days)
- print(available.carryforward_days-unit)
available.carryforward_days = max(
0, (available.carryforward_days - unit)
)
diff --git a/employee/templates/tabs/allowance_deduction-tab.html b/employee/templates/tabs/allowance_deduction-tab.html
index ab41d590c..2e9830707 100644
--- a/employee/templates/tabs/allowance_deduction-tab.html
+++ b/employee/templates/tabs/allowance_deduction-tab.html
@@ -2,18 +2,25 @@
{% load static %}
{% load basefilters %}
{% load attendancefilters %}
-
+
- -
+
-
-
![]()
+

{% trans "Allowances" %}
+
+ {% if perms.payroll.add_allowance %}
+
+ {% endif %}
@@ -239,6 +246,16 @@
+
+
@@ -261,4 +278,8 @@
$(newActiveTab).toggleClass("oh-tabs__content--active");
});
});
+ let activeTabs = $("#AllowanceAndDeduction .oh-tabs__tab--active").length
+ if(!activeTabs){
+ $("#AllowanceAndDeduction .oh-tabs__tab").first().toggleClass("oh-tabs__tab--active")
+ }
diff --git a/employee/views.py b/employee/views.py
index 3bfeee338..b7fa58be9 100755
--- a/employee/views.py
+++ b/employee/views.py
@@ -444,6 +444,7 @@ def allowances_deductions_tab(request, emp_id):
"active_contracts": active_contracts,
"allowances": employee_allowances if employee_allowances else None,
"deductions": employee_deductions if employee_deductions else None,
+ "employee":employee,
}
return render(request, "tabs/allowance_deduction-tab.html", context=context)
diff --git a/payroll/forms/component_forms.py b/payroll/forms/component_forms.py
index b38427ece..c08a6c042 100644
--- a/payroll/forms/component_forms.py
+++ b/payroll/forms/component_forms.py
@@ -10,12 +10,12 @@ from django.template.loader import render_to_string
from horilla_widgets.forms import HorillaForm
from horilla_widgets.widgets.horilla_multi_select_field import HorillaMultiSelectField
from horilla_widgets.widgets.select_widgets import HorillaMultiSelectWidget
-from base.forms import ModelForm
+from base.forms import Form, ModelForm
from employee.models import Employee
from employee.filters import EmployeeFilter
from payroll.models import tax_models as models
from payroll.widgets import component_widgets as widget
-from payroll.models.models import Contract
+from payroll.models.models import Allowance, Contract
import payroll.models.models
from base.methods import reload_queryset
@@ -309,3 +309,40 @@ class ContractExportFieldForm(forms.Form):
"contract_status",
],
)
+
+
+class BonusForm(Form):
+ """
+ Bonus Creating Form
+ """
+ title = forms.CharField(max_length=100)
+ date = forms.DateField(widget=forms.DateInput())
+ employee_id = forms.IntegerField(label="Employee",widget=forms.HiddenInput())
+ amount = forms.DecimalField(label="Amount")
+
+ def save(self, commit=True):
+ title = self.cleaned_data["title"]
+ date = self.cleaned_data["date"]
+ employee_id = self.cleaned_data["employee_id"]
+ amount = self.cleaned_data["amount"]
+
+ bonus = Allowance()
+ bonus.title = title
+ bonus.one_time_date = date
+ bonus.only_show_under_employee = True
+ bonus.amount = amount
+ bonus.is_fixed = True
+ bonus.save()
+ bonus.include_active_employees = False
+ bonus.specific_employees.set([employee_id])
+ bonus.save()
+
+ return bonus
+
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ for field_name, field in self.fields.items():
+ field.widget.attrs.update({"class": "oh-input w-100"})
+ self.fields["date"].widget = forms.DateInput(
+ attrs={"type": "date", "class": "oh-input w-100"}
+ )
diff --git a/payroll/templates/payroll/bonus/form.html b/payroll/templates/payroll/bonus/form.html
new file mode 100644
index 000000000..6512a5c61
--- /dev/null
+++ b/payroll/templates/payroll/bonus/form.html
@@ -0,0 +1,6 @@
+
diff --git a/payroll/urls/component_urls.py b/payroll/urls/component_urls.py
index 9443bf633..1552b77ea 100644
--- a/payroll/urls/component_urls.py
+++ b/payroll/urls/component_urls.py
@@ -70,6 +70,7 @@ urlpatterns = [
component_views.hx_create_allowance,
name="hx-create-allowance",
),
- path("send-slip",component_views.send_slip,name="send-slip")
+ path("send-slip",component_views.send_slip,name="send-slip"),
+ path("add-bonus/",component_views.add_bonus,name="add-bonus")
]
diff --git a/payroll/views/component_views.py b/payroll/views/component_views.py
index 38530f1f6..07313f2cb 100644
--- a/payroll/views/component_views.py
+++ b/payroll/views/component_views.py
@@ -223,7 +223,9 @@ 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 = payroll.models.models.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])
@@ -354,7 +356,9 @@ 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 = payroll.models.models.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])
@@ -840,3 +844,20 @@ def send_slip(request):
mail_thread.start()
messages.info(request, "Mail processing")
return redirect(view_payslip)
+
+
+@login_required
+@permission_required("payroll.add_allowance")
+def add_bonus(request):
+ print("========================================")
+ print(request.GET)
+ print("========================================")
+ employee_id = request.GET["employee_id"]
+ form = forms.BonusForm(initial={"employee_id": employee_id})
+ if request.method == "POST":
+ form = forms.BonusForm(request.POST, initial={"employee_id": employee_id})
+ if form.is_valid():
+ form.save()
+ messages.success(request, "Bonus Added")
+ return HttpResponse("")
+ return render(request, "payroll/bonus/form.html", {"form": form,"employee_id":employee_id})