[FIX] PAYROLL: #819
This commit is contained in:
@@ -903,69 +903,81 @@ class ReimbursementForm(ModelForm):
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
request = getattr(horilla_middlewares._thread_locals, "request", None)
|
||||
if self.instance.pk:
|
||||
employee_id = self.instance.employee_id
|
||||
type = self.instance.type
|
||||
|
||||
else:
|
||||
employee_id = request.user.employee_get
|
||||
type = cleaned_data["type"]
|
||||
type_ = cleaned_data.get("type")
|
||||
employee = cleaned_data.get("employee_id")
|
||||
|
||||
available_points = BonusPoint.objects.filter(employee_id=employee_id).first()
|
||||
if type == "bonus_encashment":
|
||||
if self.instance.pk:
|
||||
bonus_to_encash = self.instance.bonus_to_encash
|
||||
else:
|
||||
bonus_to_encash = cleaned_data["bonus_to_encash"]
|
||||
if not type_ or not employee:
|
||||
return cleaned_data
|
||||
|
||||
if available_points.points < bonus_to_encash:
|
||||
raise forms.ValidationError(
|
||||
{"bonus_to_encash": "Not enough bonus points to redeem"}
|
||||
)
|
||||
if bonus_to_encash <= 0:
|
||||
raise forms.ValidationError(
|
||||
{"bonus_to_encash": "Points must be greater than zero to redeem."}
|
||||
)
|
||||
if type == "leave_encashment":
|
||||
if self.instance.pk:
|
||||
leave_type_id = self.instance.leave_type_id
|
||||
cfd_to_encash = self.instance.cfd_to_encash
|
||||
ad_to_encash = self.instance.ad_to_encash
|
||||
if type_ == "bonus_encashment":
|
||||
bonus_to_encash = (
|
||||
self.instance.bonus_to_encash
|
||||
if self.instance.pk
|
||||
else cleaned_data.get("bonus_to_encash")
|
||||
)
|
||||
available_points = BonusPoint.objects.filter(employee_id=employee).first()
|
||||
|
||||
if bonus_to_encash is not None:
|
||||
if bonus_to_encash <= 0:
|
||||
self.add_error(
|
||||
"bonus_to_encash", "Points must be greater than zero to redeem."
|
||||
)
|
||||
elif not available_points or available_points.points < bonus_to_encash:
|
||||
self.add_error(
|
||||
"bonus_to_encash", "Not enough bonus points to redeem"
|
||||
)
|
||||
|
||||
elif type_ == "leave_encashment":
|
||||
leave_type = (
|
||||
self.instance.leave_type_id
|
||||
if self.instance.pk
|
||||
else cleaned_data.get("leave_type_id")
|
||||
)
|
||||
cfd_to_encash = (
|
||||
self.instance.cfd_to_encash
|
||||
if self.instance.pk
|
||||
else cleaned_data.get("cfd_to_encash", 0)
|
||||
)
|
||||
ad_to_encash = (
|
||||
self.instance.ad_to_encash
|
||||
if self.instance.pk
|
||||
else cleaned_data.get("ad_to_encash", 0)
|
||||
)
|
||||
|
||||
if not leave_type:
|
||||
self.add_error("leave_type_id", "This field is required")
|
||||
else:
|
||||
leave_type_id = cleaned_data["leave_type_id"]
|
||||
cfd_to_encash = cleaned_data["cfd_to_encash"]
|
||||
ad_to_encash = cleaned_data["ad_to_encash"]
|
||||
encashable_leaves = self.get_encashable_leaves(employee_id)
|
||||
if leave_type_id is None:
|
||||
raise forms.ValidationError({"leave_type_id": "This field is required"})
|
||||
elif leave_type_id not in encashable_leaves:
|
||||
raise forms.ValidationError(
|
||||
{"leave_type_id": "This leave type is not encashable"}
|
||||
)
|
||||
else:
|
||||
AvailableLeave = get_horilla_model_class(
|
||||
app_label="leave", model="availableleave"
|
||||
)
|
||||
available_leave = AvailableLeave.objects.filter(
|
||||
leave_type_id=leave_type_id, employee_id=employee_id
|
||||
).first()
|
||||
if cfd_to_encash < 0:
|
||||
raise forms.ValidationError(
|
||||
{"cfd_to_encash": _("Value can't be negative.")}
|
||||
)
|
||||
if ad_to_encash < 0:
|
||||
raise forms.ValidationError(
|
||||
{"ad_to_encash": _("Value can't be negative.")}
|
||||
)
|
||||
if cfd_to_encash > available_leave.carryforward_days:
|
||||
raise forms.ValidationError(
|
||||
{"cfd_to_encash": _("Not enough carryforward days to redeem")}
|
||||
)
|
||||
if ad_to_encash > available_leave.available_days:
|
||||
raise forms.ValidationError(
|
||||
{"ad_to_encash": _("Not enough available days to redeem")}
|
||||
)
|
||||
encashable = self.get_encashable_leaves(employee)
|
||||
if leave_type not in encashable:
|
||||
self.add_error("leave_type_id", "This leave type is not encashable")
|
||||
else:
|
||||
AvailableLeave = get_horilla_model_class("leave", "availableleave")
|
||||
available_leave = AvailableLeave.objects.filter(
|
||||
leave_type_id=leave_type, employee_id=employee
|
||||
).first()
|
||||
|
||||
if available_leave:
|
||||
if cfd_to_encash < 0:
|
||||
self.add_error(
|
||||
"cfd_to_encash", _("Value can't be negative.")
|
||||
)
|
||||
elif cfd_to_encash > available_leave.carryforward_days:
|
||||
self.add_error(
|
||||
"cfd_to_encash",
|
||||
_("Not enough carryforward days to redeem"),
|
||||
)
|
||||
|
||||
if ad_to_encash < 0:
|
||||
self.add_error(
|
||||
"ad_to_encash", _("Value can't be negative.")
|
||||
)
|
||||
elif ad_to_encash > available_leave.available_days:
|
||||
self.add_error(
|
||||
"ad_to_encash", _("Not enough available days to redeem")
|
||||
)
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def save(self, commit: bool = True) -> Any:
|
||||
multiple_attachment_ids = []
|
||||
|
||||
@@ -1597,19 +1597,23 @@ def view_reimbursement(request):
|
||||
@hx_request_required
|
||||
def create_reimbursement(request):
|
||||
"""
|
||||
This method is used to create reimbursement
|
||||
Create or update a reimbursement entry.
|
||||
"""
|
||||
instance_id = eval_validate(str(request.GET.get("instance_id")))
|
||||
instance = None
|
||||
instance_id = request.GET.get("instance_id")
|
||||
|
||||
if instance_id:
|
||||
instance = Reimbursement.objects.filter(id=instance_id).first()
|
||||
form = forms.ReimbursementForm(instance=instance)
|
||||
|
||||
if request.method == "POST":
|
||||
form = forms.ReimbursementForm(request.POST, request.FILES, instance=instance)
|
||||
if form.is_valid():
|
||||
form.save()
|
||||
messages.success(request, "Reimbursent saved successfully")
|
||||
return HttpResponse("<script>window.location.reload()</script>")
|
||||
messages.success(request, "Reimbursement saved successfully")
|
||||
return HttpResponse(status=204, headers={"HX-Refresh": "true"})
|
||||
else:
|
||||
form = forms.ReimbursementForm(instance=instance)
|
||||
|
||||
return render(request, "payroll/reimbursement/form.html", {"form": form})
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user