[UPDT] LEAVE: Updation in leave request updation form by exclude status field from form

This commit is contained in:
Horilla
2024-02-23 12:08:08 +05:30
parent 5c62c73f41
commit 9f648e419a
5 changed files with 210 additions and 105 deletions

View File

@@ -194,7 +194,7 @@ def login_user(request):
)
return redirect("/login")
if user.employee_get.is_active == False:
messages.error(
messages.warning(
request,
_(
"This user is archived. Please contact the manager for more information."

View File

@@ -252,46 +252,50 @@
</div>
{% if perms.leave.change_leaverequest %}
<div class="oh-sticky-table__td" onclick="event.stopPropagation()">
<div class="oh-btn-group">
{% if leave_request.status != 'approved' %}
<a
type="submit"
href="{% url 'request-approve' leave_request.id leave_request.employee_id.id %}"
title="{% trans 'Approve' %}"
class="oh-btn oh-btn--success w-100"
>
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
<div class="oh-btn-group" >
{% if leave_request.status == 'cancelled' %}
{% if leave_request.end_date >= current_date %}
<a type="submit" data-toggle="oh-modal-toggle"
data-target="#rejectModal" hx-get="{% url 'request-cancel' leave_request.id %}" hx-target="#rejectForm" title="{% trans 'Approve cancellation request' %}"
class="oh-btn oh-btn--warning w-100";>
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
{% else %}
<a type="submit" href="#" title="{% trans 'Approve cancellation request' %}"
class="oh-btn oh-btn--secondary oh-btn--disabled
w-100">
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
{% endif %}
{% else %}
<a
type="submit"
href="{% url 'request-approve' leave_request.id leave_request.employee_id.id %}"
title="{% trans 'Approve' %}"
class="oh-btn oh-btn--success oh-btn--disabled w-100"
>
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
{% endif %}
{% if leave_request.status != "rejected" %}
<a
type="submit" data-toggle="oh-modal-toggle"
data-target="#rejectModal" hx-get="{% url 'request-cancel' leave_request.id %}"
hx-target="#rejectForm" title="{% trans 'Reject' %}"
class="oh-btn oh-btn--danger w-100"
>
<ion-icon class="me-1" name="close-circle-outline"></ion-icon>
</a>
{% else %}
<a
type="submit"
data-target="#rejectModal"
hx-get="{% url 'request-cancel' leave_request.id leave_request.employee_id.id %}"
hx-target="#rejectForm"
title="{% trans 'Cancel' %}"
class="oh-btn oh-btn--danger oh-btn--disabled w-100"
>
<ion-icon class="me-1" name="close-circle-outline"></ion-icon>
</a>
{% if leave_request.is_approved and leave_request.status == 'requested' and leave_request.end_date >= current_date %}
<a href="{% url 'request-approve' leave_request.id %}" title="{% trans 'Approve' %}"
class="oh-btn oh-btn--success w-100" {% if leave_request.end_date.month > current_date.month %} onclick = "leaveRequestConfirm('This leave request is for the month of {{leave_request.start_date|date:'F'}}. Approval depends on the {{leave_request.employee_id.get_full_name}} having available leave days for this month.',event);" {% else %} onclick = "return confirm('Do You really want to Approve this request?')"; {% endif %}>
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
{% else %}
<a type="submit" href="#" title="{% trans 'Approve' %}"
class="oh-btn oh-btn--success oh-btn--disabled
w-100">
<ion-icon class="me-1" name="checkmark-outline"></ion-icon>
</a>
{% endif %}
{% if leave_request.status != 'rejected' and leave_request.end_date >= current_date %}
<a type="submit" data-toggle="oh-modal-toggle"
data-target="#rejectModal" hx-get="{% url 'request-cancel' leave_request.id %}" hx-target="#rejectForm" title="{% trans 'Reject' %}"
class="oh-btn oh-btn--danger w-100">
<ion-icon class="me-1" name="close-circle-outline"></ion-icon>
</a>
{% else %}
<a type="submit" href="#" title="{% trans 'Reject' %}"
class="oh-btn oh-btn--danger oh-btn--disabled
w-100" >
<ion-icon class="me-1" name="close-circle-outline"></ion-icon>
</a>
{% endif %}
{% endif %}
</div>
</div>
@@ -354,7 +358,7 @@
<div class="oh-modal__dialog">
<div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="rejectTitle">
{% trans "Reject Leave Allocation Request" %}
{% trans "Request Rejection" %}
</h2>
<button class="oh-modal_close--custom" aria-label="Close" onclick="$('#rejectModal').removeClass('oh-modal--show');">
<ion-icon name="close-outline"></ion-icon>

View File

@@ -103,6 +103,7 @@ from employee.models import (
EmployeeWorkInformation,
EmployeeBankDetails,
)
from onboarding.models import OnboardingStage, OnboardingTask
from payroll.forms.forms import EncashmentGeneralSettingsForm
from payroll.methods.payslip_calc import dynamic_attr
from payroll.models.models import (
@@ -113,7 +114,7 @@ from payroll.models.models import (
Reimbursement,
)
from pms.models import Feedback
from recruitment.models import Candidate
from recruitment.models import Candidate, Recruitment, Stage
from horilla_documents.models import Document, DocumentRequest
@@ -249,6 +250,7 @@ def employee_view_individual(request, obj_id, **kwargs):
{
"employee": employee,
"employee_leaves": employee_leaves,
"current_date": date.today(),
"leave_request_ids": leave_request_ids,
"enabled_block_unblock": enabled_block_unblock,
},
@@ -1821,11 +1823,14 @@ def employee_bulk_archive(request):
employee = Employee.objects.get(id=employee_id)
employee.is_active = is_active
employee.employee_user_id.is_active = is_active
employee.save()
message = _("archived")
if is_active:
message = _("un-archived")
messages.success(request, f"{employee} is {message}")
if employee.get_archive_condition() is False:
employee.save()
message = _("archived")
if is_active:
message = _("un-archived")
messages.success(request, f"{employee} is {message}")
else:
messages.warning(request,_("Related data found for {}.").format(employee))
return JsonResponse({"message": "Success"})
@@ -1863,11 +1868,87 @@ def employee_archive(request, obj_id):
{
"employee": employee,
"related_models": result.get("related_models"),
"title": _("Cant't Archive"),
"related_model_fields": result.get("related_model_fields"),
"employee_choices": result.get("employee_choices"),
"title": _("Can't Archive"),
},
)
@login_required
@permission_required("employee.change_employee")
def replace_employee(request, emp_id):
employee = Employee.objects.filter(id=emp_id).first()
related_models = (
employee.get_archive_condition().get("related_models", "") if employee else None
)
if related_models and employee:
for models in related_models:
field_name = models.get("field_name", "")
if field_name:
replace_emp_id = request.POST.get(field_name)
replace_emp = Employee.objects.filter(id=replace_emp_id).first()
if (
field_name == "reporting_manager_id"
and str(emp_id) != replace_emp_id
):
reporting_manager = EmployeeWorkInformation.objects.filter(
reporting_manager_id=emp_id
).update(reporting_manager_id=replace_emp)
elif (
field_name == "recruitment_managers"
and str(emp_id) != replace_emp_id
):
recruitment_query = Recruitment.objects.filter(
recruitment_managers=emp_id
)
if recruitment_query:
for recruitment in recruitment_query:
recruitment.recruitment_managers.remove(emp_id)
recruitment.recruitment_managers.add(replace_emp)
elif (
field_name == "recruitment_stage_managers"
and str(emp_id) != replace_emp_id
):
recruitment_stage_query = Stage.objects.filter(
stage_managers=emp_id
)
if recruitment_stage_query:
for stage in recruitment_stage_query:
stage.stage_managers.remove(emp_id)
stage.stage_managers.add(replace_emp)
elif (
field_name == "onboarding_stage_manager"
and str(emp_id) != replace_emp_id
):
onboarding_stage_query = OnboardingStage.objects.filter(
employee_id=emp_id
)
if onboarding_stage_query:
for stage in onboarding_stage_query:
stage.employee_id.remove(emp_id)
stage.employee_id.add(replace_emp)
elif (
field_name == "onboarding_task_manager"
and str(emp_id) != replace_emp_id
):
onboarding_task_query = OnboardingTask.objects.filter(
employee_id=emp_id
)
if onboarding_task_query:
for task in onboarding_task_query:
task.employee_id.remove(emp_id)
task.employee_id.add(replace_emp)
else:
pass
related_models = employee.get_archive_condition()
if related_models is False:
employee.is_active = False
employee.save()
messages.success(request, _("{} archived successfully").format(employee))
return redirect(employee_view)
@login_required
@permission_required("employee.view_employee")
def get_manager_in(request):
@@ -2188,33 +2269,33 @@ def work_info_import(request):
"Salary Hour",
]
)
error_data={
"Badge id" : [],
"First Name" : [],
"Last Name" : [],
"Phone" : [],
"Email" : [],
"Gender" : [],
"Department" : [],
"Job Position" : [],
"Job Role" : [],
"Work Type" : [],
"Shift" : [],
"Employee Type" : [],
"Reporting Manager" : [],
"Company" : [],
"Location" : [],
"Date joining" : [],
"Contract End Date" : [],
"Basic Salary" : [],
"Salary Hour" : [],
"Email Error" : [],
"First Name error" : [],
"Phone error" : [],
"Joining Date Error" : [],
"Contract Error" : [],
}
error_data = {
"Badge id": [],
"First Name": [],
"Last Name": [],
"Phone": [],
"Email": [],
"Gender": [],
"Department": [],
"Job Position": [],
"Job Role": [],
"Work Type": [],
"Shift": [],
"Employee Type": [],
"Reporting Manager": [],
"Company": [],
"Location": [],
"Date joining": [],
"Contract End Date": [],
"Basic Salary": [],
"Salary Hour": [],
"Email Error": [],
"First Name error": [],
"Phone error": [],
"Joining Date Error": [],
"Contract Error": [],
}
# Export the DataFrame to an Excel file
response = HttpResponse(content_type="application/ms-excel")
response["Content-Disposition"] = 'attachment; filename="work_info_template.xlsx"'
@@ -2229,7 +2310,7 @@ def work_info_import(request):
error = False
try:
email = work_info["Email"]
phone = work_info["Phone"]
phone = work_info["Phone"]
first_name = convert_nan("First Name", work_info)
last_name = work_info["Last Name"]
badge_id = convert_nan("Badge id", work_info)
@@ -2243,12 +2324,12 @@ def work_info_import(request):
location = convert_nan("Location", work_info)
shift = convert_nan("Shift", work_info)
date_joining = work_info["Date joining"]
contract_end_date = work_info["Contract End Date"]
contract_end_date = work_info["Contract End Date"]
basic_salary = convert_nan("Basic Salary", work_info)
salary_hour = convert_nan("Salary Hour", work_info)
gender = work_info.get("Gender")
pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
pattern = r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
if re.match(pattern, email):
pass
else:
@@ -2266,13 +2347,17 @@ def work_info_import(request):
try:
pd.to_datetime(date_joining).date()
except:
work_info["Joining Date Error"] = f"Invalid Date format. Please use the format YYYY-MM-DD"
work_info["Joining Date Error"] = (
f"Invalid Date format. Please use the format YYYY-MM-DD"
)
error = True
try:
pd.to_datetime(contract_end_date).date()
except:
work_info["Contract Error"] = f"Invalid Date format. Please use the format YYYY-MM-DD"
work_info["Contract Error"] = (
f"Invalid Date format. Please use the format YYYY-MM-DD"
)
error = True
user = User.objects.filter(username=email).first()
@@ -2304,7 +2389,7 @@ def work_info_import(request):
job_position_obj = JobPosition.objects.filter(
department_id=department_obj, job_position=job_position
).first()
if job_position_obj is None and job_position is not None:
if job_position_obj is None and job_position is not None:
job_position_obj = JobPosition()
job_position_obj.department_id = department_obj
job_position_obj.job_position = job_position
@@ -2363,17 +2448,25 @@ def work_info_import(request):
employee_work_info.company_id = company_obj
employee_work_info.shift_id = shift_obj
employee_work_info.location = location
employee_work_info.date_joining = date_joining if date_joining == "nan" else datetime.today()
employee_work_info.contract_end_date = contract_end_date if contract_end_date == "nan" else None
employee_work_info.basic_salary = basic_salary if type(basic_salary) is int else 0
employee_work_info.salary_hour = salary_hour if type(salary_hour) is int else 0
employee_work_info.date_joining = (
date_joining if date_joining == "nan" else datetime.today()
)
employee_work_info.contract_end_date = (
contract_end_date if contract_end_date == "nan" else None
)
employee_work_info.basic_salary = (
basic_salary if type(basic_salary) is int else 0
)
employee_work_info.salary_hour = (
salary_hour if type(salary_hour) is int else 0
)
if error:
error_lists.append(work_info)
user.delete()
else:
employee_obj.save()
employee_work_info.save()
employee_work_info.save()
except Exception as e:
logger.error(e)
@@ -2386,7 +2479,9 @@ def work_info_import(request):
value.append(None)
keys_to_remove = [
key for key, value in error_data.items() if all(v is None for v in value)
key
for key, value in error_data.items()
if all(v is None for v in value)
]
for key in keys_to_remove:
@@ -2396,7 +2491,7 @@ def work_info_import(request):
# Create an HTTP response object with the Excel file
response = HttpResponse(content_type="application/ms-excel")
response["Content-Disposition"] = 'attachment; filename="ImportError.xlsx"'
data_frame.to_excel(response, index=False)
data_frame.to_excel(response, index=False)
return response
return JsonResponse ({'Success': 'Employees Imported Succefully'})

View File

@@ -1,21 +1,27 @@
{% load i18n %}
{% if form.errors %}
{% load i18n %} {% if form.errors %}
<!-- form errors -->
<div class="oh-wrapper">
<div class="oh-alert-container">
{% for error in form.non_field_errors %}
<div class="oh-alert oh-alert--animated oh-alert--danger">
{{ error }}
</div>
{% endfor %}
</div>
</div>
<div class="oh-wrapper">
<div class="oh-alert-container">
{% for error in form.non_field_errors %}
<div class="oh-alert oh-alert--animated oh-alert--danger">{{ error }}</div>
{% endfor %}
</div>
</div>
{% endif %}
<form hx-post="{% url 'request-cancel' id %}" hx-encoding="multipart/form-data">
<div class="oh-general__tab-target oh-profile-section">
<div class="col-sm-12 col-md-12 col-lg-12">
<label class="oh-label">{% trans "Rejection reason" %}</label>
{{form.reason}}
{{form.errors}}
<label class="oh-label">{% trans "Reason" %}</label>
{{form.reason}} {{form.errors}}
</div>
<button type="submit" class="oh-btn oh-btn--secondary ">{% trans "Submit" %}</button>
</form>
<div class="d-flex flex-row-reverse">
<button
type="submit"
class="oh-btn oh-btn--secondary oh-btn--shadow mt-3"
>
{% trans "Save" %}
</button>
</div>
</div>
</form>

View File

@@ -311,7 +311,7 @@
<div class="oh-modal__dialog">
<div class="oh-modal__dialog-header">
<h2 class="oh-modal__dialog-title" id="editModal1ModalLabel">
{% trans "Reason for rejection" %}
{% trans "Rejection" %}
</h2>
<button
class="oh-modal_close--custom"