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 @@ +
    + {{ form }} +
    + +
    +
    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})