diff --git a/employee/forms.py b/employee/forms.py index 2077e8b32..17c9d6e04 100644 --- a/employee/forms.py +++ b/employee/forms.py @@ -152,45 +152,33 @@ class EmployeeForm(ModelForm): """ This method is used to generate badge id """ - try: - # total_employee_count = Employee.objects.count() - badge_ids = Employee.objects.filter(~Q(badge_id=None)).order_by("-badge_id") - greatest_id = badge_ids.first().badge_id - match = re.findall(r"\d+", greatest_id[::-1]) - total_employee_count = 0 - if match: - total_employee_count = int(match[0][::-1]) - except Exception: - total_employee_count = 0 - try: - string = ( - Employee.objects.filter(~Q(badge_id=None)) - .order_by("-badge_id") - .last() - .badge_id - ) - except Exception: - string = "DUDE" - # Find the index of the last integer group in the string - integer_group_index = None - for i in range(len(string) - 1, -1, -1): - if string[i].isdigit(): - integer_group_index = i - elif integer_group_index is not None: - break + from base.context_processors import get_intial_prefix + from employee.methods.methods import get_ordered_badge_ids - if integer_group_index is None: - # There is no integer group in the string, so just append #01 - return string + "#01" - # Extract the integer group from the string - integer_group = string[integer_group_index:] - prefix = string[:integer_group_index] + prefix = get_intial_prefix(None)["get_intial_prefix"] + data = get_ordered_badge_ids() + result = [] + for sublist in data: + for item in sublist: + if isinstance(item, str) and item.lower().startswith(prefix.lower()): + # Find the index of the item in the sublist + index = sublist.index(item) + # Check if there is a next item in the sublist + if index + 1 < len(sublist): + result = sublist[index + 1] + result = re.findall(r"[a-zA-Z]+|\d+|[^a-zA-Z\d\s]", result) - # Set the integer group to the total number of employees plus one - new_integer_group = str(total_employee_count + 1).zfill(len(integer_group)) + if result: + prefix = [] + incremented = False + for item in reversed(result): + if not incremented and isinstance(eval(str(item)), int): + item = eval(item) + 1 + incremented = True + prefix.insert(0, str(item)) + prefix = "".join(prefix) - # Return the new string - return prefix + new_integer_group + return prefix def clean_badge_id(self): """ @@ -442,9 +430,9 @@ class BulkUpdateFieldForm(forms.Form): ] self.fields["update_fields"].choices = updated_choices for visible in self.visible_fields(): - visible.field.widget.attrs["class"] = ( - "oh-select oh-select-2 select2-hidden-accessible oh-input w-100" - ) + visible.field.widget.attrs[ + "class" + ] = "oh-select oh-select-2 select2-hidden-accessible oh-input w-100" class EmployeeNoteForm(ModelForm): @@ -571,7 +559,6 @@ class DisciplinaryActionForm(ModelForm): class ActiontypeForm(ModelForm): - class Meta: model = Actiontype fields = "__all__" diff --git a/employee/methods/methods.py b/employee/methods/methods.py new file mode 100644 index 000000000..8e2f6157b --- /dev/null +++ b/employee/methods/methods.py @@ -0,0 +1,51 @@ +""" +employee/methods.py +""" +from employee.models import Employee +from itertools import groupby +from base.context_processors import get_intial_prefix + + +def dynamic_prefix_sort(item): + # Assuming the dynamic prefix length is 3 + prefix = get_intial_prefix(None)["get_intial_prefix"] + + prefix_length = len(prefix) if len(prefix) >= 3 else 3 + return item[:prefix_length] + + +def get_ordered_badge_ids(): + """ + This method is used to return ordered badge ids + """ + employees = Employee.objects.all() + data = ( + employees.exclude(badge_id=None) + .order_by("badge_id") + .values_list("badge_id", flat=True) + ) + # Separate pure number strings and convert them to integers + pure_numbers = [int(item) for item in data if item.isdigit()] + + # Remove pure number strings from the original data + data = [item for item in data if not item.isdigit()] + + # Sort the remaining data by dynamic prefixes + sorted_data = sorted(data, key=dynamic_prefix_sort) + + # Group the sorted data by dynamic prefixes + grouped_data = [ + list(group) for _, group in groupby(sorted_data, key=dynamic_prefix_sort) + ] + + # Sort each subgroup alphabetically and numerically + for group in grouped_data: + group.sort() + group.sort(key=lambda x: int("".join(filter(str.isdigit, x)))) + + # Create a list containing the first and last items from each group + result = [[group[0], group[-1]] for group in grouped_data] + + # Add the list of pure numbers at the beginning + result.insert(0, [pure_numbers[0], pure_numbers[-1]]) + return result diff --git a/employee/templates/employee/create_form/personal_info.html b/employee/templates/employee/create_form/personal_info.html index 6f48e203c..dd97d0ebd 100644 --- a/employee/templates/employee/create_form/personal_info.html +++ b/employee/templates/employee/create_form/personal_info.html @@ -1,4 +1,13 @@ {% load i18n %} +
@@ -58,7 +67,11 @@
- + {{form.badge_id}} {{form.badge_id.errors}}
diff --git a/employee/templates/employee_personal_info/first_last_badge.html b/employee/templates/employee_personal_info/first_last_badge.html new file mode 100644 index 000000000..89082eb5e --- /dev/null +++ b/employee/templates/employee_personal_info/first_last_badge.html @@ -0,0 +1,5 @@ +{% for badge in badge_ids %} +
+ {{badge.0}} - {{badge.1}} +
+{% endfor %} \ No newline at end of file diff --git a/employee/urls.py b/employee/urls.py index 72d046300..e6d1f0372 100644 --- a/employee/urls.py +++ b/employee/urls.py @@ -347,5 +347,6 @@ urlpatterns = [ views.encashment_condition_create, name="encashment-condition-create", ), - path("initial-prefix",views.initial_prefix,name="initial-prefix") + path("initial-prefix",views.initial_prefix,name="initial-prefix"), + path("get-first-last-badge-id",views.first_last_badge,name="get-first-last-badge-id"), ] diff --git a/employee/views.py b/employee/views.py index 03d9092ce..95d61eb2c 100755 --- a/employee/views.py +++ b/employee/views.py @@ -35,6 +35,7 @@ from django.forms import CharField, ChoiceField, DateInput, Select from asset.models import AssetAssignment, AssetRequest from django.utils.translation import gettext_lazy as _ from attendance.models import Attendance, AttendanceOverTime +from employee.methods.methods import get_ordered_badge_ids from leave.models import LeaveRequest from notifications.signals import notify from horilla.decorators import ( @@ -1529,7 +1530,7 @@ def employee_filter_view(request): employees = employees.order_by(field_copy) employees = employees.exclude(employee_work_info__isnull=True) template = "employee_personal_info/group_by.html" - + employees = sortby(request, employees, "orderby") return render( request, template, @@ -1754,12 +1755,13 @@ def employee_archive(request, obj_id): if save: employee.save() messages.success(request, message) + return HttpResponse("") else: - related_models = ", ".join(model for model in result.get("related_models")) - messages.warning( - request, _(f"Can't archive.Employee assigned as {related_models}") + return render( + request, + "related_models.html", + {"employee": employee, "related_models": result.get("related_models")}, ) - return HttpResponseRedirect(request.META.get("HTTP_REFERER")) @login_required @@ -2340,6 +2342,8 @@ def get_employees_birthday(_): "name": name, "dob": dob, "daysUntilBirthday": days_till_birthday, + "department": emp.get_department().department, + "job_position": emp.get_job_position().job_position, } ) return JsonResponse({"birthdays": birthdays}) @@ -2902,5 +2906,22 @@ def initial_prefix(request): instance = instance if instance else EmployeeGeneralSetting() instance.badge_id_prefix = request.POST["initial_prefix"] instance.save() - messages.success(request,"Initial prefix update") + messages.success(request, "Initial prefix update") return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/")) + + + + +@login_required +@manager_can_enter("employee.view_employee") +def first_last_badge(request): + """ + This method is used to return the first last badge ids in grouped and ordere + """ + badge_ids =get_ordered_badge_ids() + + return render( + request, + "employee_personal_info/first_last_badge.html", + {"badge_ids": badge_ids}, + )