2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
views.py
|
|
|
|
|
|
|
|
|
|
This module contains the view functions for handling HTTP requests and rendering
|
|
|
|
|
responses in your application.
|
|
|
|
|
|
|
|
|
|
Each view function corresponds to a specific URL route and performs the necessary
|
|
|
|
|
actions to handle the request, process data, and generate a response.
|
|
|
|
|
|
|
|
|
|
This module is part of the recruitment project and is intended to
|
|
|
|
|
provide the main entry points for interacting with the application's functionality.
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import json
|
|
|
|
|
import calendar
|
|
|
|
|
from datetime import datetime, timedelta, date
|
2023-05-10 15:06:57 +05:30
|
|
|
from collections import defaultdict
|
2023-09-04 16:26:14 +05:30
|
|
|
from urllib.parse import parse_qs
|
2023-06-06 12:27:41 +05:30
|
|
|
import pandas as pd
|
2023-09-15 11:15:37 +05:30
|
|
|
from django.db.models import F, ProtectedError
|
2023-06-06 12:27:41 +05:30
|
|
|
from django.conf import settings
|
2023-05-10 15:06:57 +05:30
|
|
|
from django.contrib import messages
|
|
|
|
|
from django.core.paginator import Paginator
|
2023-06-06 12:27:41 +05:30
|
|
|
from django.shortcuts import render, redirect
|
|
|
|
|
from django.utils.translation import gettext_lazy as _
|
2023-09-19 15:56:53 +05:30
|
|
|
from django.utils.translation import gettext as __
|
2023-06-06 12:27:41 +05:30
|
|
|
from django.contrib.auth.models import User
|
2023-05-10 15:06:57 +05:30
|
|
|
from django.views.decorators.http import require_http_methods
|
2023-06-06 12:27:41 +05:30
|
|
|
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
|
2023-05-10 15:06:57 +05:30
|
|
|
from notifications.signals import notify
|
2023-06-06 12:27:41 +05:30
|
|
|
from horilla.decorators import (
|
|
|
|
|
permission_required,
|
|
|
|
|
login_required,
|
|
|
|
|
hx_request_required,
|
|
|
|
|
manager_can_enter,
|
|
|
|
|
)
|
|
|
|
|
from base.models import (
|
|
|
|
|
Department,
|
|
|
|
|
JobPosition,
|
|
|
|
|
JobRole,
|
|
|
|
|
WorkType,
|
|
|
|
|
EmployeeShift,
|
|
|
|
|
EmployeeType,
|
|
|
|
|
Company,
|
|
|
|
|
)
|
2023-09-04 16:26:14 +05:30
|
|
|
from base.methods import (
|
|
|
|
|
filtersubordinates,
|
|
|
|
|
filtersubordinatesemployeemodel,
|
|
|
|
|
get_key_instances,
|
|
|
|
|
sortby,
|
|
|
|
|
)
|
2023-06-06 12:27:41 +05:30
|
|
|
from employee.filters import EmployeeFilter
|
|
|
|
|
from employee.forms import (
|
|
|
|
|
EmployeeForm,
|
|
|
|
|
EmployeeBankDetailsForm,
|
|
|
|
|
EmployeeWorkInformationForm,
|
|
|
|
|
EmployeeWorkInformationUpdateForm,
|
|
|
|
|
EmployeeBankDetailsUpdateForm,
|
|
|
|
|
)
|
|
|
|
|
from employee.models import Employee, EmployeeWorkInformation, EmployeeBankDetails
|
2023-10-02 01:46:59 +05:30
|
|
|
from recruitment.models import Candidate
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create your views here.
|
2023-08-07 13:04:36 +05:30
|
|
|
@login_required
|
|
|
|
|
def get_language_code(request):
|
|
|
|
|
language_code = request.LANGUAGE_CODE
|
|
|
|
|
return JsonResponse({"language_code": language_code})
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-09-04 16:26:14 +05:30
|
|
|
|
2023-05-10 15:06:57 +05:30
|
|
|
@login_required
|
|
|
|
|
def employee_profile(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to view own profile of employee.
|
|
|
|
|
"""
|
|
|
|
|
user = request.user
|
2023-09-27 13:55:34 +05:30
|
|
|
employee = request.user.employee_get
|
|
|
|
|
user_leaves = employee.available_leave.all()
|
2023-05-10 15:06:57 +05:30
|
|
|
employee = Employee.objects.filter(employee_user_id=user).first()
|
2023-09-27 13:55:34 +05:30
|
|
|
return render(request, "employee/profile/profile_view.html", {"employee": employee,"user_leaves":user_leaves})
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def self_info_update(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to update own profile of an employee.
|
|
|
|
|
"""
|
|
|
|
|
user = request.user
|
|
|
|
|
employee = Employee.objects.filter(employee_user_id=user).first()
|
|
|
|
|
bank_form = EmployeeBankDetailsForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=EmployeeBankDetails.objects.filter(employee_id=employee).first()
|
|
|
|
|
)
|
|
|
|
|
form = EmployeeForm(instance=Employee.objects.filter(employee_user_id=user).first())
|
2023-05-10 15:06:57 +05:30
|
|
|
if request.POST:
|
2023-06-06 12:27:41 +05:30
|
|
|
if request.POST.get("employee_first_name") is not None:
|
|
|
|
|
instance = Employee.objects.filter(employee_user_id=request.user).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(request.POST, instance=instance)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
instance = form.save(commit=False)
|
|
|
|
|
instance.employee_user_id = user
|
|
|
|
|
instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile updated."))
|
|
|
|
|
elif request.POST.get("any_other_code1") is not None:
|
|
|
|
|
instance = EmployeeBankDetails.objects.filter(employee_id=employee).first()
|
|
|
|
|
bank_form = EmployeeBankDetailsForm(request.POST, instance=instance)
|
2023-05-10 15:06:57 +05:30
|
|
|
if bank_form.is_valid():
|
|
|
|
|
instance = bank_form.save(commit=False)
|
|
|
|
|
instance.employee_id = employee
|
|
|
|
|
instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Bank details updated."))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile.html",
|
|
|
|
|
{
|
|
|
|
|
"form": form,
|
|
|
|
|
"bank_form": bank_form,
|
|
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
|
|
|
|
def employee_view_individual(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to view profile of an employee.
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.get(id=obj_id)
|
2023-09-27 13:55:34 +05:30
|
|
|
employee_leaves = employee.available_leave.all()
|
2023-05-10 15:06:57 +05:30
|
|
|
user = Employee.objects.filter(employee_user_id=request.user).first()
|
2023-06-06 12:27:41 +05:30
|
|
|
if user.reporting_manager.filter(
|
|
|
|
|
employee_id=employee
|
|
|
|
|
).exists() or request.user.has_perm("employee.change_employee"):
|
2023-09-27 13:55:34 +05:30
|
|
|
return render(request, "employee/view/individual.html", {"employee": employee,"employee_leaves":employee_leaves})
|
2023-06-06 12:27:41 +05:30
|
|
|
return HttpResponseRedirect(
|
|
|
|
|
request.META.get("HTTP_REFERER", "/employee/employee-view")
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@require_http_methods(["POST"])
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_profile_bank_details(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to fill self bank details
|
|
|
|
|
"""
|
|
|
|
|
employee = request.user.employee_get
|
|
|
|
|
instance = EmployeeBankDetails.objects.filter(employee_id=employee).first()
|
|
|
|
|
form = EmployeeBankDetailsUpdateForm(request.POST, instance=instance)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
bank_info = form.save(commit=False)
|
|
|
|
|
bank_info.employee_id = employee
|
|
|
|
|
bank_info.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Bank details updated"))
|
|
|
|
|
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.view_profile")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_profile_update(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used update own profile of the requested employee
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
employee_user = request.user
|
|
|
|
|
employee = Employee.objects.get(employee_user_id=employee_user)
|
2023-06-06 12:27:41 +05:30
|
|
|
if employee_user.has_perm("employee.change_profile"):
|
|
|
|
|
if request.method == "POST":
|
|
|
|
|
form = EmployeeForm(request.POST, request.FILES, instance=employee)
|
2023-05-10 15:06:57 +05:30
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile updated."))
|
|
|
|
|
return redirect("/employee/employee-profile")
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("delete_group")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_user_group_assign_delete(_, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to delete user group assign
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
user = User.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
user.groups.clear()
|
2023-06-06 12:27:41 +05:30
|
|
|
return redirect("/employee/employee-user-group-assign-view")
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
def paginator_qry(qryset, page_number):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to paginate query set
|
|
|
|
|
"""
|
|
|
|
|
paginator = Paginator(qryset, 50)
|
|
|
|
|
qryset = paginator.get_page(page_number)
|
|
|
|
|
return qryset
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_view(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to render template for view all employee
|
|
|
|
|
"""
|
2023-09-08 14:37:48 +05:30
|
|
|
view_type = request.GET.get("view")
|
2023-09-12 11:59:58 +05:30
|
|
|
previous_data = request.GET.urlencode()
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = Employee.objects.filter(is_active=True)
|
2023-06-06 12:27:41 +05:30
|
|
|
page_number = request.GET.get("page")
|
|
|
|
|
filter_obj = EmployeeFilter(queryset=employees)
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = filtersubordinatesemployeemodel(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, filter_obj.qs, "employee.view_employee"
|
|
|
|
|
)
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_view.html",
|
|
|
|
|
{
|
|
|
|
|
"data": paginator_qry(employees, page_number),
|
|
|
|
|
"pd": previous_data,
|
|
|
|
|
"f": filter_obj,
|
2023-09-08 14:37:48 +05:30
|
|
|
"view_type": view_type,
|
2023-06-06 12:27:41 +05:30
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.add_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_view_new(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to render form to create a new employee.
|
|
|
|
|
"""
|
|
|
|
|
form = EmployeeForm()
|
|
|
|
|
work_form = EmployeeWorkInformationForm()
|
|
|
|
|
bank_form = EmployeeBankDetailsForm()
|
2023-06-06 12:27:41 +05:30
|
|
|
filter_obj = EmployeeFilter(queryset=Employee.objects.all())
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/create_form/form_view.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form, "f": filter_obj},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employee")
|
|
|
|
|
def employee_view_update(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to render update form for employee.
|
|
|
|
|
"""
|
|
|
|
|
user = Employee.objects.filter(employee_user_id=request.user).first()
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.filter(id=obj_id).first()
|
|
|
|
|
if user.reporting_manager.filter(
|
|
|
|
|
employee_id=employee
|
|
|
|
|
).exists() or request.user.has_perm("employee.change_employee"):
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=employee)
|
|
|
|
|
work_form = EmployeeWorkInformationForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=EmployeeWorkInformation.objects.filter(
|
|
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
bank_form = EmployeeBankDetailsForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=EmployeeBankDetails.objects.filter(employee_id=employee).first()
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
if request.POST:
|
2023-06-06 12:27:41 +05:30
|
|
|
if request.POST.get("employee_first_name") is not None:
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(request.POST, instance=employee)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
|
|
|
|
messages.success(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, _("Employee personal information updated.")
|
|
|
|
|
)
|
|
|
|
|
elif request.POST.get("reporting_manager_id") is not None:
|
2023-05-10 15:06:57 +05:30
|
|
|
instance = EmployeeWorkInformation.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
work_form = EmployeeWorkInformationUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST, instance=instance
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
if work_form.is_valid():
|
|
|
|
|
instance = work_form.save(commit=False)
|
|
|
|
|
instance.employee_id = employee
|
|
|
|
|
instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
notify.send(
|
|
|
|
|
request.user.employee_get,
|
|
|
|
|
recipient=instance.employee_id.employee_user_id,
|
|
|
|
|
verb="Your work details has been updated.",
|
2023-07-26 12:15:01 +05:30
|
|
|
verb_ar="تم تحديث تفاصيل عملك.",
|
|
|
|
|
verb_de="Ihre Arbeitsdetails wurden aktualisiert.",
|
|
|
|
|
verb_es="Se han actualizado los detalles de su trabajo.",
|
|
|
|
|
verb_fr="Vos informations professionnelles ont été mises à jour.",
|
2023-06-06 12:27:41 +05:30
|
|
|
redirect="/employee/employee-profile",
|
|
|
|
|
icon="briefcase",
|
|
|
|
|
)
|
|
|
|
|
messages.success(request, _("Employee work information updated."))
|
|
|
|
|
elif request.POST.get("any_other_code1"):
|
2023-05-10 15:06:57 +05:30
|
|
|
instance = EmployeeBankDetails.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST, instance=instance
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
if bank_form.is_valid():
|
|
|
|
|
instance = bank_form.save(commit=False)
|
|
|
|
|
instance.employee_id = employee
|
|
|
|
|
instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Employee bank details updated."))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/update_form/form_view.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
|
|
|
|
return HttpResponseRedirect(
|
|
|
|
|
request.META.get("HTTP_REFERER", "/employee/employee-view")
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
@permission_required("employee.change_employee")
|
|
|
|
|
def update_profile_image(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to upload a profile image
|
|
|
|
|
"""
|
|
|
|
|
try:
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.get(id=obj_id)
|
|
|
|
|
img = request.FILES["employee_profile"]
|
2023-05-10 15:06:57 +05:30
|
|
|
employee.employee_profile = img
|
|
|
|
|
employee.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile image updated."))
|
|
|
|
|
except Exception:
|
|
|
|
|
messages.error(request, _("No image chosen."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@require_http_methods(["POST"])
|
2023-05-10 15:06:57 +05:30
|
|
|
def update_own_profile_image(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to update own profile image from profile view form
|
|
|
|
|
"""
|
|
|
|
|
employee = request.user.employee_get
|
2023-06-06 12:27:41 +05:30
|
|
|
img = request.FILES.get("employee_profile")
|
2023-05-10 15:06:57 +05:30
|
|
|
employee.employee_profile = img
|
|
|
|
|
employee.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile image updated."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@require_http_methods(["DELETE"])
|
|
|
|
|
@permission_required("employee.change_employee")
|
|
|
|
|
def remove_profile_image(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to remove uploaded image
|
2023-06-06 12:27:41 +05:30
|
|
|
Args: obj_id : Employee model instance id
|
|
|
|
|
"""
|
|
|
|
|
employee = Employee.objects.get(id=obj_id)
|
|
|
|
|
if employee.employee_profile.name == "":
|
|
|
|
|
messages.info(request, _("No profile image to remove."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
file_path = employee.employee_profile.path
|
|
|
|
|
absolute_path = os.path.join(settings.MEDIA_ROOT, file_path)
|
|
|
|
|
os.remove(absolute_path)
|
|
|
|
|
employee.employee_profile = None
|
|
|
|
|
employee.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile image removed."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@require_http_methods(["DELETE"])
|
2023-05-10 15:06:57 +05:30
|
|
|
def remove_own_profile_image(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to remove own profile image
|
|
|
|
|
"""
|
|
|
|
|
employee = request.user.employee_get
|
2023-06-06 12:27:41 +05:30
|
|
|
if employee.employee_profile.name == "":
|
|
|
|
|
messages.info(request, _("No profile image to remove."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
file_path = employee.employee_profile.path
|
|
|
|
|
absolute_path = os.path.join(settings.MEDIA_ROOT, file_path)
|
|
|
|
|
os.remove(absolute_path)
|
|
|
|
|
employee.employee_profile = None
|
|
|
|
|
employee.save()
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Profile image removed."))
|
|
|
|
|
response = render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/profile/profile_modal.html",
|
|
|
|
|
)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
response.content.decode("utf-8") + "<script>location.reload();</script>"
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employee")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_update_personal_info(request, obj_id=None):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update employee's personal info.
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.filter(id=obj_id).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(request.POST, instance=employee)
|
|
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
2023-07-26 12:15:01 +05:30
|
|
|
if obj_id is None:
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("New Employee Added."))
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(request.POST, instance=form.instance)
|
|
|
|
|
work_form = EmployeeWorkInformationForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=EmployeeWorkInformation.objects.filter(
|
|
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
bank_form = EmployeeBankDetailsForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=EmployeeBankDetails.objects.filter(
|
|
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
|
|
|
|
)
|
|
|
|
|
return redirect(
|
|
|
|
|
f"employee-view-update/{form.instance.id}/",
|
|
|
|
|
data={"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
return HttpResponse(
|
|
|
|
|
"""
|
|
|
|
|
<div class="oh-alert-container">
|
|
|
|
|
<div class="oh-alert oh-alert--animated oh-alert--success">
|
|
|
|
|
Personal Info updated
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
)
|
2023-07-26 12:15:01 +05:30
|
|
|
if obj_id is None:
|
2023-06-06 12:27:41 +05:30
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/create_form/form_view.html",
|
|
|
|
|
{
|
|
|
|
|
"form": form,
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
errors = "\n".join(
|
|
|
|
|
[
|
|
|
|
|
f"<li>{form.fields.get(field, field).label}: {', '.join(errors)}</li>"
|
|
|
|
|
for field, errors in form.errors.items()
|
|
|
|
|
]
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
return HttpResponse(f'<ul class="alert alert-danger">{errors}</ul>')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employeeworkinformation")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_update_work_info(request, obj_id=None):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update employee work info
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.filter(id=obj_id).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeWorkInformationForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST,
|
|
|
|
|
instance=EmployeeWorkInformation.objects.filter(employee_id=employee).first(),
|
|
|
|
|
)
|
|
|
|
|
form.fields["employee_id"].required = False
|
2023-05-10 15:06:57 +05:30
|
|
|
form.employee_id = employee
|
|
|
|
|
if form.is_valid() and employee is not None:
|
|
|
|
|
work_info = form.save(commit=False)
|
|
|
|
|
work_info.employee_id = employee
|
|
|
|
|
work_info.save()
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
<div class="oh-alert-container">
|
|
|
|
|
<div class="oh-alert oh-alert--animated oh-alert--success">
|
|
|
|
|
Personal Info updated
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
)
|
2023-06-06 12:27:41 +05:30
|
|
|
errors = "\n".join(
|
|
|
|
|
[
|
|
|
|
|
f"<li>{form.fields.get(field, field).label}: {', '.join(errors)}</li>"
|
|
|
|
|
for field, errors in form.errors.items()
|
|
|
|
|
]
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
return HttpResponse(f'<ul class="alert alert-danger">{errors}</ul>')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employeebankdetails")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_update_bank_details(request, obj_id=None):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to render form to create employee's bank information.
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.filter(id=obj_id).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeBankDetailsForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST,
|
|
|
|
|
instance=EmployeeBankDetails.objects.filter(employee_id=employee).first(),
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
if form.is_valid() and employee is not None:
|
|
|
|
|
bank_info = form.save(commit=False)
|
|
|
|
|
bank_info.employee_id = employee
|
|
|
|
|
bank_info.save()
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
"""
|
|
|
|
|
<div class="oh-alert-container">
|
|
|
|
|
<div class="oh-alert oh-alert--animated oh-alert--success">
|
|
|
|
|
Bank details updated
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
"""
|
|
|
|
|
)
|
2023-06-06 12:27:41 +05:30
|
|
|
errors = "\n".join(
|
|
|
|
|
[
|
|
|
|
|
f"<li>{form.fields.get(field, field).label}: {', '.join(errors)}</li>"
|
|
|
|
|
for field, errors in form.errors.items()
|
|
|
|
|
]
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
return HttpResponse(f'<ul class="alert alert-danger">{errors}</ul>')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_filter_view(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to filter employee.
|
|
|
|
|
"""
|
2023-09-12 11:59:58 +05:30
|
|
|
previous_data = request.GET.urlencode()
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = filtersubordinatesemployeemodel(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, Employee.objects.all(), "employee.view_employee"
|
|
|
|
|
)
|
|
|
|
|
filter_obj = EmployeeFilter(request.GET, queryset=employees)
|
|
|
|
|
page_number = request.GET.get("page")
|
|
|
|
|
template = "employee_personal_info/employee_card.html"
|
|
|
|
|
view = request.GET.get("view")
|
2023-09-04 16:26:14 +05:30
|
|
|
data_dict = parse_qs(previous_data)
|
|
|
|
|
get_key_instances(Employee, data_dict)
|
2023-06-06 12:27:41 +05:30
|
|
|
if view == "list":
|
|
|
|
|
template = "employee_personal_info/employee_list.html"
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
template,
|
|
|
|
|
{
|
|
|
|
|
"data": paginator_qry(filter_obj.qs, page_number),
|
|
|
|
|
"f": filter_obj,
|
|
|
|
|
"pd": previous_data,
|
2023-09-04 16:26:14 +05:30
|
|
|
"filter_dict": data_dict,
|
2023-06-06 12:27:41 +05:30
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
@hx_request_required
|
|
|
|
|
def employee_card(request):
|
|
|
|
|
"""
|
|
|
|
|
This method renders card template to view all employees.
|
|
|
|
|
"""
|
2023-09-12 11:59:58 +05:30
|
|
|
previous_data = request.GET.urlencode()
|
2023-06-06 12:27:41 +05:30
|
|
|
search = request.GET.get("search")
|
2023-07-26 12:15:01 +05:30
|
|
|
if isinstance(search, type(None)):
|
2023-06-06 12:27:41 +05:30
|
|
|
search = ""
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = filtersubordinatesemployeemodel(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, Employee.objects.all(), "employee.view_employee"
|
|
|
|
|
)
|
|
|
|
|
if request.GET.get("is_active") is None:
|
|
|
|
|
filter_obj = EmployeeFilter(
|
|
|
|
|
request.GET,
|
|
|
|
|
queryset=employees.filter(
|
|
|
|
|
employee_first_name__icontains=search, is_active=True
|
|
|
|
|
),
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
else:
|
2023-06-06 12:27:41 +05:30
|
|
|
filter_obj = EmployeeFilter(
|
|
|
|
|
request.GET,
|
|
|
|
|
queryset=employees.filter(employee_first_name__icontains=search),
|
|
|
|
|
)
|
|
|
|
|
page_number = request.GET.get("page")
|
|
|
|
|
employees = sortby(request, filter_obj.qs, "orderby")
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_card.html",
|
|
|
|
|
{
|
|
|
|
|
"data": paginator_qry(employees, page_number),
|
|
|
|
|
"f": filter_obj,
|
|
|
|
|
"pd": previous_data,
|
|
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
@hx_request_required
|
|
|
|
|
def employee_list(request):
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
This method renders template to view all employees
|
|
|
|
|
"""
|
2023-09-12 11:59:58 +05:30
|
|
|
previous_data = request.GET.urlencode()
|
2023-06-06 12:27:41 +05:30
|
|
|
search = request.GET.get("search")
|
2023-07-26 12:15:01 +05:30
|
|
|
if isinstance(search, type(None)):
|
2023-06-06 12:27:41 +05:30
|
|
|
search = ""
|
|
|
|
|
if request.GET.get("is_active") is None:
|
|
|
|
|
filter_obj = EmployeeFilter(
|
|
|
|
|
request.GET,
|
|
|
|
|
queryset=Employee.objects.filter(
|
|
|
|
|
employee_first_name__icontains=search, is_active=True
|
|
|
|
|
),
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
else:
|
2023-06-06 12:27:41 +05:30
|
|
|
filter_obj = EmployeeFilter(
|
|
|
|
|
request.GET,
|
|
|
|
|
queryset=Employee.objects.filter(employee_first_name__icontains=search),
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = filtersubordinatesemployeemodel(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, filter_obj.qs, "employee.view_employee"
|
|
|
|
|
)
|
|
|
|
|
employees = sortby(request, employees, "orderby")
|
|
|
|
|
page_number = request.GET.get("page")
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_list.html",
|
|
|
|
|
{
|
|
|
|
|
"data": paginator_qry(employees, page_number),
|
|
|
|
|
"f": filter_obj,
|
|
|
|
|
"pd": previous_data,
|
|
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
@hx_request_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
|
|
|
|
def employee_update(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update employee if the form is valid
|
|
|
|
|
args:
|
2023-06-06 12:27:41 +05:30
|
|
|
obj_id : employee id
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=employee)
|
2023-06-06 12:27:41 +05:30
|
|
|
work_info = EmployeeWorkInformation.objects.filter(employee_id=employee).first()
|
|
|
|
|
bank_info = EmployeeBankDetails.objects.filter(employee_id=employee).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
work_form = EmployeeWorkInformationForm()
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm()
|
|
|
|
|
if work_info is not None:
|
|
|
|
|
work_form = EmployeeWorkInformationForm(instance=work_info)
|
|
|
|
|
if bank_info is not None:
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(instance=bank_info)
|
2023-06-06 12:27:41 +05:30
|
|
|
if request.method == "POST":
|
|
|
|
|
if request.user.has_perm("employee.change_employee"):
|
|
|
|
|
form = EmployeeForm(request.POST, request.FILES, instance=employee)
|
2023-05-10 15:06:57 +05:30
|
|
|
if form.is_valid():
|
|
|
|
|
form.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Employee updated."))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_update_form.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.delete_employee")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_delete(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to delete employee
|
|
|
|
|
args:
|
|
|
|
|
id : employee id
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
try:
|
2023-09-15 11:15:37 +05:30
|
|
|
view = request.POST.get("view")
|
|
|
|
|
employee = Employee.objects.get(id=obj_id)
|
|
|
|
|
user = employee.employee_user_id
|
2023-05-10 15:06:57 +05:30
|
|
|
user.delete()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Employee deleted"))
|
2023-09-15 11:15:37 +05:30
|
|
|
except Employee.DoesNotExist:
|
|
|
|
|
messages.error(request, _("Employee not found."))
|
2023-09-19 15:56:53 +05:30
|
|
|
except ProtectedError as e:
|
|
|
|
|
model_verbose_names_set = set()
|
|
|
|
|
for obj in e.protected_objects:
|
2023-09-20 12:33:51 +05:30
|
|
|
model_verbose_names_set.add(__(obj._meta.verbose_name.capitalize()))
|
2023-09-19 15:56:53 +05:30
|
|
|
model_names_str = ", ".join(model_verbose_names_set)
|
|
|
|
|
messages.error(
|
|
|
|
|
request, _("This employee already related in {}.".format(model_names_str))
|
|
|
|
|
)
|
2023-06-06 12:27:41 +05:30
|
|
|
return HttpResponseRedirect(request.META.get("HTTP_REFERER", f"/view={view}"))
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.delete_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_bulk_delete(request):
|
2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to delete set of Employee instances
|
|
|
|
|
"""
|
|
|
|
|
ids = request.POST["ids"]
|
2023-05-10 15:06:57 +05:30
|
|
|
ids = json.loads(ids)
|
2023-06-06 12:27:41 +05:30
|
|
|
for employee_id in ids:
|
2023-05-10 15:06:57 +05:30
|
|
|
try:
|
2023-09-15 11:15:37 +05:30
|
|
|
employee = Employee.objects.get(id=employee_id)
|
|
|
|
|
user = employee.employee_user_id
|
2023-05-10 15:06:57 +05:30
|
|
|
user.delete()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(
|
|
|
|
|
request, _("%(employee)s deleted.") % {"employee": employee}
|
|
|
|
|
)
|
2023-09-15 11:15:37 +05:30
|
|
|
except Employee.DoesNotExist:
|
|
|
|
|
messages.error(request, _("Employee not found."))
|
|
|
|
|
except ProtectedError:
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.error(
|
|
|
|
|
request, _("You cannot delete %(employee)s.") % {"employee": employee}
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
return JsonResponse({"message": "Success"})
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.delete_employee")
|
|
|
|
|
@require_http_methods(["POST"])
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_bulk_archive(request):
|
2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to archive bulk of Employee instances
|
|
|
|
|
"""
|
|
|
|
|
ids = request.POST["ids"]
|
2023-05-10 15:06:57 +05:30
|
|
|
ids = json.loads(ids)
|
|
|
|
|
is_active = False
|
2023-06-06 12:27:41 +05:30
|
|
|
if request.GET.get("is_active") == "True":
|
2023-05-10 15:06:57 +05:30
|
|
|
is_active = True
|
2023-06-06 12:27:41 +05:30
|
|
|
for employee_id in ids:
|
|
|
|
|
employee = Employee.objects.get(id=employee_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
employee.is_active = is_active
|
|
|
|
|
employee.employee_user_id.is_active = is_active
|
|
|
|
|
employee.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
message = _("archived")
|
2023-05-10 15:06:57 +05:30
|
|
|
if is_active:
|
2023-06-06 12:27:41 +05:30
|
|
|
message = _("un-archived")
|
|
|
|
|
messages.success(request, f"{employee} is {message}")
|
|
|
|
|
return JsonResponse({"message": "Success"})
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.delete_employee")
|
|
|
|
|
def employee_archive(request, obj_id):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to archive employee instance
|
|
|
|
|
Args:
|
|
|
|
|
obj_id : Employee instance id
|
|
|
|
|
"""
|
|
|
|
|
employee = Employee.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
employee.is_active = not employee.is_active
|
|
|
|
|
employee.employee_user_id.is_active = not employee.is_active
|
|
|
|
|
employee.save()
|
|
|
|
|
message = "Employee un-archived"
|
|
|
|
|
if not employee.is_active:
|
2023-06-06 12:27:41 +05:30
|
|
|
message = _("Employee archived")
|
2023-05-10 15:06:57 +05:30
|
|
|
messages.success(request, message)
|
2023-06-06 12:27:41 +05:30
|
|
|
return HttpResponseRedirect(request.META.get("HTTP_REFERER"))
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_search(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to search employee
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
search = request.GET["search"]
|
|
|
|
|
view = request.GET["view"]
|
2023-09-12 11:59:58 +05:30
|
|
|
previous_data = request.GET.urlencode()
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = EmployeeFilter(request.GET).qs
|
2023-06-06 12:27:41 +05:30
|
|
|
if search == "":
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = employees.filter(is_active=True)
|
2023-06-06 12:27:41 +05:30
|
|
|
page_number = request.GET.get("page")
|
|
|
|
|
template = "employee_personal_info/employee_card.html"
|
|
|
|
|
if view == "list":
|
|
|
|
|
template = "employee_personal_info/employee_list.html"
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = filtersubordinatesemployeemodel(
|
2023-06-06 12:27:41 +05:30
|
|
|
request, employees, "employee.view_employee"
|
|
|
|
|
)
|
|
|
|
|
employees = sortby(request, employees, "orderby")
|
2023-09-08 14:37:48 +05:30
|
|
|
data_dict = parse_qs(previous_data)
|
|
|
|
|
get_key_instances(Employee, data_dict)
|
2023-06-06 12:27:41 +05:30
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
template,
|
2023-09-08 14:37:48 +05:30
|
|
|
{
|
|
|
|
|
"data": paginator_qry(employees, page_number),
|
|
|
|
|
"pd": previous_data,
|
|
|
|
|
"filter_dict": data_dict,
|
|
|
|
|
},
|
2023-06-06 12:27:41 +05:30
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.add_employeeworkinformation")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_work_info_view_create(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to create employee work information from employee single view template
|
|
|
|
|
args:
|
2023-06-06 12:27:41 +05:30
|
|
|
obj_id : employee instance id
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=employee)
|
|
|
|
|
|
|
|
|
|
work_form = EmployeeWorkInformationUpdateForm(request.POST)
|
|
|
|
|
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm()
|
|
|
|
|
bank_form_instance = EmployeeBankDetails.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if bank_form_instance is not None:
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=employee.employee_bank_details
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
if work_form.is_valid():
|
|
|
|
|
work_info = work_form.save(commit=False)
|
|
|
|
|
work_info.employee_id = employee
|
|
|
|
|
work_info.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Created work information"))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_update_form.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employeeworkinformation")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_work_info_view_update(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update employee work information from single view template
|
|
|
|
|
args:
|
2023-06-06 12:27:41 +05:30
|
|
|
obj_id : employee work information id
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
work_information = EmployeeWorkInformation.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=work_information.employee_id)
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=work_information.employee_id.employee_bank_details
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
work_form = EmployeeWorkInformationUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST,
|
|
|
|
|
instance=work_information,
|
2023-05-10 15:06:57 +05:30
|
|
|
)
|
|
|
|
|
if work_form.is_valid():
|
|
|
|
|
work_form.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Work Information Updated Successfully"))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_update_form.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.add_employeebankdetails")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_bank_details_view_create(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method used to create bank details object from the view template
|
|
|
|
|
args:
|
2023-06-06 12:27:41 +05:30
|
|
|
obj_id : employee instance id
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee = Employee.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=employee)
|
|
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(request.POST)
|
|
|
|
|
work_form_instance = EmployeeWorkInformation.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_id=employee
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
work_form = EmployeeWorkInformationUpdateForm()
|
|
|
|
|
if work_form_instance is not None:
|
2023-06-06 12:27:41 +05:30
|
|
|
work_form = EmployeeWorkInformationUpdateForm(instance=work_form_instance)
|
2023-05-10 15:06:57 +05:30
|
|
|
if bank_form.is_valid():
|
|
|
|
|
bank_instance = bank_form.save(commit=False)
|
|
|
|
|
bank_instance.employee_id = employee
|
|
|
|
|
bank_instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Bank Details Created Successfully"))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_update_form.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.change_employeebankdetails")
|
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
|
def employee_bank_details_view_update(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to update employee bank details.
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_bank_instance = EmployeeBankDetails.objects.get(id=obj_id)
|
2023-05-10 15:06:57 +05:30
|
|
|
form = EmployeeForm(instance=employee_bank_instance.employee_id)
|
|
|
|
|
work_form = EmployeeWorkInformationUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
instance=employee_bank_instance.employee_id.employee_work_info
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
bank_form = EmployeeBankDetailsUpdateForm(
|
2023-06-06 12:27:41 +05:30
|
|
|
request.POST, instance=employee_bank_instance
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
if bank_form.is_valid():
|
|
|
|
|
bank_instance = bank_form.save(commit=False)
|
|
|
|
|
bank_instance.employee_id = employee_bank_instance.employee_id
|
|
|
|
|
bank_instance.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
messages.success(request, _("Bank Details Updated Successfully"))
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee_personal_info/employee_update_form.html",
|
|
|
|
|
{"form": form, "work_form": work_form, "bank_form": bank_form},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.delete_employeeworkinformation")
|
|
|
|
|
@require_http_methods(["POST", "DELETE"])
|
2023-09-15 11:15:37 +05:30
|
|
|
def employee_work_information_delete(request, obj_id):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to delete employee work information
|
|
|
|
|
args:
|
2023-06-06 12:27:41 +05:30
|
|
|
obj_id : employee work information id
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
2023-09-15 11:15:37 +05:30
|
|
|
try:
|
|
|
|
|
employee_work = EmployeeWorkInformation.objects.get(id=obj_id)
|
|
|
|
|
employee_work.delete()
|
|
|
|
|
messages.success(request, _("Employee work information deleted"))
|
|
|
|
|
except EmployeeWorkInformation.DoesNotExist:
|
|
|
|
|
messages.error(request, _("Employee work information not found."))
|
|
|
|
|
except ProtectedError:
|
|
|
|
|
messages.error(request, _("You cannot delete this Employee work information"))
|
2023-09-20 12:33:51 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
return redirect("/employee/employee-work-information-view")
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.add_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def employee_import(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to create employee and corresponding user.
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
if request.method == "POST":
|
|
|
|
|
file = request.FILES["file"]
|
2023-05-10 15:06:57 +05:30
|
|
|
# Read the Excel file into a Pandas DataFrame
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = pd.read_excel(file)
|
2023-05-10 15:06:57 +05:30
|
|
|
# Convert the DataFrame to a list of dictionaries
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_dicts = data_frame.to_dict("records")
|
2023-05-10 15:06:57 +05:30
|
|
|
# Create or update Employee objects from the list of dictionaries
|
|
|
|
|
errolist = []
|
|
|
|
|
for employee_dict in employee_dicts:
|
|
|
|
|
try:
|
2023-06-06 12:27:41 +05:30
|
|
|
phone = employee_dict["phone"]
|
|
|
|
|
email = employee_dict["email"]
|
|
|
|
|
employee_full_name = employee_dict["employee_full_name"]
|
2023-05-10 15:06:57 +05:30
|
|
|
existing_user = User.objects.filter(username=email).first()
|
|
|
|
|
if existing_user is None:
|
|
|
|
|
employee_first_name = employee_full_name
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_last_name = ""
|
|
|
|
|
if " " in employee_full_name:
|
|
|
|
|
(
|
|
|
|
|
employee_first_name,
|
|
|
|
|
employee_last_name,
|
|
|
|
|
) = employee_full_name.split(" ", 1)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
user = User.objects.create_user(
|
2023-06-06 12:27:41 +05:30
|
|
|
username=email,
|
|
|
|
|
email=email,
|
|
|
|
|
password=str(phone).strip(),
|
|
|
|
|
is_superuser=False,
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
employee = Employee()
|
|
|
|
|
employee.employee_user_id = user
|
|
|
|
|
employee.employee_first_name = employee_first_name
|
|
|
|
|
employee.employee_last_name = employee_last_name
|
|
|
|
|
employee.email = email
|
|
|
|
|
employee.phone = phone
|
|
|
|
|
employee.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
except Exception:
|
2023-05-10 15:06:57 +05:30
|
|
|
errolist.append(employee_dict)
|
|
|
|
|
return HttpResponse(
|
|
|
|
|
"""
|
|
|
|
|
<div class='alert-success p-3 border-rounded'>
|
|
|
|
|
Employee data has been imported successfully.
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
)
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = pd.DataFrame(columns=["employee_full_name", "email", "phone"])
|
2023-05-10 15:06:57 +05:30
|
|
|
# Export the DataFrame to an Excel file
|
2023-06-06 12:27:41 +05:30
|
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
|
|
|
response["Content-Disposition"] = 'attachment; filename="employee_template.xlsx"'
|
|
|
|
|
data_frame.to_excel(response, index=False)
|
2023-05-10 15:06:57 +05:30
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@permission_required("employee.add_employee")
|
|
|
|
|
def employee_export(_):
|
|
|
|
|
"""
|
2023-05-10 15:06:57 +05:30
|
|
|
This method is used to export employee data to xlsx
|
|
|
|
|
"""
|
|
|
|
|
# Get the list of field names for your model
|
2023-06-06 12:27:41 +05:30
|
|
|
field_names = [f.name for f in Employee._meta.get_fields() if not f.auto_created]
|
|
|
|
|
field_names.remove("employee_user_id")
|
|
|
|
|
field_names.remove("employee_profile")
|
|
|
|
|
field_names.remove("additional_info")
|
|
|
|
|
field_names.remove("is_active")
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
# Get the existing employee data and convert it to a DataFrame
|
|
|
|
|
employee_data = Employee.objects.values_list(*field_names)
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = pd.DataFrame(list(employee_data), columns=field_names)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
# Export the DataFrame to an Excel file
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
|
|
|
response["Content-Disposition"] = 'attachment; filename="employee_export.xlsx"'
|
|
|
|
|
data_frame.to_excel(response, index=False)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def convert_nan(field, dicts):
|
|
|
|
|
"""
|
|
|
|
|
This method is returns None or field value
|
|
|
|
|
"""
|
|
|
|
|
field_value = dicts.get(field)
|
|
|
|
|
try:
|
|
|
|
|
float(field_value)
|
|
|
|
|
return None
|
|
|
|
|
except ValueError:
|
|
|
|
|
return field_value
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def work_info_import(request):
|
2023-06-06 12:27:41 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to import Employee instances and creates related objects
|
|
|
|
|
"""
|
|
|
|
|
data_frame = pd.DataFrame(
|
|
|
|
|
columns=[
|
|
|
|
|
"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",
|
|
|
|
|
]
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
# Export the DataFrame to an Excel file
|
2023-06-06 12:27:41 +05:30
|
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
|
|
|
response["Content-Disposition"] = 'attachment; filename="work_info_template.xlsx"'
|
|
|
|
|
data_frame.to_excel(response, index=False)
|
|
|
|
|
|
|
|
|
|
if request.method == "POST" and request.FILES.get("file") is not None:
|
|
|
|
|
file = request.FILES["file"]
|
|
|
|
|
data_frame = pd.read_excel(file)
|
|
|
|
|
work_info_dicts = data_frame.to_dict("records")
|
2023-05-10 15:06:57 +05:30
|
|
|
error_lists = []
|
|
|
|
|
for work_info in work_info_dicts:
|
|
|
|
|
try:
|
2023-06-06 12:27:41 +05:30
|
|
|
email = work_info["email"]
|
|
|
|
|
phone = work_info["phone"]
|
|
|
|
|
first_name = work_info["first_name"]
|
|
|
|
|
last_name = work_info["last_name"]
|
|
|
|
|
badge_id = convert_nan("badge_id", work_info)
|
|
|
|
|
department = convert_nan("department", work_info)
|
|
|
|
|
job_position = convert_nan("job_position", work_info)
|
|
|
|
|
job_role = convert_nan("job_role", work_info)
|
|
|
|
|
work_type = convert_nan("work_type", work_info)
|
|
|
|
|
employee_type = convert_nan("employee_type", work_info)
|
|
|
|
|
reporting_manager = convert_nan("reporting_manager", work_info)
|
|
|
|
|
company = convert_nan("company", work_info)
|
|
|
|
|
location = convert_nan("location", work_info)
|
|
|
|
|
shift = convert_nan("shift", work_info)
|
|
|
|
|
date_joining = convert_nan("date_joining", work_info)
|
|
|
|
|
contract_end_date = convert_nan("contract_end_date", work_info)
|
|
|
|
|
basic_salary = convert_nan("basic_salary", work_info)
|
|
|
|
|
gender = work_info.get("gender")
|
2023-05-10 15:06:57 +05:30
|
|
|
user = User.objects.filter(username=email).first()
|
|
|
|
|
if user is None:
|
|
|
|
|
user = User.objects.create_user(
|
2023-06-06 12:27:41 +05:30
|
|
|
username=email,
|
|
|
|
|
email=email,
|
|
|
|
|
password=str(phone).strip(),
|
|
|
|
|
is_superuser=False,
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
employee_obj = Employee.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_first_name=first_name, employee_last_name=last_name
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if employee_obj is None:
|
|
|
|
|
employee_obj = Employee()
|
|
|
|
|
employee_obj.employee_user_id = user
|
|
|
|
|
employee_obj.badge_id = badge_id
|
|
|
|
|
employee_obj.employee_first_name = first_name
|
|
|
|
|
employee_obj.employee_last_name = last_name
|
|
|
|
|
employee_obj.email = email
|
|
|
|
|
employee_obj.phone = phone
|
|
|
|
|
employee_obj.gender = gender.lower()
|
|
|
|
|
employee_obj.save()
|
|
|
|
|
department_obj = Department.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
department=department
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if department_obj is None:
|
|
|
|
|
department_obj = Department()
|
|
|
|
|
department_obj.department = department
|
|
|
|
|
department_obj.save()
|
|
|
|
|
|
|
|
|
|
job_position_obj = JobPosition.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
department_id=department_obj, job_position=job_position
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if job_position_obj is None:
|
|
|
|
|
job_position_obj = JobPosition()
|
|
|
|
|
job_position_obj.department_id = department_obj
|
|
|
|
|
job_position_obj.job_position = job_position
|
|
|
|
|
job_position_obj.save()
|
|
|
|
|
|
|
|
|
|
job_role_obj = JobRole.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
job_role=job_role, job_position_id=job_position_obj
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if job_role_obj is None:
|
|
|
|
|
job_role_obj = JobRole()
|
|
|
|
|
job_role_obj.job_position_id = job_position_obj
|
|
|
|
|
job_role_obj.job_role = job_role
|
|
|
|
|
job_role_obj.save()
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
work_type_obj = WorkType.objects.filter(work_type=work_type).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if work_type_obj is None:
|
|
|
|
|
work_type_obj = WorkType()
|
|
|
|
|
work_type_obj.work_type = work_type
|
|
|
|
|
work_type_obj.save()
|
|
|
|
|
|
|
|
|
|
shift_obj = EmployeeShift.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_shift=shift
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if shift_obj is None:
|
|
|
|
|
shift_obj = EmployeeShift()
|
|
|
|
|
shift_obj.employee_shift = shift
|
|
|
|
|
shift_obj.save()
|
|
|
|
|
employee_type_obj = EmployeeType.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_type=employee_type
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if employee_type_obj is None:
|
|
|
|
|
employee_type_obj = EmployeeType()
|
|
|
|
|
employee_type_obj.employee_type = employee_type
|
|
|
|
|
employee_type_obj.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
manager_fname, manager_lname = "", ""
|
2023-07-26 12:15:01 +05:30
|
|
|
if isinstance(reporting_manager, str) and " " in reporting_manager:
|
2023-06-06 12:27:41 +05:30
|
|
|
manager_fname, manager_lname = reporting_manager.split(" ", 1)
|
2023-05-10 15:06:57 +05:30
|
|
|
reporting_manager_obj = Employee.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_first_name=manager_fname,
|
|
|
|
|
employee_last_name=manager_lname,
|
|
|
|
|
).first()
|
|
|
|
|
company_obj = Company.objects.filter(company=company).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
employee_work_info = EmployeeWorkInformation.objects.filter(
|
2023-06-06 12:27:41 +05:30
|
|
|
employee_id=employee_obj
|
|
|
|
|
).first()
|
2023-05-10 15:06:57 +05:30
|
|
|
if employee_work_info is None:
|
|
|
|
|
employee_work_info = EmployeeWorkInformation()
|
|
|
|
|
employee_work_info.employee_id = employee_obj
|
|
|
|
|
employee_work_info.email = email
|
|
|
|
|
employee_work_info.department_id = department_obj
|
|
|
|
|
employee_work_info.job_position_id = job_position_obj
|
|
|
|
|
employee_work_info.job_role_id = job_role_obj
|
|
|
|
|
employee_work_info.employee_type_id = employee_type_obj
|
|
|
|
|
employee_work_info.reporting_manager_id = reporting_manager_obj
|
|
|
|
|
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
|
|
|
|
|
employee_work_info.contract_end_date = contract_end_date
|
|
|
|
|
employee_work_info.basic_salary = basic_salary
|
|
|
|
|
employee_work_info.save()
|
2023-06-06 12:27:41 +05:30
|
|
|
except Exception:
|
2023-05-10 15:06:57 +05:30
|
|
|
error_lists.append(work_info)
|
|
|
|
|
if error_lists:
|
|
|
|
|
res = defaultdict(list)
|
|
|
|
|
for sub in error_lists:
|
|
|
|
|
for key in sub:
|
|
|
|
|
res[key].append(sub[key])
|
|
|
|
|
# df = pd.DataFrame(res)
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = pd.DataFrame(error_lists, columns=error_lists[0].keys())
|
2023-05-10 15:06:57 +05:30
|
|
|
# Create an HTTP response object with the Excel file
|
2023-06-06 12:27:41 +05:30
|
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
|
|
|
response["Content-Disposition"] = 'attachment; filename="ImportError.xlsx"'
|
|
|
|
|
data_frame.to_excel(response, index=False)
|
2023-05-10 15:06:57 +05:30
|
|
|
return response
|
2023-06-06 12:27:41 +05:30
|
|
|
return HttpResponse("Imported successfully")
|
2023-05-10 15:06:57 +05:30
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
def work_info_export(_):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to export employee data to xlsx
|
|
|
|
|
"""
|
|
|
|
|
# Add the fields from the related Employee,JobPosition,Department,WorkType,JobRole model
|
|
|
|
|
field_names = [
|
2023-06-06 12:27:41 +05:30
|
|
|
"employee_id__badge_id",
|
|
|
|
|
"employee_id__employee_first_name",
|
|
|
|
|
"employee_id__employee_last_name",
|
|
|
|
|
"employee_id__phone",
|
|
|
|
|
"employee_id__email",
|
|
|
|
|
"employee_id__gender",
|
|
|
|
|
"department_id__department",
|
|
|
|
|
"job_position_id__job_position",
|
|
|
|
|
"job_role_id__job_role",
|
|
|
|
|
"work_type_id__work_type",
|
|
|
|
|
"shift_id__employee_shift",
|
|
|
|
|
"employee_type_id__employee_type",
|
|
|
|
|
"reporting_manager_id__employee_first_name",
|
|
|
|
|
"company_id__company",
|
|
|
|
|
"location",
|
|
|
|
|
"date_joining",
|
|
|
|
|
"contract_end_date",
|
|
|
|
|
"basic_salary",
|
|
|
|
|
"salary_hour",
|
2023-05-10 15:06:57 +05:30
|
|
|
]
|
|
|
|
|
|
|
|
|
|
# Get the list of field names from EmployeeWorkInformation model
|
2023-06-06 12:27:41 +05:30
|
|
|
field_names += [
|
|
|
|
|
f.name for f in EmployeeWorkInformation._meta.get_fields() if not f.auto_created
|
|
|
|
|
]
|
2023-05-10 15:06:57 +05:30
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
fields_to_remove = [
|
|
|
|
|
"badge_id",
|
|
|
|
|
"employee_id",
|
|
|
|
|
"job_position_id",
|
|
|
|
|
"department_id",
|
|
|
|
|
"work_type_id",
|
|
|
|
|
"job_role_id",
|
|
|
|
|
"reporting_manager_id",
|
|
|
|
|
"company_id",
|
|
|
|
|
"shift_id",
|
|
|
|
|
"employee_type_id",
|
|
|
|
|
"additional_info",
|
|
|
|
|
]
|
2023-05-10 15:06:57 +05:30
|
|
|
field_names = [
|
2023-06-06 12:27:41 +05:30
|
|
|
field_name for field_name in field_names if field_name not in fields_to_remove
|
|
|
|
|
]
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
# Get the existing employee data with related Employee objects
|
|
|
|
|
employee_data = EmployeeWorkInformation.objects.values_list(*field_names)
|
|
|
|
|
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = pd.DataFrame(employee_data, columns=field_names)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
# Rename the columns for clarity
|
2023-06-06 12:27:41 +05:30
|
|
|
data_frame = data_frame.rename(
|
|
|
|
|
columns={
|
|
|
|
|
"employee_id__badge_id": "badge_id",
|
|
|
|
|
"employee_id__employee_first_name": "first_name",
|
|
|
|
|
"employee_id__employee_last_name": "last_name",
|
|
|
|
|
"employee_id__phone": "phone",
|
|
|
|
|
"employee_id__email": "email",
|
|
|
|
|
"employee_id__gender": "gender",
|
|
|
|
|
"department_id__department": "department",
|
|
|
|
|
"job_position_id__job_position": "job_position",
|
|
|
|
|
"job_role_id__job_role": "job_role",
|
|
|
|
|
"work_type_id__work_type": "work_type",
|
|
|
|
|
"shift_id__employee_shift": "shift",
|
|
|
|
|
"employee_type_id__employee_type": "employee_type",
|
|
|
|
|
"reporting_manager_id__employee_first_name": "reporting_manager",
|
|
|
|
|
"company_id__company": "company",
|
|
|
|
|
"location": "location",
|
|
|
|
|
"date_joining": "date_joining",
|
|
|
|
|
"contract_end_date": "contract_end_date",
|
|
|
|
|
"basic_salary": "basic_salary",
|
|
|
|
|
"salary_hour": "salary_hour",
|
|
|
|
|
}
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
# Export the DataFrame to an Excel file
|
2023-06-06 12:27:41 +05:30
|
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
|
|
|
response["Content-Disposition"] = 'attachment; filename="employee_export.xlsx"'
|
|
|
|
|
data_frame.to_excel(response, index=False)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def birthday():
|
|
|
|
|
"""
|
|
|
|
|
This method is used to find upcoming birthday and returns the queryset
|
|
|
|
|
"""
|
|
|
|
|
today = datetime.now().date()
|
|
|
|
|
last_day_of_month = calendar.monthrange(today.year, today.month)[1]
|
|
|
|
|
employees = Employee.objects.filter(
|
|
|
|
|
dob__day__gte=today.day,
|
|
|
|
|
dob__month=today.month,
|
|
|
|
|
dob__day__lte=last_day_of_month,
|
2023-06-06 12:27:41 +05:30
|
|
|
).order_by(F("dob__day").asc(nulls_last=True))
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
for employee in employees:
|
2023-06-06 12:27:41 +05:30
|
|
|
employee.days_until_birthday = employee.dob.day - today.day
|
2023-05-10 15:06:57 +05:30
|
|
|
return employees
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
|
|
|
|
def get_employees_birthday(_):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to render all upcoming birthday employee details to fill the dashboard.
|
|
|
|
|
"""
|
|
|
|
|
employees = birthday()
|
|
|
|
|
birthdays = []
|
|
|
|
|
for emp in employees:
|
2023-06-06 12:27:41 +05:30
|
|
|
name = f"{emp.employee_first_name} {emp.employee_last_name}"
|
|
|
|
|
dob = emp.dob.strftime("%d %b %Y")
|
2023-05-10 15:06:57 +05:30
|
|
|
days_till_birthday = emp.days_until_birthday
|
|
|
|
|
if days_till_birthday == 0:
|
2023-06-06 12:27:41 +05:30
|
|
|
days_till_birthday = "Today"
|
2023-05-10 15:06:57 +05:30
|
|
|
elif days_till_birthday == 1:
|
2023-06-06 12:27:41 +05:30
|
|
|
days_till_birthday = "Tomorrow"
|
2023-05-10 15:06:57 +05:30
|
|
|
else:
|
2023-06-06 12:27:41 +05:30
|
|
|
days_till_birthday = f"In {days_till_birthday} Days"
|
2023-05-10 15:06:57 +05:30
|
|
|
try:
|
|
|
|
|
path = emp.employee_profile.url
|
|
|
|
|
except:
|
2023-06-06 12:27:41 +05:30
|
|
|
path = f"https://ui-avatars.com/api/?\
|
|
|
|
|
name={emp.employee_first_name}+{emp.employee_last_name}&background=random"
|
|
|
|
|
birthdays.append(
|
|
|
|
|
{
|
|
|
|
|
"profile": path,
|
|
|
|
|
"name": name,
|
|
|
|
|
"dob": dob,
|
|
|
|
|
"daysUntilBirthday": days_till_birthday,
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
return JsonResponse({"birthdays": birthdays})
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def dashboard(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to render individual dashboard for employee module
|
|
|
|
|
"""
|
|
|
|
|
upcoming_birthdays = birthday()
|
|
|
|
|
employees = Employee.objects.all()
|
2023-06-06 12:27:41 +05:30
|
|
|
employees = filtersubordinates(request, employees, "employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
active_employees = employees.filter(is_active=True)
|
|
|
|
|
inactive_employees = employees.filter(is_active=False)
|
|
|
|
|
active_ratio = 0
|
|
|
|
|
inactive_ratio = 0
|
|
|
|
|
if employees.exists():
|
2023-06-06 12:27:41 +05:30
|
|
|
active_ratio = f"{(len(active_employees) / len(employees)) * 100:.1f}"
|
|
|
|
|
inactive_ratio = f"{(len(inactive_employees) / len(employees)) * 100:.1f}"
|
|
|
|
|
|
|
|
|
|
return render(
|
|
|
|
|
request,
|
|
|
|
|
"employee/dashboard/dashboard_employee.html",
|
|
|
|
|
{
|
|
|
|
|
"birthdays": upcoming_birthdays,
|
|
|
|
|
"active_employees": len(active_employees),
|
|
|
|
|
"inactive_employees": len(inactive_employees),
|
|
|
|
|
"total_employees": len(employees),
|
|
|
|
|
"active_ratio": active_ratio,
|
|
|
|
|
"inactive_ratio": inactive_ratio,
|
|
|
|
|
},
|
|
|
|
|
)
|
2023-05-10 15:06:57 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def dashboard_employee(request):
|
|
|
|
|
"""
|
|
|
|
|
Active and in-active employee dashboard
|
|
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
labels = [
|
2023-07-26 12:15:01 +05:30
|
|
|
_("Active"),
|
|
|
|
|
_("In-Active"),
|
2023-06-06 12:27:41 +05:30
|
|
|
]
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = Employee.objects.all()
|
2023-06-06 12:27:41 +05:30
|
|
|
employees = filtersubordinates(request, employees, "employee.view_employee")
|
|
|
|
|
response = {
|
|
|
|
|
"dataSet": [
|
|
|
|
|
{
|
2023-08-22 13:54:22 +05:30
|
|
|
"label": _("Employees"),
|
2023-06-06 12:27:41 +05:30
|
|
|
"data": [
|
|
|
|
|
len(employees.filter(is_active=True)),
|
|
|
|
|
len(employees.filter(is_active=False)),
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"labels": labels,
|
|
|
|
|
}
|
2023-05-10 15:06:57 +05:30
|
|
|
return JsonResponse(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
2023-05-10 15:06:57 +05:30
|
|
|
def dashboard_employee_gender(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to filter out gender vise employees
|
|
|
|
|
"""
|
2023-07-26 12:15:01 +05:30
|
|
|
labels = [_("Male"), _("Female"), _("Others")]
|
2023-05-10 15:06:57 +05:30
|
|
|
employees = Employee.objects.all()
|
2023-06-06 12:27:41 +05:30
|
|
|
employees = filtersubordinates(request, employees, "employee.view_employee")
|
|
|
|
|
|
|
|
|
|
response = {
|
|
|
|
|
"dataSet": [
|
|
|
|
|
{
|
2023-08-22 13:54:22 +05:30
|
|
|
"label": _("Employees"),
|
2023-06-06 12:27:41 +05:30
|
|
|
"data": [
|
|
|
|
|
len(employees.filter(gender="male")),
|
|
|
|
|
len(employees.filter(gender="female")),
|
|
|
|
|
len(employees.filter(gender="others")),
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
"labels": labels,
|
|
|
|
|
}
|
2023-05-10 15:06:57 +05:30
|
|
|
return JsonResponse(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
@manager_can_enter("employee.view_employee")
|
|
|
|
|
def dashboard_employee_department(_):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
This method is used to find the count of employees corresponding to the departments
|
|
|
|
|
"""
|
|
|
|
|
labels = []
|
|
|
|
|
count = []
|
|
|
|
|
departments = Department.objects.all()
|
|
|
|
|
for i in departments:
|
|
|
|
|
labels.append(i.department)
|
|
|
|
|
for dept in departments:
|
2023-06-06 12:27:41 +05:30
|
|
|
count.append(
|
|
|
|
|
len(
|
|
|
|
|
Employee.objects.filter(
|
|
|
|
|
employee_work_info__department_id__department=dept
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
response = {"dataSet": [{"label": "Department", "data": count}], "labels": labels}
|
2023-05-10 15:06:57 +05:30
|
|
|
return JsonResponse(response)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2023-06-06 12:27:41 +05:30
|
|
|
def dashboard_employee_tiles(_):
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
2023-06-06 12:27:41 +05:30
|
|
|
This method returns json response.
|
2023-05-10 15:06:57 +05:30
|
|
|
"""
|
|
|
|
|
data = {}
|
|
|
|
|
# active employees count
|
2023-06-06 12:27:41 +05:30
|
|
|
data["total_employees"] = Employee.objects.filter(is_active=True).count()
|
2023-05-10 15:06:57 +05:30
|
|
|
# filtering newbies
|
2023-10-02 01:46:59 +05:30
|
|
|
data["newbies_today"] = Candidate.objects.filter(
|
|
|
|
|
joining_date__range=[date.today(), date.today() + timedelta(days=1)]
|
2023-06-06 12:27:41 +05:30
|
|
|
).count()
|
2023-05-10 15:06:57 +05:30
|
|
|
try:
|
2023-06-06 12:27:41 +05:30
|
|
|
data[
|
|
|
|
|
"newbies_today_percentage"
|
|
|
|
|
] = f"""{
|
|
|
|
|
(EmployeeWorkInformation.objects.filter(
|
|
|
|
|
date_joining__range=[date.today(), date.today() + timedelta(days=1)]
|
|
|
|
|
).count() / Employee.objects.filter(
|
|
|
|
|
employee_work_info__isnull=False).count()
|
|
|
|
|
) * 100:.2f}%"""
|
|
|
|
|
except Exception:
|
|
|
|
|
data["newbies_today_percentage"] = 0
|
2023-05-10 15:06:57 +05:30
|
|
|
# filtering newbies on this week
|
|
|
|
|
|
2023-10-02 01:46:59 +05:30
|
|
|
data["newbies_week"] = Candidate.objects.filter(
|
|
|
|
|
joining_date__range=[date.today() - timedelta(days=date.today().weekday()), date.today() + timedelta(days=6-date.today().weekday())]
|
2023-06-06 12:27:41 +05:30
|
|
|
).count()
|
2023-05-10 15:06:57 +05:30
|
|
|
try:
|
2023-06-06 12:27:41 +05:30
|
|
|
data[
|
|
|
|
|
"newbies_week_percentage"
|
|
|
|
|
] = f"""{(
|
|
|
|
|
EmployeeWorkInformation.objects.filter(
|
|
|
|
|
date_joining__range=[date.today() - timedelta(days=7), date.today()]
|
|
|
|
|
).count() / Employee.objects.filter(
|
|
|
|
|
employee_work_info__isnull=False
|
|
|
|
|
).count()
|
|
|
|
|
) * 100:.2f}%"""
|
|
|
|
|
|
|
|
|
|
except Exception:
|
|
|
|
|
data["newbies_week_percentage"] = 0
|
2023-05-10 15:06:57 +05:30
|
|
|
return JsonResponse(data)
|
2023-09-20 12:33:51 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
|
def widget_filter(request):
|
|
|
|
|
"""
|
|
|
|
|
This method is used to return all the ids of the employees
|
|
|
|
|
"""
|
|
|
|
|
ids = EmployeeFilter(request.GET).qs.values_list("id", flat=True)
|
|
|
|
|
return JsonResponse({"ids": list(ids)})
|