diff --git a/payroll/admin.py b/payroll/admin.py index 2cf963052..af9442106 100644 --- a/payroll/admin.py +++ b/payroll/admin.py @@ -11,7 +11,8 @@ from payroll.models.models import ( Payslip, WorkRecord, LoanAccount, - Reimbursement + Reimbursement, + ReimbursementrequestComment ) from payroll.models.tax_models import ( PayrollSettings, @@ -29,3 +30,4 @@ admin.site.register(Payslip) admin.site.register(PayrollSettings) admin.site.register(LoanAccount) admin.site.register(Reimbursement) +admin.site.register(ReimbursementrequestComment) \ No newline at end of file diff --git a/payroll/forms/forms.py b/payroll/forms/forms.py index 4292c78d1..b37b028fb 100644 --- a/payroll/forms/forms.py +++ b/payroll/forms/forms.py @@ -5,7 +5,7 @@ from django import forms from django.forms import widgets from django.utils.translation import gettext_lazy as trans from django.template.loader import render_to_string -from payroll.models.models import WorkRecord +from payroll.models.models import ReimbursementrequestComment, WorkRecord from payroll.models.models import Contract from base.methods import reload_queryset @@ -116,3 +116,17 @@ class WorkRecordForm(ModelForm): fields = "__all__" model = WorkRecord + + +class ReimbursementrequestCommentForm(ModelForm): + """ + ReimbursementrequestCommentForm form + """ + + class Meta: + """ + Meta class for additional options + """ + + model = ReimbursementrequestComment + fields = ('comment',) \ No newline at end of file diff --git a/payroll/models/models.py b/payroll/models/models.py index 602068eae..557752504 100644 --- a/payroll/models/models.py +++ b/payroll/models/models.py @@ -1557,3 +1557,21 @@ class Reimbursement(models.Model): if self.allowance_id: self.allowance_id.delete() return super().delete(*args, **kwargs) + + +class ReimbursementrequestComment(models.Model): + """ + ReimbursementrequestComment Model + """ + + request_id = models.ForeignKey(Reimbursement, on_delete=models.CASCADE) + employee_id = models.ForeignKey(Employee, on_delete=models.CASCADE) + comment = models.TextField(null=True, verbose_name=_("Comment")) + created_at = models.DateTimeField( + auto_now_add=True, + verbose_name=_("Created At"), + null=True, + ) + + def __str__(self) -> str: + return f"{self.comment}" diff --git a/payroll/templates/payroll/reimbursement/comment_view.html b/payroll/templates/payroll/reimbursement/comment_view.html new file mode 100644 index 000000000..48e401521 --- /dev/null +++ b/payroll/templates/payroll/reimbursement/comment_view.html @@ -0,0 +1,56 @@ +{% load basefilters %} +{% load i18n %} + +{% if no_comments %} + +
+
+
+ {% trans "There is no comments to show." %} + +
+
+
+ +{% else %} + + {% for comment in comments %} +
+
+
+ {% trans "Comment" %} + + + +
+ {{comment.comment}} +
+
+
+
+
+
+
+ {% trans "By" %} + + {{ comment.employee_id }} +
+
+ {% trans "Date & Time" %} + + {% trans "on" %}  {{ comment.created_at|date:"F j, Y" }}   + {% trans "at" %}   {{ comment.created_at|time:"g:i A" }} + +
+ +
+
+
+ + + {% endfor %} + +{% endif %} + + diff --git a/payroll/templates/payroll/reimbursement/nav.html b/payroll/templates/payroll/reimbursement/nav.html index 406a076c0..ee8bb637d 100644 --- a/payroll/templates/payroll/reimbursement/nav.html +++ b/payroll/templates/payroll/reimbursement/nav.html @@ -10,14 +10,14 @@ - {% endcomment %} {% include 'payroll/reimbursement/filter.html' %}
diff --git a/payroll/templates/payroll/reimbursement/reimbursement_request_comment_form.html b/payroll/templates/payroll/reimbursement/reimbursement_request_comment_form.html new file mode 100644 index 000000000..19aaa807a --- /dev/null +++ b/payroll/templates/payroll/reimbursement/reimbursement_request_comment_form.html @@ -0,0 +1,27 @@ +{% load i18n %} +{% if form.errors %} + +
+
+ {% for error in form.non_field_errors %} +
+ {{ error }} +
+ {% endfor %} +
+
+{% endif %} +
+ {% csrf_token %} + {{form.as_p}} + +
\ No newline at end of file diff --git a/payroll/templates/payroll/reimbursement/request_cards.html b/payroll/templates/payroll/reimbursement/request_cards.html index 6da9d6a80..211de3312 100644 --- a/payroll/templates/payroll/reimbursement/request_cards.html +++ b/payroll/templates/payroll/reimbursement/request_cards.html @@ -56,8 +56,17 @@

{{ req.title }}

{{ req.description }}.

- - {% trans 'Allowance on' %} {{ req.allowance_on }}. + + + + + {% trans 'Allowance on' %} {{ req.allowance_on }} {% if req.type == 'reimbursement' %} {% trans 'View Attachments' %} @@ -145,6 +154,54 @@
+ + + + + + ") + return render( + request, + "payroll/reimbursement/reimbursement_request_comment_form.html", + { + "form": form, "request_id":payroll_id + }, + ) + + +@login_required +def view_payrollrequest_comment(request, payroll_id): + """ + This method is used to show Reimbursement request comments + """ + comments = ReimbursementrequestComment.objects.filter(request_id=payroll_id).order_by('-created_at') + no_comments = False + if not comments.exists(): + no_comments = True + + return render( + request, + "payroll/reimbursement/comment_view.html", + {"comments": comments, 'no_comments': no_comments } + ) + + +@login_required +def delete_payrollrequest_comment(request, comment_id): + """ + This method is used to delete Reimbursement request comments + """ + ReimbursementrequestComment.objects.get(id=comment_id).delete() + + messages.success(request, _("Comment deleted successfully!")) + return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))