diff --git a/.gitignore b/.gitignore index dbe20d650..607fe0882 100755 --- a/.gitignore +++ b/.gitignore @@ -131,9 +131,9 @@ dmypy.json *.pyc # migration files -**/migrations/** -!**/migrations -!**/migrations/__init__.py +#**/migrations/** +#!**/migrations +#!**/migrations/__init__.py # media file media/ diff --git a/accessibility/migrations/0001_initial.py b/accessibility/migrations/0001_initial.py new file mode 100644 index 000000000..96471c4a6 --- /dev/null +++ b/accessibility/migrations/0001_initial.py @@ -0,0 +1,74 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="DefaultAccessibility", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "feature", + models.CharField( + choices=[ + ("employee_view", "Default Employee View"), + ( + "employee_detailed_view", + "Default Employee Detailed View", + ), + ("gender_chart", "Can view Gender Chart"), + ("department_chart", "Can view Department Chart"), + ("employees_chart", "Can view Employees Chart"), + ("birthday_view", "Can view Birthdays"), + ], + max_length=100, + ), + ), + ("filter", models.JSONField()), + ("exclude_all", models.BooleanField(default=False)), + ("is_enabled", models.BooleanField(default=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/accessibility/migrations/0002_initial.py b/accessibility/migrations/0002_initial.py new file mode 100644 index 000000000..4ec4e6dbd --- /dev/null +++ b/accessibility/migrations/0002_initial.py @@ -0,0 +1,38 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("accessibility", "0001_initial"), + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="defaultaccessibility", + name="employees", + field=models.ManyToManyField( + blank=True, related_name="default_accessibility", to="employee.employee" + ), + ), + migrations.AddField( + model_name="defaultaccessibility", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ] diff --git a/asset/migrations/0001_initial.py b/asset/migrations/0001_initial.py new file mode 100644 index 000000000..b1c49f2d1 --- /dev/null +++ b/asset/migrations/0001_initial.py @@ -0,0 +1,396 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import horilla.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="AssetAssignment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("assigned_date", models.DateField(auto_now_add=True)), + ( + "return_date", + models.DateField(blank=True, null=True, verbose_name="Return Date"), + ), + ( + "return_condition", + models.TextField( + blank=True, null=True, verbose_name="Return Condition" + ), + ), + ( + "return_status", + models.CharField( + blank=True, + choices=[ + ("Minor damage", "Minor damage"), + ("Major damage", "Major damage"), + ("Healthy", "Healthy"), + ], + max_length=30, + null=True, + verbose_name="Return Status", + ), + ), + ("return_request", models.BooleanField(default=False)), + ], + options={ + "verbose_name": "Asset Allocation", + "verbose_name_plural": "Asset Allocations", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="AssetCategory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "asset_category_name", + models.CharField(max_length=255, unique=True, verbose_name="Name"), + ), + ( + "asset_category_description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ], + options={ + "verbose_name": "Asset Category", + "verbose_name_plural": "Asset Categories", + }, + ), + migrations.CreateModel( + name="AssetDocuments", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "file", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ], + options={ + "verbose_name": "Asset Document", + "verbose_name_plural": "Asset Documents", + }, + ), + migrations.CreateModel( + name="AssetLot", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "lot_number", + models.CharField( + max_length=30, unique=True, verbose_name="Batch Number" + ), + ), + ( + "lot_description", + models.TextField(blank=True, null=True, verbose_name="Description"), + ), + ], + options={ + "verbose_name": "Asset Batch", + "verbose_name_plural": "Asset Batches", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="AssetReport", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(blank=True, max_length=255, null=True)), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="AssetRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("asset_request_date", models.DateField(auto_now_add=True)), + ( + "description", + models.TextField( + blank=True, + max_length=255, + null=True, + verbose_name="Description", + ), + ), + ( + "asset_request_status", + models.CharField( + blank=True, + choices=[ + ("Requested", "Requested"), + ("Approved", "Approved"), + ("Rejected", "Rejected"), + ], + default="Requested", + max_length=30, + null=True, + ), + ), + ], + options={ + "verbose_name": "Asset Request", + "verbose_name_plural": "Asset Requests", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="ReturnImages", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "image", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Asset", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "asset_name", + models.CharField(max_length=255, verbose_name="Asset Name"), + ), + ( + "asset_description", + models.TextField( + blank=True, + max_length=255, + null=True, + verbose_name="Description", + ), + ), + ( + "asset_tracking_id", + models.CharField( + max_length=30, unique=True, verbose_name="Tracking Id" + ), + ), + ("asset_purchase_date", models.DateField(verbose_name="Purchase Date")), + ( + "asset_purchase_cost", + models.DecimalField( + decimal_places=2, max_digits=10, verbose_name="Cost" + ), + ), + ( + "asset_status", + models.CharField( + choices=[ + ("In use", "In Use"), + ("Available", "Available"), + ("Not-Available", "Not-Available"), + ], + default="Available", + max_length=40, + verbose_name="Status", + ), + ), + ( + "expiry_date", + models.DateField(blank=True, null=True, verbose_name="Expiry Date"), + ), + ( + "notify_before", + models.IntegerField( + default=1, null=True, verbose_name="Notify Before (days)" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Asset", + "verbose_name_plural": "Assets", + "ordering": ["-created_at"], + }, + ), + ] diff --git a/asset/migrations/0002_initial.py b/asset/migrations/0002_initial.py new file mode 100644 index 000000000..92b04d1dc --- /dev/null +++ b/asset/migrations/0002_initial.py @@ -0,0 +1,322 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("asset", "0001_initial"), + ("base", "0001_initial"), + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="asset", + name="owner", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Current User", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="asset_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="asset.asset", + verbose_name="Asset", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="assigned_by_employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="assigned_by", + to="employee.employee", + verbose_name="Assigned By", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="assigned_to_employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="allocated_employee", + to="employee.employee", + verbose_name="Assigned To", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="assetcategory", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="assetcategory", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetcategory", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="asset", + name="asset_category_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="asset.assetcategory", + verbose_name="Category", + ), + ), + migrations.AddField( + model_name="assetdocuments", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetdocuments", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="assetlot", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="assetlot", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetlot", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="asset", + name="asset_lot_number_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="asset.assetlot", + verbose_name="Batch No", + ), + ), + migrations.AddField( + model_name="assetreport", + name="asset_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="asset_report", + to="asset.asset", + ), + ), + migrations.AddField( + model_name="assetreport", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetreport", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="assetdocuments", + name="asset_report", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="documents", + to="asset.assetreport", + ), + ), + migrations.AddField( + model_name="assetrequest", + name="asset_category_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="asset.assetcategory", + verbose_name="Asset Category", + ), + ), + migrations.AddField( + model_name="assetrequest", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="assetrequest", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="assetrequest", + name="requested_employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="requested_employee", + to="employee.employee", + verbose_name="Requesting User", + ), + ), + migrations.AddField( + model_name="returnimages", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="returnimages", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="assign_images", + field=models.ManyToManyField( + blank=True, + related_name="assign_images", + to="asset.returnimages", + verbose_name="Assign Condition Images", + ), + ), + migrations.AddField( + model_name="assetassignment", + name="return_images", + field=models.ManyToManyField( + blank=True, related_name="return_images", to="asset.returnimages" + ), + ), + ] diff --git a/attendance/migrations/0001_initial.py b/attendance/migrations/0001_initial.py new file mode 100644 index 000000000..79a5493df --- /dev/null +++ b/attendance/migrations/0001_initial.py @@ -0,0 +1,785 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import attendance.methods.utils +import horilla.models +import simple_history.models +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Attendance", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "attendance_date", + models.DateField( + validators=[attendance.methods.utils.attendance_date_validate], + verbose_name="Attendance date", + ), + ), + ( + "attendance_clock_in_date", + models.DateField(null=True, verbose_name="Check-In Date"), + ), + ( + "attendance_clock_in", + models.TimeField( + help_text="First Check-In Time", + null=True, + verbose_name="Check-In", + ), + ), + ( + "attendance_clock_out_date", + models.DateField(null=True, verbose_name="Check-Out Date"), + ), + ( + "attendance_clock_out", + models.TimeField( + help_text="Last Check-Out Time", + null=True, + verbose_name="Check-Out", + ), + ), + ( + "attendance_worked_hour", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Worked Hours", + ), + ), + ( + "minimum_hour", + models.CharField( + default="00:00", + max_length=10, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Minimum hour", + ), + ), + ( + "attendance_overtime", + models.CharField( + default="00:00", + max_length=10, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Overtime", + ), + ), + ( + "attendance_overtime_approve", + models.BooleanField(default=False, verbose_name="Overtime Approve"), + ), + ( + "attendance_validated", + models.BooleanField( + default=False, verbose_name="Attendance Validate" + ), + ), + ("at_work_second", models.IntegerField(blank=True, null=True)), + ( + "overtime_second", + models.IntegerField( + blank=True, null=True, verbose_name="Overtime In Second" + ), + ), + ("approved_overtime_second", models.IntegerField(default=0)), + ( + "is_validate_request", + models.BooleanField( + default=False, verbose_name="Is validate request" + ), + ), + ("is_bulk_request", models.BooleanField(default=False, editable=False)), + ( + "is_validate_request_approved", + models.BooleanField( + default=False, verbose_name="Is validate request approved" + ), + ), + ( + "request_description", + models.TextField(null=True, verbose_name="Request Description"), + ), + ( + "request_type", + models.CharField( + choices=[ + ("create_request", "Create Request"), + ("update_request", "Update Request"), + ("created_request", "Created Request"), + ], + default="update_request", + max_length=18, + null=True, + ), + ), + ("is_holiday", models.BooleanField(default=False)), + ("requested_data", models.JSONField(editable=False, null=True)), + ], + options={ + "verbose_name": "Attendance", + "verbose_name_plural": "Attendances", + "ordering": [ + "-attendance_date", + "employee_id__employee_first_name", + "attendance_clock_in", + ], + "permissions": [ + ("change_validateattendance", "Validate Attendance"), + ("change_approveovertime", "Change Approve Overtime"), + ], + }, + ), + migrations.CreateModel( + name="AttendanceActivity", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "attendance_date", + models.DateField( + null=True, + validators=[attendance.methods.utils.attendance_date_validate], + verbose_name="Attendance Date", + ), + ), + ("in_datetime", models.DateTimeField(null=True)), + ("clock_in_date", models.DateField(null=True, verbose_name="In Date")), + ("clock_in", models.TimeField(verbose_name="Check In")), + ( + "clock_out_date", + models.DateField(null=True, verbose_name="Out Date"), + ), + ("out_datetime", models.DateTimeField(null=True)), + ("clock_out", models.TimeField(null=True, verbose_name="Check Out")), + ], + options={ + "ordering": [ + "-attendance_date", + "employee_id__employee_first_name", + "clock_in", + ], + }, + ), + migrations.CreateModel( + name="AttendanceGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("time_runner", models.BooleanField(default=True)), + ( + "enable_check_in", + models.BooleanField( + default=True, + help_text="Enabling this feature allows employees to record their attendance using the Check-In/Check-Out button.", + verbose_name="Enable Check in/Check out", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="AttendanceLateComeEarlyOut", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "type", + models.CharField( + choices=[ + ("late_come", "Late Come"), + ("early_out", "Early Out"), + ], + max_length=20, + verbose_name="Type", + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True, null=True)), + ], + options={ + "ordering": ["-attendance_id__attendance_date"], + }, + ), + migrations.CreateModel( + name="AttendanceOverTime", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("month", models.CharField(max_length=10, verbose_name="Month")), + ("month_sequence", models.PositiveSmallIntegerField(default=0)), + ( + "year", + models.CharField( + default="2025", max_length=10, null=True, verbose_name="Year" + ), + ), + ( + "worked_hours", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Worked Hours", + ), + ), + ( + "pending_hours", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Pending Hours", + ), + ), + ( + "overtime", + models.CharField( + default="00:00", + max_length=20, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Overtime Hours", + ), + ), + ( + "hour_account_second", + models.IntegerField( + default=0, null=True, verbose_name="Worked Seconds" + ), + ), + ( + "hour_pending_second", + models.IntegerField( + default=0, null=True, verbose_name="Pending Seconds" + ), + ), + ( + "overtime_second", + models.IntegerField( + default=0, null=True, verbose_name="Overtime Seconds" + ), + ), + ], + options={ + "verbose_name": "Hour Account", + "verbose_name_plural": "Hour Accounts", + "ordering": ["-year", "-month_sequence"], + }, + ), + migrations.CreateModel( + name="AttendanceRequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="AttendanceRequestFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="AttendanceValidationCondition", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "validation_at_work", + models.CharField( + max_length=10, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Worked Hours Auto Approve Till", + ), + ), + ( + "minimum_overtime_to_approve", + models.CharField( + blank=True, + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + ), + ), + ( + "overtime_cutoff", + models.CharField( + blank=True, + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + ), + ), + ( + "auto_approve_ot", + models.BooleanField(default=False, verbose_name="Auto Approve OT"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="BatchAttendance", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=150, verbose_name="Title")), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="GraceTime", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "allowed_time", + models.CharField( + default="00:00:00", + max_length=10, + validators=[attendance.methods.utils.validate_hh_mm_ss_format], + verbose_name="Allowed Time", + ), + ), + ("allowed_time_in_secs", models.IntegerField()), + ( + "allowed_clock_in", + models.BooleanField( + default=True, + help_text="Allcocate this grace time for Check-In Attendance", + verbose_name="Allowed Clock-In", + ), + ), + ( + "allowed_clock_out", + models.BooleanField( + default=False, + help_text="Allcocate this grace time for Check-Out Attendance", + verbose_name="Allowed Clock-Out", + ), + ), + ("is_default", models.BooleanField(default=False)), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="HistoricalAttendance", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "attendance_date", + models.DateField( + validators=[attendance.methods.utils.attendance_date_validate], + verbose_name="Attendance date", + ), + ), + ( + "attendance_clock_in_date", + models.DateField(null=True, verbose_name="Check-In Date"), + ), + ( + "attendance_clock_in", + models.TimeField( + help_text="First Check-In Time", + null=True, + verbose_name="Check-In", + ), + ), + ( + "attendance_clock_out_date", + models.DateField(null=True, verbose_name="Check-Out Date"), + ), + ( + "attendance_clock_out", + models.TimeField( + help_text="Last Check-Out Time", + null=True, + verbose_name="Check-Out", + ), + ), + ( + "attendance_worked_hour", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Worked Hours", + ), + ), + ( + "minimum_hour", + models.CharField( + default="00:00", + max_length=10, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Minimum hour", + ), + ), + ( + "attendance_overtime", + models.CharField( + default="00:00", + max_length=10, + validators=[attendance.methods.utils.validate_time_format], + verbose_name="Overtime", + ), + ), + ( + "attendance_overtime_approve", + models.BooleanField(default=False, verbose_name="Overtime Approve"), + ), + ( + "attendance_validated", + models.BooleanField( + default=False, verbose_name="Attendance Validate" + ), + ), + ("at_work_second", models.IntegerField(blank=True, null=True)), + ( + "overtime_second", + models.IntegerField( + blank=True, null=True, verbose_name="Overtime In Second" + ), + ), + ("approved_overtime_second", models.IntegerField(default=0)), + ( + "is_validate_request", + models.BooleanField( + default=False, verbose_name="Is validate request" + ), + ), + ("is_bulk_request", models.BooleanField(default=False, editable=False)), + ( + "is_validate_request_approved", + models.BooleanField( + default=False, verbose_name="Is validate request approved" + ), + ), + ( + "request_description", + models.TextField(null=True, verbose_name="Request Description"), + ), + ( + "request_type", + models.CharField( + choices=[ + ("create_request", "Create Request"), + ("update_request", "Update Request"), + ("created_request", "Created Request"), + ], + default="update_request", + max_length=18, + null=True, + ), + ), + ("is_holiday", models.BooleanField(default=False)), + ("requested_data", models.JSONField(editable=False, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ], + options={ + "verbose_name": "historical Attendance", + "verbose_name_plural": "historical Attendances", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="WorkRecords", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "record_name", + models.CharField(blank=True, max_length=250, null=True), + ), + ( + "work_record_type", + models.CharField( + choices=[ + ("FDP", "Present"), + ("HDP", "Half Day Present"), + ("ABS", "Absent"), + ("HD", "Holiday/Company Leave"), + ("CONF", "Conflict"), + ("DFT", "Draft"), + ], + max_length=10, + null=True, + ), + ), + ("date", models.DateField(blank=True, null=True)), + ( + "at_work", + models.CharField( + blank=True, + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + ), + ), + ( + "min_hour", + models.CharField( + blank=True, + default="00:00", + max_length=10, + null=True, + validators=[attendance.methods.utils.validate_time_format], + ), + ), + ( + "at_work_second", + models.IntegerField(blank=True, default=0, null=True), + ), + ( + "min_hour_second", + models.IntegerField(blank=True, default=0, null=True), + ), + ("note", models.TextField(max_length=255)), + ("message", models.CharField(blank=True, max_length=30, null=True)), + ("is_attendance_record", models.BooleanField(default=False)), + ("is_leave_record", models.BooleanField(default=False)), + ("day_percentage", models.FloatField(default=0)), + ("last_update", models.DateTimeField(blank=True, null=True)), + ], + options={ + "verbose_name": "Work Record", + "verbose_name_plural": "Work Records", + }, + ), + ] diff --git a/attendance/migrations/0002_initial.py b/attendance/migrations/0002_initial.py new file mode 100644 index 000000000..db5b2770a --- /dev/null +++ b/attendance/migrations/0002_initial.py @@ -0,0 +1,615 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("attendance", "0001_initial"), + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + ("leave", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="attendance", + name="approved_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Approved By", + ), + ), + migrations.AddField( + model_name="attendance", + name="attendance_day", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to="base.employeeshiftday", + verbose_name="Attendance day", + ), + ), + migrations.AddField( + model_name="attendance", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendance", + name="employee_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_attendances", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="attendance", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendance", + name="shift_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="base.employeeshift", + verbose_name="Shift", + ), + ), + migrations.AddField( + model_name="attendance", + name="work_type_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="base.worktype", + verbose_name="Work Type", + ), + ), + migrations.AddField( + model_name="attendanceactivity", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendanceactivity", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_attendance_activities", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="attendanceactivity", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendanceactivity", + name="shift_day", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to="base.employeeshiftday", + verbose_name="Shift Day", + ), + ), + migrations.AddField( + model_name="attendancegeneralsetting", + name="company_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + migrations.AddField( + model_name="attendancegeneralsetting", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendancegeneralsetting", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendancelatecomeearlyout", + name="attendance_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="late_come_early_out", + to="attendance.attendance", + verbose_name="Attendance", + ), + ), + migrations.AddField( + model_name="attendancelatecomeearlyout", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendancelatecomeearlyout", + name="employee_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="late_come_early_out", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="attendancelatecomeearlyout", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendanceovertime", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendanceovertime", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_overtime", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="attendanceovertime", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendancerequestcomment", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendancerequestcomment", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="employee.employee" + ), + ), + migrations.AddField( + model_name="attendancerequestcomment", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendancerequestcomment", + name="request_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="attendance.attendance" + ), + ), + migrations.AddField( + model_name="attendancerequestfile", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendancerequestfile", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendancerequestcomment", + name="files", + field=models.ManyToManyField( + blank=True, to="attendance.attendancerequestfile" + ), + ), + migrations.AddField( + model_name="attendancevalidationcondition", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="attendancevalidationcondition", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="attendancevalidationcondition", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="batchattendance", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="batchattendance", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="attendance", + name="batch_attendance_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="attendance.batchattendance", + verbose_name="Batch Attendance", + ), + ), + migrations.AddField( + model_name="gracetime", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="gracetime", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="gracetime", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="approved_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Approved By", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="attendance_day", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshiftday", + verbose_name="Attendance day", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="batch_attendance_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="attendance.batchattendance", + verbose_name="Batch Attendance", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="created_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="employee_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="history_relation", + field=models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="attendance.attendance", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="history_tags", + field=models.ManyToManyField(to="horilla_audit.audittag"), + ), + migrations.AddField( + model_name="historicalattendance", + name="history_user", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="modified_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="shift_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Shift", + ), + ), + migrations.AddField( + model_name="historicalattendance", + name="work_type_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Work Type", + ), + ), + migrations.AddField( + model_name="workrecords", + name="attendance_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="attendance.attendance", + ), + ), + migrations.AddField( + model_name="workrecords", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="workrecords", + name="leave_request_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="leave.leaverequest", + ), + ), + migrations.AddField( + model_name="workrecords", + name="shift_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="base.employeeshift", + ), + ), + migrations.AlterUniqueTogether( + name="attendancelatecomeearlyout", + unique_together={("attendance_id", "type")}, + ), + migrations.AlterUniqueTogether( + name="attendanceovertime", + unique_together={("employee_id", "month", "year")}, + ), + migrations.AlterUniqueTogether( + name="attendance", + unique_together={("employee_id", "attendance_date")}, + ), + ] diff --git a/base/migrations/0001_initial.py b/base/migrations/0001_initial.py new file mode 100644 index 000000000..f10b82174 --- /dev/null +++ b/base/migrations/0001_initial.py @@ -0,0 +1,2075 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import base.models +import django.core.validators +import django.db.models.deletion +import django.utils.timezone +import horilla.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="AnnouncementComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="AnnouncementExpire", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("days", models.IntegerField(blank=True, default=30, null=True)), + ], + ), + migrations.CreateModel( + name="AnnouncementView", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("viewed", models.BooleanField(default=False)), + ("created_at", models.DateTimeField(auto_now_add=True, null=True)), + ], + ), + migrations.CreateModel( + name="Attachment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ], + ), + migrations.CreateModel( + name="AttendanceAllowedIP", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("is_enabled", models.BooleanField(default=False)), + ( + "additional_data", + models.JSONField( + blank=True, + default=base.models.default_additional_data, + null=True, + ), + ), + ], + ), + migrations.CreateModel( + name="BaserequestFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ], + ), + migrations.CreateModel( + name="BiometricAttendance", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("is_installed", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name="Company", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("company", models.CharField(max_length=50, verbose_name="Name")), + ("hq", models.BooleanField(default=False)), + ("address", models.TextField(max_length=255)), + ("country", models.CharField(max_length=50)), + ("state", models.CharField(max_length=50)), + ("city", models.CharField(max_length=50)), + ("zip", models.CharField(max_length=20)), + ( + "icon", + models.FileField(null=True, upload_to=horilla.models.upload_path), + ), + ("date_format", models.CharField(blank=True, max_length=30, null=True)), + ("time_format", models.CharField(blank=True, max_length=20, null=True)), + ], + options={ + "verbose_name": "Company", + "verbose_name_plural": "Companies", + }, + ), + migrations.CreateModel( + name="CompanyLeaves", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "based_on_week", + models.CharField( + blank=True, + choices=[ + ("0", "First Week"), + ("1", "Second Week"), + ("2", "Third Week"), + ("3", "Fourth Week"), + ("4", "Fifth Week"), + ], + max_length=100, + null=True, + verbose_name="Based On Week", + ), + ), + ( + "based_on_week_day", + models.CharField( + choices=[ + ("0", "Monday"), + ("1", "Tuesday"), + ("2", "Wednesday"), + ("3", "Thursday"), + ("4", "Friday"), + ("5", "Saturday"), + ("6", "Sunday"), + ], + max_length=100, + verbose_name="Based On Week Day", + ), + ), + ], + options={ + "verbose_name": "Company Leave", + "verbose_name_plural": "Company Leaves", + }, + ), + migrations.CreateModel( + name="DashboardEmployeeCharts", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "charts", + models.JSONField( + blank=True, + default=list, + null=True, + verbose_name="Excluded Charts", + ), + ), + ], + options={ + "verbose_name": "Dashboard Employee Charts", + "verbose_name_plural": "Dashboard Employee Charts", + }, + ), + migrations.CreateModel( + name="Department", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "department", + models.CharField(max_length=50, verbose_name="Department"), + ), + ], + options={ + "verbose_name": "Department", + "verbose_name_plural": "Departments", + }, + ), + migrations.CreateModel( + name="DriverViewed", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "viewed", + models.CharField( + choices=[ + ("dashboard", "dashboard"), + ("pipeline", "pipeline"), + ("settings", "settings"), + ], + max_length=10, + ), + ), + ], + ), + migrations.CreateModel( + name="DynamicEmailConfiguration", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "host", + models.CharField( + max_length=256, null=True, verbose_name="Email Host" + ), + ), + ( + "port", + models.SmallIntegerField(null=True, verbose_name="Email Port"), + ), + ( + "from_email", + models.EmailField( + max_length=256, null=True, verbose_name="Default From Email" + ), + ), + ( + "username", + models.CharField( + max_length=256, null=True, verbose_name="Email Host Username" + ), + ), + ( + "display_name", + models.CharField( + max_length=256, null=True, verbose_name="Display Name" + ), + ), + ( + "password", + models.CharField( + max_length=256, + null=True, + verbose_name="Email Authentication Password", + ), + ), + ("use_tls", models.BooleanField(default=True, verbose_name="Use TLS")), + ("use_ssl", models.BooleanField(default=False, verbose_name="Use SSL")), + ( + "fail_silently", + models.BooleanField(default=False, verbose_name="Fail Silently"), + ), + ( + "is_primary", + models.BooleanField( + default=False, verbose_name="Primary Mail Server" + ), + ), + ( + "use_dynamic_display_name", + models.BooleanField( + default=True, + help_text="By enabling this the display name will take from who triggered the mail", + ), + ), + ( + "timeout", + models.SmallIntegerField( + null=True, verbose_name="Email Send Timeout (seconds)" + ), + ), + ], + options={ + "verbose_name": "Email Configuration", + }, + ), + migrations.CreateModel( + name="DynamicPagination", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "pagination", + models.IntegerField( + default=50, + validators=[django.core.validators.MinValueValidator(1)], + ), + ), + ], + ), + migrations.CreateModel( + name="EmailLog", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("subject", models.CharField(max_length=255)), + ("body", models.TextField(max_length=255)), + ("from_email", models.EmailField(max_length=254)), + ("to", models.EmailField(max_length=254)), + ( + "status", + models.CharField( + choices=[("sent", "Sent"), ("failed", "Failed")], max_length=6 + ), + ), + ("created_at", models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.CreateModel( + name="EmployeeShift", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("employee_shift", models.CharField(max_length=50)), + ( + "weekly_full_time", + models.CharField( + blank=True, + default="40:00", + max_length=6, + null=True, + validators=[base.models.validate_time_format], + ), + ), + ( + "full_time", + models.CharField( + default="200:00", + max_length=6, + validators=[base.models.validate_time_format], + ), + ), + ], + options={ + "verbose_name": "Employee Shift", + "verbose_name_plural": "Employee Shifts", + }, + ), + migrations.CreateModel( + name="EmployeeShiftDay", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "day", + models.CharField( + choices=[ + ("monday", "Monday"), + ("tuesday", "Tuesday"), + ("wednesday", "Wednesday"), + ("thursday", "Thursday"), + ("friday", "Friday"), + ("saturday", "Saturday"), + ("sunday", "Sunday"), + ], + max_length=20, + ), + ), + ], + options={ + "verbose_name": "Employee Shift Day", + "verbose_name_plural": "Employee Shift Days", + }, + ), + migrations.CreateModel( + name="EmployeeShiftSchedule", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "minimum_working_hour", + models.CharField( + default="08:15", + max_length=5, + validators=[base.models.validate_time_format], + verbose_name="Minimum Working Hours", + ), + ), + ("start_time", models.TimeField(null=True, verbose_name="Start Time")), + ("end_time", models.TimeField(null=True, verbose_name="End Time")), + ( + "is_night_shift", + models.BooleanField(default=False, verbose_name="Night Shift"), + ), + ( + "is_auto_punch_out_enabled", + models.BooleanField( + default=False, + help_text="Enable this to trigger automatic check out.", + verbose_name="Enable Automatic Check Out", + ), + ), + ( + "auto_punch_out_time", + models.TimeField( + blank=True, + help_text="Time at which the horilla will automatically check out the employee attendance if they forget.", + null=True, + verbose_name="Automatic Check Out Time", + ), + ), + ], + options={ + "verbose_name": "Employee Shift Schedule", + "verbose_name_plural": "Employee Shift Schedules", + "ordering": [ + models.Case( + models.When(day__day="monday", then=0), + models.When(day__day="tuesday", then=1), + models.When(day__day="wednesday", then=2), + models.When(day__day="thursday", then=3), + models.When(day__day="friday", then=4), + models.When(day__day="saturday", then=5), + models.When(day__day="sunday", then=6), + default=7, + ) + ], + }, + ), + migrations.CreateModel( + name="EmployeeType", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("employee_type", models.CharField(max_length=50)), + ], + options={ + "verbose_name": "Employee Type", + "verbose_name_plural": "Employee Types", + }, + ), + migrations.CreateModel( + name="HistoricalRotatingShiftAssign", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "start_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Start Date" + ), + ), + ( + "next_change_date", + models.DateField(null=True, verbose_name="Next Switch"), + ), + ( + "based_on", + models.CharField( + choices=[ + ("after", "After"), + ("weekly", "Weekend"), + ("monthly", "Monthly"), + ], + max_length=10, + verbose_name="Based On", + ), + ), + ( + "rotate_after_day", + models.IntegerField( + blank=True, + default=7, + null=True, + verbose_name="Rotate After Day", + ), + ), + ( + "rotate_every_weekend", + models.CharField( + blank=True, + choices=[ + ("monday", "Monday"), + ("tuesday", "Tuesday"), + ("wednesday", "Wednesday"), + ("thursday", "Thursday"), + ("friday", "Friday"), + ("saturday", "Saturday"), + ("sunday", "Sunday"), + ], + default="monday", + max_length=10, + null=True, + verbose_name="Rotate Every Weekend", + ), + ), + ( + "rotate_every", + models.CharField( + blank=True, + choices=[ + ("1", "1"), + ("2", "2"), + ("3", "3"), + ("4", "4"), + ("5", "5"), + ("6", "6"), + ("7", "7"), + ("8", "8"), + ("9", "9"), + ("10", "10"), + ("11", "11"), + ("12", "12"), + ("13", "13"), + ("14", "14"), + ("15", "15"), + ("16", "16"), + ("17", "17"), + ("18", "18"), + ("19", "19"), + ("20", "20"), + ("21", "21"), + ("22", "22"), + ("23", "23"), + ("24", "24"), + ("25", "25"), + ("26", "26"), + ("27", "27"), + ("28", "28"), + ("29", "29"), + ("30", "30"), + ("31", "31"), + ("last", "Last Day"), + ], + default="1", + max_length=10, + null=True, + verbose_name="Rotate Every Month", + ), + ), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ], + options={ + "verbose_name": "historical Rotating Shift Assign", + "verbose_name_plural": "historical Rotating Shift Assigns", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalRotatingWorkTypeAssign", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "start_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Start Date" + ), + ), + ( + "next_change_date", + models.DateField(null=True, verbose_name="Next Switch"), + ), + ( + "based_on", + models.CharField( + choices=[ + ("after", "After"), + ("weekly", "Weekend"), + ("monthly", "Monthly"), + ], + max_length=10, + verbose_name="Based On", + ), + ), + ( + "rotate_after_day", + models.IntegerField(default=7, verbose_name="Rotate After Day"), + ), + ( + "rotate_every_weekend", + models.CharField( + blank=True, + choices=[ + ("monday", "Monday"), + ("tuesday", "Tuesday"), + ("wednesday", "Wednesday"), + ("thursday", "Thursday"), + ("friday", "Friday"), + ("saturday", "Saturday"), + ("sunday", "Sunday"), + ], + default="monday", + max_length=10, + null=True, + verbose_name="Rotate Every Weekend", + ), + ), + ( + "rotate_every", + models.CharField( + choices=[ + ("1", "1"), + ("2", "2"), + ("3", "3"), + ("4", "4"), + ("5", "5"), + ("6", "6"), + ("7", "7"), + ("8", "8"), + ("9", "9"), + ("10", "10"), + ("11", "11"), + ("12", "12"), + ("13", "13"), + ("14", "14"), + ("15", "15"), + ("16", "16"), + ("17", "17"), + ("18", "18"), + ("19", "19"), + ("20", "20"), + ("21", "21"), + ("22", "22"), + ("23", "23"), + ("24", "24"), + ("25", "25"), + ("26", "26"), + ("27", "27"), + ("28", "28"), + ("29", "29"), + ("30", "30"), + ("31", "31"), + ("last", "Last Day"), + ], + default="1", + max_length=10, + verbose_name="Rotate Every Month", + ), + ), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ], + options={ + "verbose_name": "historical Rotating Work Type Assign", + "verbose_name_plural": "historical Rotating Work Type Assigns", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalShiftRequest", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, + null=True, + verbose_name="Requested Date", + ), + ), + ( + "reallocate_approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "reallocate_canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ( + "requested_till", + models.DateField( + blank=True, null=True, verbose_name="Requested Till" + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "is_permanent_shift", + models.BooleanField( + default=False, verbose_name="Permanent Request" + ), + ), + ( + "approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ("shift_changed", models.BooleanField(default=False)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ], + options={ + "verbose_name": "historical Shift Request", + "verbose_name_plural": "historical Shift Requests", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalWorkTypeRequest", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, + null=True, + verbose_name="Requested Date", + ), + ), + ( + "requested_till", + models.DateField( + blank=True, null=True, verbose_name="Requested Till" + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "is_permanent_work_type", + models.BooleanField( + default=False, verbose_name="Permanent Request" + ), + ), + ( + "approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ("work_type_changed", models.BooleanField(default=False)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ], + options={ + "verbose_name": "historical Work Type Request", + "verbose_name_plural": "historical Work Type Requests", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="Holidays", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("name", models.CharField(max_length=30, verbose_name="Name")), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "recurring", + models.BooleanField(default=False, verbose_name="Recurring"), + ), + ], + options={ + "verbose_name": "Holiday", + "verbose_name_plural": "Holidays", + }, + ), + migrations.CreateModel( + name="HorillaMailTemplate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100, unique=True)), + ("body", models.TextField()), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="IntegrationApps", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("app_label", models.CharField(max_length=255, unique=True)), + ("is_enabled", models.BooleanField(default=False)), + ], + options={ + "abstract": False, + }, + bases=(models.Model, horilla.models.NoPermissionModel), + ), + migrations.CreateModel( + name="JobPosition", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "job_position", + models.CharField(max_length=50, verbose_name="Job Position"), + ), + ], + options={ + "verbose_name": "Job Position", + "verbose_name_plural": "Job Positions", + }, + ), + migrations.CreateModel( + name="JobRole", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "job_role", + models.CharField(max_length=50, null=True, verbose_name="Job Role"), + ), + ], + options={ + "verbose_name": "Job Role", + "verbose_name_plural": "Job Roles", + }, + ), + migrations.CreateModel( + name="MultipleApprovalCondition", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "condition_field", + models.CharField( + choices=[ + ("", "---------"), + ("requested_days", "Leave Requested Days"), + ], + max_length=255, + ), + ), + ( + "condition_operator", + models.CharField( + blank=True, + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("range", "Range"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("icontains", "Contains"), + ], + max_length=255, + null=True, + ), + ), + ( + "condition_value", + models.CharField( + blank=True, + max_length=100, + null=True, + verbose_name="Condition Value", + ), + ), + ( + "condition_start_value", + models.CharField( + blank=True, + max_length=100, + null=True, + verbose_name="Starting Value", + ), + ), + ( + "condition_end_value", + models.CharField( + blank=True, + max_length=100, + null=True, + verbose_name="Ending Value", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="MultipleApprovalManagers", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("sequence", models.IntegerField()), + ("employee_id", models.IntegerField(blank=True, null=True)), + ( + "reporting_manager", + models.CharField(blank=True, max_length=100, null=True), + ), + ], + options={ + "verbose_name": "Multiple Approval Managers", + "verbose_name_plural": "Multiple Approval Managers", + }, + ), + migrations.CreateModel( + name="NotificationSound", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("sound_enabled", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name="PenaltyAccounts", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("minus_leaves", models.FloatField(default=0.0, null=True)), + ("deduct_from_carry_forward", models.BooleanField(default=False)), + ("penalty_amount", models.FloatField(default=0.0, null=True)), + ], + options={ + "verbose_name": "Penalty Account", + "verbose_name_plural": "Penalty Accounts", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="RotatingShift", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("name", models.CharField(max_length=50)), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ], + options={ + "verbose_name": "Rotating Shift", + "verbose_name_plural": "Rotating Shifts", + }, + ), + migrations.CreateModel( + name="RotatingShiftAssign", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "start_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Start Date" + ), + ), + ( + "next_change_date", + models.DateField(null=True, verbose_name="Next Switch"), + ), + ( + "based_on", + models.CharField( + choices=[ + ("after", "After"), + ("weekly", "Weekend"), + ("monthly", "Monthly"), + ], + max_length=10, + verbose_name="Based On", + ), + ), + ( + "rotate_after_day", + models.IntegerField( + blank=True, + default=7, + null=True, + verbose_name="Rotate After Day", + ), + ), + ( + "rotate_every_weekend", + models.CharField( + blank=True, + choices=[ + ("monday", "Monday"), + ("tuesday", "Tuesday"), + ("wednesday", "Wednesday"), + ("thursday", "Thursday"), + ("friday", "Friday"), + ("saturday", "Saturday"), + ("sunday", "Sunday"), + ], + default="monday", + max_length=10, + null=True, + verbose_name="Rotate Every Weekend", + ), + ), + ( + "rotate_every", + models.CharField( + blank=True, + choices=[ + ("1", "1"), + ("2", "2"), + ("3", "3"), + ("4", "4"), + ("5", "5"), + ("6", "6"), + ("7", "7"), + ("8", "8"), + ("9", "9"), + ("10", "10"), + ("11", "11"), + ("12", "12"), + ("13", "13"), + ("14", "14"), + ("15", "15"), + ("16", "16"), + ("17", "17"), + ("18", "18"), + ("19", "19"), + ("20", "20"), + ("21", "21"), + ("22", "22"), + ("23", "23"), + ("24", "24"), + ("25", "25"), + ("26", "26"), + ("27", "27"), + ("28", "28"), + ("29", "29"), + ("30", "30"), + ("31", "31"), + ("last", "Last Day"), + ], + default="1", + max_length=10, + null=True, + verbose_name="Rotate Every Month", + ), + ), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ], + options={ + "verbose_name": "Rotating Shift Assign", + "verbose_name_plural": "Rotating Shift Assigns", + "ordering": ["-next_change_date", "-employee_id__employee_first_name"], + }, + ), + migrations.CreateModel( + name="RotatingWorkType", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("name", models.CharField(max_length=50)), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ], + options={ + "verbose_name": "Rotating Work Type", + "verbose_name_plural": "Rotating Work Types", + }, + ), + migrations.CreateModel( + name="RotatingWorkTypeAssign", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "start_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Start Date" + ), + ), + ( + "next_change_date", + models.DateField(null=True, verbose_name="Next Switch"), + ), + ( + "based_on", + models.CharField( + choices=[ + ("after", "After"), + ("weekly", "Weekend"), + ("monthly", "Monthly"), + ], + max_length=10, + verbose_name="Based On", + ), + ), + ( + "rotate_after_day", + models.IntegerField(default=7, verbose_name="Rotate After Day"), + ), + ( + "rotate_every_weekend", + models.CharField( + blank=True, + choices=[ + ("monday", "Monday"), + ("tuesday", "Tuesday"), + ("wednesday", "Wednesday"), + ("thursday", "Thursday"), + ("friday", "Friday"), + ("saturday", "Saturday"), + ("sunday", "Sunday"), + ], + default="monday", + max_length=10, + null=True, + verbose_name="Rotate Every Weekend", + ), + ), + ( + "rotate_every", + models.CharField( + choices=[ + ("1", "1"), + ("2", "2"), + ("3", "3"), + ("4", "4"), + ("5", "5"), + ("6", "6"), + ("7", "7"), + ("8", "8"), + ("9", "9"), + ("10", "10"), + ("11", "11"), + ("12", "12"), + ("13", "13"), + ("14", "14"), + ("15", "15"), + ("16", "16"), + ("17", "17"), + ("18", "18"), + ("19", "19"), + ("20", "20"), + ("21", "21"), + ("22", "22"), + ("23", "23"), + ("24", "24"), + ("25", "25"), + ("26", "26"), + ("27", "27"), + ("28", "28"), + ("29", "29"), + ("30", "30"), + ("31", "31"), + ("last", "Last Day"), + ], + default="1", + max_length=10, + verbose_name="Rotate Every Month", + ), + ), + ( + "additional_data", + models.JSONField(blank=True, default=dict, null=True), + ), + ], + options={ + "verbose_name": "Rotating Work Type Assign", + "verbose_name_plural": "Rotating Work Type Assigns", + "ordering": ["-next_change_date", "-employee_id__employee_first_name"], + }, + ), + migrations.CreateModel( + name="ShiftRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, + null=True, + verbose_name="Requested Date", + ), + ), + ( + "reallocate_approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "reallocate_canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ( + "requested_till", + models.DateField( + blank=True, null=True, verbose_name="Requested Till" + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "is_permanent_shift", + models.BooleanField( + default=False, verbose_name="Permanent Request" + ), + ), + ( + "approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ("shift_changed", models.BooleanField(default=False)), + ], + options={ + "verbose_name": "Shift Request", + "verbose_name_plural": "Shift Requests", + "ordering": ["-id"], + "permissions": ( + ("approve_shiftrequest", "Approve Shift Request"), + ("cancel_shiftrequest", "Cancel Shift Request"), + ), + }, + ), + migrations.CreateModel( + name="ShiftRequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("comment", models.TextField(null=True, verbose_name="Comment")), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Tags", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=30)), + ("color", models.CharField(max_length=30)), + ], + options={ + "verbose_name": "Tag", + "verbose_name_plural": "Tags", + }, + ), + migrations.CreateModel( + name="TrackLateComeEarlyOut", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "is_enable", + models.BooleanField( + default=True, + help_text="By enabling this, you track the late comes and early outs of employees in their attendance.", + verbose_name="Enable", + ), + ), + ], + options={ + "verbose_name": "Track Late Come Early Out", + "verbose_name_plural": "Track Late Come Early Outs", + }, + ), + migrations.CreateModel( + name="WorkType", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "work_type", + models.CharField(max_length=50, verbose_name="Work Type"), + ), + ], + options={ + "verbose_name": "Work Type", + "verbose_name_plural": "Work Types", + }, + ), + migrations.CreateModel( + name="WorkTypeRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, + null=True, + verbose_name="Requested Date", + ), + ), + ( + "requested_till", + models.DateField( + blank=True, null=True, verbose_name="Requested Till" + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "is_permanent_work_type", + models.BooleanField( + default=False, verbose_name="Permanent Request" + ), + ), + ( + "approved", + models.BooleanField(default=False, verbose_name="Approved"), + ), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ("work_type_changed", models.BooleanField(default=False)), + ], + options={ + "verbose_name": "Work Type Request", + "verbose_name_plural": "Work Type Requests", + "ordering": ["-id"], + "permissions": ( + ("approve_worktyperequest", "Approve Work Type Request"), + ("cancel_worktyperequest", "Cancel Work Type Request"), + ), + }, + ), + migrations.CreateModel( + name="WorkTypeRequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("comment", models.TextField(null=True, verbose_name="Comment")), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Announcement", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100)), + ("description", models.TextField(null=True)), + ("expire_date", models.DateField(blank=True, null=True)), + ( + "disable_comments", + models.BooleanField(default=False, verbose_name="Disable Comments"), + ), + ( + "public_comments", + models.BooleanField( + default=True, + help_text="If enabled, all employees can view each other's comments.", + verbose_name="Show Comments to All", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ], + options={ + "verbose_name": "Announcement", + "verbose_name_plural": "Announcements", + }, + ), + ] diff --git a/base/migrations/0002_initial.py b/base/migrations/0002_initial.py new file mode 100644 index 000000000..8df0ba2fa --- /dev/null +++ b/base/migrations/0002_initial.py @@ -0,0 +1,1757 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("attendance", "0002_initial"), + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + ("leave", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name="announcement", + name="employees", + field=models.ManyToManyField( + blank=True, + help_text="If no employee, department or job position is selected, the announcement will be visible to all employees in the selected company.", + related_name="announcement_employees", + to="employee.employee", + ), + ), + migrations.AddField( + model_name="announcement", + name="filtered_employees", + field=models.ManyToManyField( + editable=False, + related_name="announcement_filtered_employees", + to="employee.employee", + ), + ), + migrations.AddField( + model_name="announcement", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="announcementcomment", + name="announcement_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="base.announcement" + ), + ), + migrations.AddField( + model_name="announcementcomment", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="announcementcomment", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="employee.employee" + ), + ), + migrations.AddField( + model_name="announcementcomment", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="announcementview", + name="announcement", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="base.announcement" + ), + ), + migrations.AddField( + model_name="announcementview", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL + ), + ), + migrations.AddField( + model_name="announcement", + name="attachments", + field=models.ManyToManyField( + blank=True, + related_name="announcement_attachments", + to="base.attachment", + ), + ), + migrations.AddField( + model_name="company", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="company", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="biometricattendance", + name="company_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="biometric_enabled_company", + to="base.company", + ), + ), + migrations.AddField( + model_name="announcement", + name="company_id", + field=models.ManyToManyField( + blank=True, + related_name="announcement", + to="base.company", + verbose_name="Company", + ), + ), + migrations.AddField( + model_name="companyleaves", + name="company_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + migrations.AddField( + model_name="companyleaves", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="companyleaves", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="dashboardemployeecharts", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="dashboardemployeecharts", + name="employee", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="employee.employee" + ), + ), + migrations.AddField( + model_name="dashboardemployeecharts", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="department", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="department", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="department", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="announcement", + name="department", + field=models.ManyToManyField(blank=True, to="base.department"), + ), + migrations.AddField( + model_name="driverviewed", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL + ), + ), + migrations.AddField( + model_name="dynamicemailconfiguration", + name="company_id", + field=models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + migrations.AddField( + model_name="dynamicemailconfiguration", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="dynamicemailconfiguration", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="dynamicpagination", + name="user_id", + field=models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="dynamic_pagination", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), + migrations.AddField( + model_name="emaillog", + name="company_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + migrations.AddField( + model_name="employeeshift", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="employeeshift", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="employeeshift", + name="grace_time_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_shift", + to="attendance.gracetime", + verbose_name="Grace Time", + ), + ), + migrations.AddField( + model_name="employeeshift", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="employeeshiftday", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="employeeshiftschedule", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="employeeshiftschedule", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="employeeshiftschedule", + name="day", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="day_schedule", + to="base.employeeshiftday", + ), + ), + migrations.AddField( + model_name="employeeshiftschedule", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="employeeshiftschedule", + name="shift_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="base.employeeshift", + verbose_name="Shift", + ), + ), + migrations.AddField( + model_name="employeeshift", + name="days", + field=models.ManyToManyField( + through="base.EmployeeShiftSchedule", to="base.employeeshiftday" + ), + ), + migrations.AddField( + model_name="employeetype", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="employeetype", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="employeetype", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="created_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="current_shift", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Current Shift", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="employee_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="history_tags", + field=models.ManyToManyField(to="horilla_audit.audittag"), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="history_user", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="modified_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="next_shift", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Next Shift", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="created_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="employee_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="history_tags", + field=models.ManyToManyField(to="horilla_audit.audittag"), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="history_user", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="modified_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="created_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="employee_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="history_tags", + field=models.ManyToManyField(to="horilla_audit.audittag"), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="history_user", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="modified_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="previous_shift_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Previous Shift", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="reallocate_to", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Reallocate Employee", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="shift_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Requesting Shift", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="created_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="employee_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="history_tags", + field=models.ManyToManyField(to="horilla_audit.audittag"), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="history_user", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="modified_by", + field=models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="holidays", + name="company_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + migrations.AddField( + model_name="holidays", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="holidays", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="horillamailtemplate", + name="company_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + migrations.AddField( + model_name="horillamailtemplate", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="horillamailtemplate", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="integrationapps", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="integrationapps", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="jobposition", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="jobposition", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="jobposition", + name="department_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="job_position", + to="base.department", + verbose_name="Department", + ), + ), + migrations.AddField( + model_name="jobposition", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="announcement", + name="job_position", + field=models.ManyToManyField( + blank=True, to="base.jobposition", verbose_name="Job Position" + ), + ), + migrations.AddField( + model_name="jobrole", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="jobrole", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="jobrole", + name="job_position_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="base.jobposition", + verbose_name="Job Position", + ), + ), + migrations.AddField( + model_name="jobrole", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="multipleapprovalcondition", + name="company_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + migrations.AddField( + model_name="multipleapprovalcondition", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="multipleapprovalcondition", + name="department", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="base.department" + ), + ), + migrations.AddField( + model_name="multipleapprovalcondition", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="multipleapprovalmanagers", + name="condition_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="base.multipleapprovalcondition", + ), + ), + migrations.AddField( + model_name="notificationsound", + name="employee", + field=models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="notification_sound", + to="employee.employee", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="employee_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="penalty_accounts", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="late_early_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="attendance.attendancelatecomeearlyout", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="leave_request_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="leave.leaverequest", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="leave_type_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + migrations.AddField( + model_name="penaltyaccounts", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="rotatingshift", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="rotatingshift", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="rotatingshift", + name="shift1", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="shift1", + to="base.employeeshift", + verbose_name="Shift 1", + ), + ), + migrations.AddField( + model_name="rotatingshift", + name="shift2", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="shift2", + to="base.employeeshift", + verbose_name="Shift 2", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="rotating_shift_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.rotatingshift", + verbose_name="Rotating Shift", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="current_shift", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="current_shift", + to="base.employeeshift", + verbose_name="Current Shift", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="next_shift", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="next_shift", + to="base.employeeshift", + verbose_name="Next Shift", + ), + ), + migrations.AddField( + model_name="rotatingshiftassign", + name="rotating_shift_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="base.rotatingshift", + verbose_name="Rotating Shift", + ), + ), + migrations.AddField( + model_name="rotatingshift", + name="employee_id", + field=models.ManyToManyField( + through="base.RotatingShiftAssign", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalrotatingshiftassign", + name="history_relation", + field=models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="base.rotatingshiftassign", + ), + ), + migrations.AddField( + model_name="rotatingworktype", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="rotatingworktype", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="rotating_work_type_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.rotatingworktype", + verbose_name="Rotating Work Type", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="employee_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="rotating_work_type_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="base.rotatingworktype", + verbose_name="Rotating Work Type", + ), + ), + migrations.AddField( + model_name="rotatingworktype", + name="employee_id", + field=models.ManyToManyField( + through="base.RotatingWorkTypeAssign", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="history_relation", + field=models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="base.rotatingworktypeassign", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="employee_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="shift_request", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="previous_shift_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="previous_shift", + to="base.employeeshift", + verbose_name="Previous Shift", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="reallocate_to", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="reallocate_shift_request", + to="employee.employee", + verbose_name="Reallocate Employee", + ), + ), + migrations.AddField( + model_name="shiftrequest", + name="shift_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="requested_shift", + to="base.employeeshift", + verbose_name="Requesting Shift", + ), + ), + migrations.AddField( + model_name="historicalshiftrequest", + name="history_relation", + field=models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="base.shiftrequest", + ), + ), + migrations.AddField( + model_name="shiftrequestcomment", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="shiftrequestcomment", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="employee.employee" + ), + ), + migrations.AddField( + model_name="shiftrequestcomment", + name="files", + field=models.ManyToManyField(blank=True, to="base.baserequestfile"), + ), + migrations.AddField( + model_name="shiftrequestcomment", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="shiftrequestcomment", + name="request_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="base.shiftrequest" + ), + ), + migrations.AddField( + model_name="tags", + name="company_id", + field=models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + migrations.AddField( + model_name="tags", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="tags", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="tracklatecomeearlyout", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="tracklatecomeearlyout", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="worktype", + name="company_id", + field=models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + migrations.AddField( + model_name="worktype", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="worktype", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="current_work_type", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="current_work_type", + to="base.worktype", + verbose_name="Current Work Type", + ), + ), + migrations.AddField( + model_name="rotatingworktypeassign", + name="next_work_type", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="next_work_type", + to="base.worktype", + verbose_name="Next Work Type", + ), + ), + migrations.AddField( + model_name="rotatingworktype", + name="work_type1", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="work_type1", + to="base.worktype", + verbose_name="Work Type 1", + ), + ), + migrations.AddField( + model_name="rotatingworktype", + name="work_type2", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="work_type2", + to="base.worktype", + verbose_name="Work Type 2", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="previous_work_type_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Previous Work Type", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="work_type_id", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Requesting Work Type", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="current_work_type", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Current Work Type", + ), + ), + migrations.AddField( + model_name="historicalrotatingworktypeassign", + name="next_work_type", + field=models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Next Work Type", + ), + ), + migrations.AddField( + model_name="worktyperequest", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="worktyperequest", + name="employee_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="work_type_request", + to="employee.employee", + verbose_name="Employee", + ), + ), + migrations.AddField( + model_name="worktyperequest", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="worktyperequest", + name="previous_work_type_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="previous_work_type", + to="base.worktype", + verbose_name="Previous Work Type", + ), + ), + migrations.AddField( + model_name="worktyperequest", + name="work_type_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="requested_work_type", + to="base.worktype", + verbose_name="Requesting Work Type", + ), + ), + migrations.AddField( + model_name="historicalworktyperequest", + name="history_relation", + field=models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="base.worktyperequest", + ), + ), + migrations.AddField( + model_name="worktyperequestcomment", + name="created_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + migrations.AddField( + model_name="worktyperequestcomment", + name="employee_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="employee.employee" + ), + ), + migrations.AddField( + model_name="worktyperequestcomment", + name="files", + field=models.ManyToManyField(blank=True, to="base.baserequestfile"), + ), + migrations.AddField( + model_name="worktyperequestcomment", + name="modified_by", + field=models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + migrations.AddField( + model_name="worktyperequestcomment", + name="request_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="base.worktyperequest" + ), + ), + migrations.AlterUniqueTogether( + name="company", + unique_together={("company", "address")}, + ), + migrations.AlterUniqueTogether( + name="companyleaves", + unique_together={("based_on_week", "based_on_week_day")}, + ), + migrations.AlterUniqueTogether( + name="employeeshiftschedule", + unique_together={("shift_id", "day")}, + ), + migrations.AlterUniqueTogether( + name="jobrole", + unique_together={("job_position_id", "job_role")}, + ), + ] diff --git a/biometric/migrations/0001_initial.py b/biometric/migrations/0001_initial.py new file mode 100644 index 000000000..2780e84ba --- /dev/null +++ b/biometric/migrations/0001_initial.py @@ -0,0 +1,277 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import biometric.models +import django.core.validators +import django.db.models.deletion +import uuid +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0002_initial"), + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="BiometricDevices", + fields=[ + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("name", models.CharField(max_length=100, verbose_name="Name")), + ( + "machine_type", + models.CharField( + choices=[ + ("zk", "ZKTeco / eSSL Biometric"), + ("anviz", "Anviz Biometric"), + ("cosec", "Matrix COSEC Biometric"), + ("dahua", "Dahua Biometric"), + ("etimeoffice", "e-Time Office"), + ], + max_length=18, + null=True, + verbose_name="Device Type", + ), + ), + ( + "machine_ip", + models.CharField( + blank=True, + default="", + max_length=150, + null=True, + verbose_name="Machine IP", + ), + ), + ( + "port", + models.IntegerField(blank=True, null=True, verbose_name="Port No"), + ), + ( + "zk_password", + models.CharField( + blank=True, + default="0", + max_length=100, + null=True, + verbose_name="Password", + ), + ), + ( + "bio_username", + models.CharField( + blank=True, + default="", + max_length=100, + null=True, + verbose_name="Username", + ), + ), + ( + "bio_password", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="Password" + ), + ), + ( + "anviz_request_id", + models.CharField( + blank=True, max_length=200, null=True, verbose_name="Request ID" + ), + ), + ( + "api_url", + models.CharField( + blank=True, max_length=200, null=True, verbose_name="API Url" + ), + ), + ( + "api_key", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="API Key" + ), + ), + ( + "api_secret", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="API Secret" + ), + ), + ("api_token", models.CharField(blank=True, max_length=500, null=True)), + ( + "api_expires", + models.CharField(blank=True, max_length=100, null=True), + ), + ("is_live", models.BooleanField(default=False, verbose_name="Is Live")), + ( + "is_scheduler", + models.BooleanField(default=False, verbose_name="Is Scheduled"), + ), + ( + "scheduler_duration", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[biometric.models.validate_schedule_time_format], + ), + ), + ("last_fetch_date", models.DateField(blank=True, null=True)), + ("last_fetch_time", models.TimeField(blank=True, null=True)), + ( + "device_direction", + models.CharField( + choices=[ + ("in", "In Device"), + ("out", "Out Device"), + ("alternate", "Alternate In/Out Device"), + ("system", "System Direction(In/Out) Device"), + ], + default="system", + max_length=50, + verbose_name="Device Direction", + ), + ), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Biometric Device", + "verbose_name_plural": "Biometric Devices", + }, + ), + migrations.CreateModel( + name="BiometricEmployees", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("uid", models.IntegerField(blank=True, null=True)), + ( + "ref_user_id", + models.IntegerField( + blank=True, + null=True, + validators=[django.core.validators.MaxValueValidator(99999999)], + ), + ), + ("user_id", models.CharField(max_length=100, verbose_name="User ID")), + ( + "dahua_card_no", + models.CharField(blank=True, max_length=100, null=True), + ), + ( + "device_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="biometric.biometricdevices", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ], + options={ + "verbose_name": "Employee in Biometric Device", + "verbose_name_plural": "Employees in Biometric Device", + }, + ), + migrations.CreateModel( + name="COSECAttendanceArguments", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ( + "last_fetch_roll_ovr_count", + models.CharField(max_length=100, null=True), + ), + ("last_fetch_seq_number", models.CharField(max_length=100, null=True)), + ( + "device_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="biometric.biometricdevices", + ), + ), + ], + options={ + "verbose_name": "COSEC Attendance Arguments", + "verbose_name_plural": "COSEC Attendance Arguments", + }, + ), + ] diff --git a/employee/migrations/0001_initial.py b/employee/migrations/0001_initial.py new file mode 100644 index 000000000..e26ac4ee2 --- /dev/null +++ b/employee/migrations/0001_initial.py @@ -0,0 +1,1385 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import base.models +import django.db.models.deletion +import horilla.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Actiontype", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ( + "action_type", + models.CharField( + choices=[ + ("warning", "Warning"), + ("suspension", "Suspension"), + ("dismissal", "Dismissal"), + ], + max_length=30, + ), + ), + ( + "block_option", + models.BooleanField( + default=False, + help_text="If is enabled, employees log in will be blocked based on period of suspension or dismissal.", + verbose_name="Enable login block :", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Action Type", + "verbose_name_plural": "Action Types", + }, + ), + migrations.CreateModel( + name="Employee", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("badge_id", models.CharField(blank=True, max_length=50, null=True)), + ( + "employee_first_name", + models.CharField(max_length=200, verbose_name="First Name"), + ), + ( + "employee_last_name", + models.CharField( + blank=True, max_length=200, null=True, verbose_name="Last Name" + ), + ), + ( + "employee_profile", + models.ImageField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ("email", models.EmailField(max_length=254, unique=True)), + ("phone", models.CharField(max_length=25)), + ("address", models.TextField(blank=True, max_length=200, null=True)), + ("country", models.CharField(blank=True, max_length=100, null=True)), + ("state", models.CharField(blank=True, max_length=100, null=True)), + ("city", models.CharField(blank=True, max_length=30, null=True)), + ("zip", models.CharField(blank=True, max_length=20, null=True)), + ("dob", models.DateField(blank=True, null=True)), + ( + "gender", + models.CharField( + choices=[ + ("male", "Male"), + ("female", "Female"), + ("other", "Other"), + ], + default="male", + max_length=10, + null=True, + ), + ), + ( + "qualification", + models.CharField(blank=True, max_length=50, null=True), + ), + ("experience", models.IntegerField(blank=True, null=True)), + ( + "marital_status", + models.CharField( + blank=True, + choices=[ + ("single", "Single"), + ("married", "Married"), + ("divorced", "Divorced"), + ], + default="single", + max_length=50, + null=True, + ), + ), + ("children", models.IntegerField(blank=True, null=True)), + ( + "emergency_contact", + models.CharField(blank=True, max_length=15, null=True), + ), + ( + "emergency_contact_name", + models.CharField(blank=True, max_length=20, null=True), + ), + ( + "emergency_contact_relation", + models.CharField(blank=True, max_length=20, null=True), + ), + ("is_active", models.BooleanField(default=True)), + ("additional_info", models.JSONField(blank=True, null=True)), + ( + "is_from_onboarding", + models.BooleanField( + blank=True, default=False, editable=False, null=True + ), + ), + ( + "is_directly_converted", + models.BooleanField( + blank=True, default=False, editable=False, null=True + ), + ), + ( + "employee_user_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="employee_get", + to=settings.AUTH_USER_MODEL, + verbose_name="User", + ), + ), + ], + options={ + "ordering": ["employee_first_name"], + "permissions": ( + ("change_ownprofile", "Update own profile"), + ("view_ownprofile", "View Own Profile"), + ), + }, + ), + migrations.CreateModel( + name="DisciplinaryAction", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("description", models.TextField(max_length=255)), + ( + "unit_in", + models.CharField( + choices=[("days", "Days"), ("hours", "Hours")], + default="days", + max_length=10, + ), + ), + ("days", models.IntegerField(default=1, null=True)), + ( + "hours", + models.CharField( + default="00:00", + max_length=6, + null=True, + validators=[base.models.validate_time_format], + ), + ), + ("start_date", models.DateField(null=True)), + ( + "attachment", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ( + "action", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.actiontype", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + to="employee.employee", verbose_name="Employees" + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="BonusPoint", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "points", + models.IntegerField( + default=0, help_text="Use negative numbers to reduce points." + ), + ), + ( + "encashment_condition", + models.CharField( + blank=True, + choices=[ + ("==", "equals"), + (">", "grater than"), + ("<", "less than"), + (">=", "greater than or equal"), + ("<=", "less than or equal"), + ], + max_length=100, + null=True, + ), + ), + ("redeeming_points", models.IntegerField(blank=True, null=True)), + ("reason", models.TextField(blank=True, max_length=255, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "employee_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="bonus_point", + to="employee.employee", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeBankDetails", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("bank_name", models.CharField(max_length=50, null=True)), + ("account_number", models.CharField(max_length=50, null=True)), + ("branch", models.CharField(max_length=50, null=True)), + ("address", models.TextField(max_length=255, null=True)), + ("country", models.CharField(blank=True, max_length=50, null=True)), + ("state", models.CharField(blank=True, max_length=50, null=True)), + ("city", models.CharField(blank=True, max_length=50, null=True)), + ( + "any_other_code1", + models.CharField( + max_length=50, null=True, verbose_name="Bank Code #1" + ), + ), + ( + "any_other_code2", + models.CharField( + blank=True, + max_length=50, + null=True, + verbose_name="Bank Code #2", + ), + ), + ("additional_info", models.JSONField(blank=True, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.OneToOneField( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="employee_bank_details", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Employee Bank Details", + "verbose_name_plural": "Employee Bank Details", + }, + ), + migrations.CreateModel( + name="EmployeeGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("badge_id_prefix", models.CharField(default="PEP", max_length=5)), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeTag", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField(max_length=50, null=True, verbose_name="Title"), + ), + ("color", models.CharField(max_length=30, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeWorkInformation", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "location", + models.CharField( + blank=True, + max_length=50, + null=True, + verbose_name="Work Location", + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, null=True, verbose_name="Work Email" + ), + ), + ( + "mobile", + models.CharField( + blank=True, max_length=254, null=True, verbose_name="Work Phone" + ), + ), + ( + "date_joining", + models.DateField( + blank=True, null=True, verbose_name="Joining Date" + ), + ), + ( + "contract_end_date", + models.DateField( + blank=True, null=True, verbose_name="Contract End Date" + ), + ), + ( + "basic_salary", + models.IntegerField( + blank=True, default=0, null=True, verbose_name="Basic Salary" + ), + ), + ( + "salary_hour", + models.IntegerField( + blank=True, default=0, null=True, verbose_name="Salary Per Hour" + ), + ), + ("additional_info", models.JSONField(blank=True, null=True)), + ("experience", models.FloatField(blank=True, default=0, null=True)), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + ( + "department_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.department", + verbose_name="Department", + ), + ), + ( + "employee_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="employee_work_info", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "employee_type_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.employeetype", + verbose_name="Employee Type", + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "job_role_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.jobrole", + verbose_name="Job Role", + ), + ), + ( + "reporting_manager_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="reporting_manager", + to="employee.employee", + verbose_name="Reporting Manager", + ), + ), + ( + "shift_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + to="base.employeeshift", + verbose_name="Shift", + ), + ), + ( + "tags", + models.ManyToManyField( + blank=True, + to="employee.employeetag", + verbose_name="Employee tag", + ), + ), + ( + "work_type_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.worktype", + verbose_name="Work Type", + ), + ), + ], + ), + migrations.CreateModel( + name="HistoricalBonusPoint", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "points", + models.IntegerField( + default=0, help_text="Use negative numbers to reduce points." + ), + ), + ( + "encashment_condition", + models.CharField( + blank=True, + choices=[ + ("==", "equals"), + (">", "grater than"), + ("<", "less than"), + (">=", "greater than or equal"), + ("<=", "less than or equal"), + ], + max_length=100, + null=True, + ), + ), + ("redeeming_points", models.IntegerField(blank=True, null=True)), + ("reason", models.TextField(blank=True, max_length=255, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="employee.bonuspoint", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "historical bonus point", + "verbose_name_plural": "historical bonus points", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalEmployeeWorkInformation", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "location", + models.CharField( + blank=True, + max_length=50, + null=True, + verbose_name="Work Location", + ), + ), + ( + "email", + models.EmailField( + blank=True, max_length=254, null=True, verbose_name="Work Email" + ), + ), + ( + "mobile", + models.CharField( + blank=True, max_length=254, null=True, verbose_name="Work Phone" + ), + ), + ( + "date_joining", + models.DateField( + blank=True, null=True, verbose_name="Joining Date" + ), + ), + ( + "contract_end_date", + models.DateField( + blank=True, null=True, verbose_name="Contract End Date" + ), + ), + ( + "basic_salary", + models.IntegerField( + blank=True, default=0, null=True, verbose_name="Basic Salary" + ), + ), + ( + "salary_hour", + models.IntegerField( + blank=True, default=0, null=True, verbose_name="Salary Per Hour" + ), + ), + ("additional_info", models.JSONField(blank=True, null=True)), + ("experience", models.FloatField(blank=True, default=0, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.company", + verbose_name="Company", + ), + ), + ( + "department_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.department", + verbose_name="Department", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "employee_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeetype", + verbose_name="Employee Type", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="employee.employeeworkinformation", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "job_role_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.jobrole", + verbose_name="Job Role", + ), + ), + ( + "reporting_manager_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Reporting Manager", + ), + ), + ( + "shift_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Shift", + ), + ), + ( + "work_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Work Type", + ), + ), + ], + options={ + "verbose_name": "historical employee work information", + "verbose_name_plural": "historical employee work informations", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="NoteFiles", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "files", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeNote", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="employee_name", + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "updated_by", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "note_files", + models.ManyToManyField(blank=True, to="employee.notefiles"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="PolicyMultipleFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("attachment", models.FileField(upload_to=horilla.models.upload_path)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Policy", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ("body", models.TextField()), + ("is_visible_to_all", models.BooleanField(default=True)), + ( + "company_id", + models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "specific_employees", + models.ManyToManyField( + blank=True, editable=False, to="employee.employee" + ), + ), + ( + "attachments", + models.ManyToManyField( + blank=True, to="employee.policymultiplefile" + ), + ), + ], + options={ + "verbose_name": "Policy", + "verbose_name_plural": "Policies", + }, + ), + migrations.CreateModel( + name="ProfileEditFeature", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("is_enabled", models.BooleanField(default=False)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AddConstraint( + model_name="employee", + constraint=models.UniqueConstraint( + condition=models.Q(("badge_id__isnull", False)), + fields=("badge_id",), + name="unique_badge_id", + ), + ), + migrations.AlterUniqueTogether( + name="employee", + unique_together={("employee_first_name", "employee_last_name", "email")}, + ), + ] diff --git a/facedetection/migrations/0001_initial.py b/facedetection/migrations/0001_initial.py new file mode 100644 index 000000000..a4a177c23 --- /dev/null +++ b/facedetection/migrations/0001_initial.py @@ -0,0 +1,73 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + ] + + operations = [ + migrations.CreateModel( + name="EmployeeFaceDetection", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("image", models.ImageField(upload_to="")), + ( + "employee_id", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="face_detection", + to="employee.employee", + ), + ), + ], + ), + migrations.CreateModel( + name="FaceDetection", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("start", models.BooleanField(default=False)), + ( + "company_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="face_detection", + to="base.company", + ), + ), + ], + options={ + "constraints": [ + models.UniqueConstraint( + condition=models.Q(("company_id", None), _negated=True), + fields=("company_id",), + name="unique_company_id_when_not_null_facedetection", + ) + ], + }, + ), + ] diff --git a/geofencing/migrations/0001_initial.py b/geofencing/migrations/0001_initial.py new file mode 100644 index 000000000..8ce2dc326 --- /dev/null +++ b/geofencing/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ] + + operations = [ + migrations.CreateModel( + name="GeoFencing", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("latitude", models.FloatField()), + ("longitude", models.FloatField()), + ("radius_in_meters", models.IntegerField()), + ("start", models.BooleanField(default=False)), + ( + "company_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="geo_fencing", + to="base.company", + ), + ), + ], + options={ + "constraints": [ + models.UniqueConstraint( + condition=models.Q(("company_id", None), _negated=True), + fields=("company_id",), + name="unique_company_id_when_not_null_geofencing", + ) + ], + }, + ), + ] diff --git a/helpdesk/migrations/0001_initial.py b/helpdesk/migrations/0001_initial.py new file mode 100644 index 000000000..fdcccb119 --- /dev/null +++ b/helpdesk/migrations/0001_initial.py @@ -0,0 +1,825 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import horilla.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="FAQCategory", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=30)), + ( + "description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "FAQ Category", + "verbose_name_plural": "FAQ Categories", + }, + ), + migrations.CreateModel( + name="FAQ", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("question", models.CharField(max_length=255)), + ("answer", models.TextField()), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ("tags", models.ManyToManyField(blank=True, to="base.tags")), + ( + "category", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="helpdesk.faqcategory", + ), + ), + ], + options={ + "verbose_name": "FAQ", + "verbose_name_plural": "FAQs", + }, + ), + migrations.CreateModel( + name="Ticket", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ("description", models.TextField(max_length=255)), + ( + "priority", + models.CharField( + choices=[ + ("low", "Low"), + ("medium", "Medium"), + ("high", "High"), + ], + default="low", + max_length=100, + ), + ), + ("created_date", models.DateField(auto_now_add=True)), + ("resolved_date", models.DateField(blank=True, null=True)), + ( + "assigning_type", + models.CharField( + choices=[ + ("department", "Department"), + ("job_position", "Job Position"), + ("individual", "Individual"), + ], + max_length=100, + verbose_name="Assigning Type", + ), + ), + ( + "raised_on", + models.CharField(max_length=100, verbose_name="Forward To"), + ), + ("deadline", models.DateField(blank=True, null=True)), + ( + "status", + models.CharField( + choices=[ + ("new", "New"), + ("in_progress", "In Progress"), + ("on_hold", "On Hold"), + ("resolved", "Resolved"), + ("canceled", "Canceled"), + ], + default="new", + max_length=50, + ), + ), + ( + "assigned_to", + models.ManyToManyField( + blank=True, + related_name="ticket_assigned_to", + to="employee.employee", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="ticket", + to="employee.employee", + verbose_name="Owner", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "tags", + models.ManyToManyField( + blank=True, related_name="ticket_tags", to="base.tags" + ), + ), + ], + options={ + "verbose_name": "Ticket", + "verbose_name_plural": "Tickets", + "ordering": ["-created_date"], + }, + ), + migrations.CreateModel( + name="Comment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("comment", models.TextField(blank=True, null=True)), + ("date", models.DateTimeField(auto_now_add=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="employee_comment", + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "ticket", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="comment", + to="helpdesk.ticket", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Attachment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ( + "description", + models.CharField(blank=True, max_length=100, null=True), + ), + ("format", models.CharField(blank=True, max_length=50, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "comment", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="comment_attachment", + to="helpdesk.comment", + ), + ), + ( + "ticket", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="ticket_attachment", + to="helpdesk.ticket", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="TicketType", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField(max_length=100, unique=True, verbose_name="Title"), + ), + ( + "type", + models.CharField( + choices=[ + ("suggestion", "Suggestion"), + ("complaint", "Complaint"), + ("service_request", "Service Request"), + ("meeting_request", "Meeting Request"), + ("anounymous_complaint", "Anonymous Complaint"), + ("others", "Others"), + ], + max_length=50, + verbose_name="Type", + ), + ), + ( + "prefix", + models.CharField(max_length=3, unique=True, verbose_name="Prefix"), + ), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Ticket Type", + "verbose_name_plural": "Ticket Types", + }, + ), + migrations.AddField( + model_name="ticket", + name="ticket_type", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="helpdesk.tickettype", + verbose_name="Ticket Type", + ), + ), + migrations.CreateModel( + name="HistoricalTicket", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("title", models.CharField(max_length=50)), + ("description", models.TextField(max_length=255)), + ( + "priority", + models.CharField( + choices=[ + ("low", "Low"), + ("medium", "Medium"), + ("high", "High"), + ], + default="low", + max_length=100, + ), + ), + ("created_date", models.DateField(blank=True, editable=False)), + ("resolved_date", models.DateField(blank=True, null=True)), + ( + "assigning_type", + models.CharField( + choices=[ + ("department", "Department"), + ("job_position", "Job Position"), + ("individual", "Individual"), + ], + max_length=100, + verbose_name="Assigning Type", + ), + ), + ( + "raised_on", + models.CharField(max_length=100, verbose_name="Forward To"), + ), + ("deadline", models.DateField(blank=True, null=True)), + ( + "status", + models.CharField( + choices=[ + ("new", "New"), + ("in_progress", "In Progress"), + ("on_hold", "On Hold"), + ("resolved", "Resolved"), + ("canceled", "Canceled"), + ], + default="new", + max_length=50, + ), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Owner", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="helpdesk.ticket", + ), + ), + ( + "ticket_type", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="helpdesk.tickettype", + verbose_name="Ticket Type", + ), + ), + ], + options={ + "verbose_name": "historical Ticket", + "verbose_name_plural": "historical Tickets", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="DepartmentManager", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "department", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="dept_manager", + to="base.department", + verbose_name="Department", + ), + ), + ( + "manager", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="dep_manager", + to="employee.employee", + verbose_name="Manager", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Department Manager", + "verbose_name_plural": "Department Managers", + "unique_together": {("department", "manager")}, + }, + ), + migrations.CreateModel( + name="ClaimRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("is_approved", models.BooleanField(default=False)), + ("is_rejected", models.BooleanField(default=False)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "ticket_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="helpdesk.ticket", + ), + ), + ], + options={ + "unique_together": {("ticket_id", "employee_id")}, + }, + ), + ] diff --git a/horilla_audit/migrations/0001_initial.py b/horilla_audit/migrations/0001_initial.py new file mode 100644 index 000000000..ee1c4590a --- /dev/null +++ b/horilla_audit/migrations/0001_initial.py @@ -0,0 +1,141 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="AuditTag", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("title", models.CharField(max_length=20)), + ("highlight", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name="AccountBlockUnblock", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "is_enabled", + models.BooleanField(blank=True, default=False, null=True), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="HistoryTrackingFields", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "tracking_fields", + models.JSONField(blank=True, editable=False, null=True), + ), + ("work_info_track", models.BooleanField(default=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/horilla_automations/migrations/0001_initial.py b/horilla_automations/migrations/0001_initial.py new file mode 100644 index 000000000..aafac3902 --- /dev/null +++ b/horilla_automations/migrations/0001_initial.py @@ -0,0 +1,130 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="MailAutomation", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=256, unique=True)), + ("method_title", models.CharField(editable=False, max_length=100)), + ("model", models.CharField(choices=[], max_length=100)), + ("mail_to", models.TextField(verbose_name="Mail to/Notify to")), + ( + "mail_details", + models.CharField( + help_text="Fill mail template details(reciever/instance, `self` will be the person who trigger the automation)", + max_length=250, + ), + ), + ("mail_detail_choice", models.TextField(default="", editable=False)), + ( + "trigger", + models.CharField( + choices=[ + ("on_create", "On Create"), + ("on_update", "On Update"), + ("on_delete", "On Delete"), + ], + max_length=10, + ), + ), + ( + "delivery_channel", + models.CharField( + choices=[ + ("email", "Send as Email"), + ("notification", "Send as Notification"), + ("both", "Send as Email and Notification"), + ], + default="email", + max_length=50, + verbose_name="Choose Delivary Channel", + ), + ), + ("condition_html", models.TextField(editable=False, null=True)), + ("condition_querystring", models.TextField(editable=False, null=True)), + ("condition", models.TextField()), + ( + "also_sent_to", + models.ManyToManyField( + blank=True, to="employee.employee", verbose_name="Also Send to" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "mail_template", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.horillamailtemplate", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "template_attachments", + models.ManyToManyField( + blank=True, + related_name="template_attachment", + to="base.horillamailtemplate", + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/horilla_backup/migrations/0001_initial.py b/horilla_backup/migrations/0001_initial.py new file mode 100644 index 000000000..6d4f94eb6 --- /dev/null +++ b/horilla_backup/migrations/0001_initial.py @@ -0,0 +1,79 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="GoogleDriveBackup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "service_account_file", + models.FileField( + help_text="Make sure your file is in JSON format and contains your Google Service Account credentials", + upload_to="gdrive_service_account_file", + verbose_name="Service Account File", + ), + ), + ( + "gdrive_folder_id", + models.CharField( + help_text="Shared Gdrive folder Id with access granted to Gmail service account. Enable full permissions for seamless connection.", + max_length=255, + verbose_name="Gdrive Folder ID", + ), + ), + ("backup_media", models.BooleanField(blank=True, null=True)), + ("backup_db", models.BooleanField(blank=True, null=True)), + ("interval", models.BooleanField(blank=True, null=True)), + ("fixed", models.BooleanField(blank=True, null=True)), + ("seconds", models.IntegerField(blank=True, null=True)), + ("hour", models.IntegerField(blank=True, null=True)), + ("minute", models.IntegerField(blank=True, null=True)), + ("active", models.BooleanField(default=False)), + ], + ), + migrations.CreateModel( + name="LocalBackup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "backup_path", + models.CharField( + help_text="Specify the path in the server were the backup files should keep", + max_length=255, + ), + ), + ("backup_media", models.BooleanField(blank=True, null=True)), + ("backup_db", models.BooleanField(blank=True, null=True)), + ("interval", models.BooleanField(blank=True, null=True)), + ("fixed", models.BooleanField(blank=True, null=True)), + ("seconds", models.IntegerField(blank=True, null=True)), + ("hour", models.IntegerField(blank=True, null=True)), + ("minute", models.IntegerField(blank=True, null=True)), + ("active", models.BooleanField(default=False)), + ], + ), + ] diff --git a/horilla_documents/migrations/0001_initial.py b/horilla_documents/migrations/0001_initial.py new file mode 100644 index 000000000..ef91cb400 --- /dev/null +++ b/horilla_documents/migrations/0001_initial.py @@ -0,0 +1,219 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import horilla.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="DocumentRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100, verbose_name="Title")), + ( + "format", + models.CharField( + choices=[ + ("any", "Any"), + ("pdf", "PDF"), + ("txt", "TXT"), + ("docx", "DOCX"), + ("xlsx", "XLSX"), + ("jpg", "JPG"), + ("png", "PNG"), + ("jpeg", "JPEG"), + ], + max_length=10, + verbose_name="Format", + ), + ), + ( + "max_size", + models.IntegerField( + blank=True, null=True, verbose_name="Max size (In MB)" + ), + ), + ( + "description", + models.TextField(blank=True, null=True, verbose_name="Description"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + to="employee.employee", verbose_name="Employees" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Document Request", + "verbose_name_plural": "Document Requests", + }, + ), + migrations.CreateModel( + name="Document", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=250)), + ( + "document", + models.FileField( + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Document", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=10, + verbose_name="Status", + ), + ), + ( + "reject_reason", + models.TextField( + blank=True, + max_length=255, + null=True, + verbose_name="Reject Reason", + ), + ), + ( + "issue_date", + models.DateField(blank=True, null=True, verbose_name="Issue Date"), + ), + ( + "expiry_date", + models.DateField(blank=True, null=True, verbose_name="Expiry Date"), + ), + ( + "notify_before", + models.IntegerField( + default=1, null=True, verbose_name="Notify Before" + ), + ), + ( + "is_digital_asset", + models.BooleanField(default=False, verbose_name="Is Digital Asset"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "document_request_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="horilla_documents.documentrequest", + ), + ), + ], + options={ + "verbose_name": "Document", + "verbose_name_plural": "Documents", + }, + ), + ] diff --git a/horilla_meet/migrations/0001_initial.py b/horilla_meet/migrations/0001_initial.py new file mode 100644 index 000000000..e02687800 --- /dev/null +++ b/horilla_meet/migrations/0001_initial.py @@ -0,0 +1,263 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import horilla.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0002_initial"), + ("employee", "0001_initial"), + ("pms", "0001_initial"), + ("recruitment", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="GoogleCredential", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("token", models.TextField()), + ("refresh_token", models.TextField()), + ("token_uri", models.CharField(max_length=255)), + ("client_id", models.CharField(max_length=255)), + ("client_secret", models.CharField(max_length=255)), + ("scopes", models.TextField()), + ("expires_at", models.DateTimeField()), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="google_credential", + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + bases=(models.Model, horilla.models.NoPermissionModel), + ), + migrations.CreateModel( + name="GoogleMeeting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=200)), + ("description", models.TextField()), + ("start_time", models.DateTimeField()), + ("meet_url", models.URLField()), + ("event_id", models.CharField(max_length=255, null=True)), + ( + "duration", + models.PositiveIntegerField( + default=60, help_text="Duration in minutes" + ), + ), + ("attendees", models.JSONField(blank=True, default=list, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="meetings", + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-start_time"], + }, + ), + migrations.CreateModel( + name="InterviewMeetingLink", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "interview", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="google_interviews", + to="recruitment.interviewschedule", + ), + ), + ( + "meeting", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to="horilla_meet.googlemeeting", + ), + ), + ], + bases=(models.Model, horilla.models.NoPermissionModel), + ), + migrations.CreateModel( + name="PmsMeetingLink", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "google_meeting", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to="horilla_meet.googlemeeting", + ), + ), + ( + "meeting", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + related_name="google_meeting", + to="pms.meetings", + ), + ), + ], + bases=(models.Model, horilla.models.NoPermissionModel), + ), + migrations.CreateModel( + name="GoogleCloudCredential", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("project_id", models.CharField(blank=True, max_length=255, null=True)), + ("client_id", models.CharField(max_length=255)), + ("client_secret", models.CharField(max_length=255)), + ("redirect_uris", models.TextField(help_text="Comma separated URIs")), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + ], + options={ + "verbose_name": "Google Cloud Credential", + "verbose_name_plural": "Google Cloud Credentials", + "unique_together": {("project_id", "company_id")}, + }, + ), + migrations.AddIndex( + model_name="googlemeeting", + index=models.Index( + fields=["employee_id", "start_time"], + name="horilla_mee_employe_32e027_idx", + ), + ), + migrations.AddIndex( + model_name="googlemeeting", + index=models.Index( + fields=["event_id"], name="horilla_mee_event_i_4a80d4_idx" + ), + ), + ] diff --git a/horilla_views/migrations/0001_initial.py b/horilla_views/migrations/0001_initial.py new file mode 100644 index 000000000..5bb25033c --- /dev/null +++ b/horilla_views/migrations/0001_initial.py @@ -0,0 +1,291 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="ActiveGroup", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("path", models.CharField(max_length=256)), + ("group_target", models.CharField(max_length=256)), + ("group_by_field", models.CharField(max_length=256)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="ActiveTab", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("path", models.CharField(max_length=256)), + ("tab_target", models.CharField(max_length=256)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="ActiveView", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("path", models.CharField(max_length=256)), + ("type", models.CharField(max_length=50)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SavedFilter", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=20, null=True)), + ("color", models.CharField(default="", max_length=10)), + ("is_default", models.BooleanField(default=False)), + ("filter", models.TextField()), + ("urlencode", models.TextField(default="")), + ("path", models.CharField(max_length=256)), + ("referrer", models.CharField(default="", max_length=256)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="ToggleColumn", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("path", models.CharField(max_length=256)), + ("excluded_columns", models.JSONField(default=list)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "user_id", + models.ForeignKey( + editable=False, + on_delete=django.db.models.deletion.CASCADE, + related_name="user_excluded_column", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + ), + ] diff --git a/leave/migrations/0001_initial.py b/leave/migrations/0001_initial.py new file mode 100644 index 000000000..9d996c918 --- /dev/null +++ b/leave/migrations/0001_initial.py @@ -0,0 +1,2002 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import django.utils.timezone +import horilla.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("attendance", "0001_initial"), + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="LeaveRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "start_date_breakdown", + models.CharField( + choices=[ + ("full_day", "Full Day"), + ("first_half", "First Half"), + ("second_half", "Second Half"), + ], + default="full_day", + max_length=30, + verbose_name="Start Date Breakdown", + ), + ), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "end_date_breakdown", + models.CharField( + choices=[ + ("full_day", "Full Day"), + ("first_half", "First Half"), + ("second_half", "Second Half"), + ], + default="full_day", + max_length=30, + verbose_name="End Date Breakdown", + ), + ), + ( + "requested_days", + models.FloatField( + blank=True, null=True, verbose_name="Requested Days" + ), + ), + ( + "leave_clashes_count", + models.IntegerField(default=0, verbose_name="Leave Clashes Count"), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "attachment", + models.FileField( + blank=True, + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Attachment", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("cancelled", "Cancelled"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + verbose_name="Status", + ), + ), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Created Date" + ), + ), + ("approved_available_days", models.FloatField(default=0)), + ("approved_carryforward_days", models.FloatField(default=0)), + ( + "reject_reason", + models.TextField( + blank=True, max_length=255, verbose_name="Reject Reason" + ), + ), + ( + "created_by", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="leave_request_created", + to="employee.employee", + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Leave Request", + "verbose_name_plural": "Leave Requests", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="LeaverequestFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ], + ), + migrations.CreateModel( + name="AvailableLeave", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "available_days", + models.FloatField(default=0, verbose_name="Available Days"), + ), + ( + "carryforward_days", + models.FloatField(default=0, verbose_name="Carryforward Days"), + ), + ( + "total_leave_days", + models.FloatField(default=0, verbose_name="Total Leave Days"), + ), + ( + "assigned_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Assigned Date" + ), + ), + ( + "reset_date", + models.DateField( + blank=True, null=True, verbose_name="Leave Reset Date" + ), + ), + ( + "expired_date", + models.DateField( + blank=True, null=True, verbose_name="CarryForward Expired Date" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="available_leave", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + ), + migrations.CreateModel( + name="CompensatoryLeaveRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("requested_days", models.FloatField(blank=True, null=True)), + ("requested_date", models.DateField(default=django.utils.timezone.now)), + ("description", models.TextField(max_length=255)), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + ), + ), + ("reject_reason", models.TextField(blank=True, max_length=255)), + ( + "attendance_id", + models.ManyToManyField( + to="attendance.attendance", verbose_name="Attendance" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="EmployeePastLeaveRestrict", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("enabled", models.BooleanField(default=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Holiday", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("name", models.CharField(max_length=30, verbose_name="Name")), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "recurring", + models.BooleanField(default=False, verbose_name="Recurring"), + ), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="LeaveAllocationRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "requested_days", + models.FloatField( + blank=True, null=True, verbose_name="Requested days" + ), + ), + ("requested_date", models.DateField(default=django.utils.timezone.now)), + ( + "attachment", + models.FileField( + blank=True, + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Attachment", + ), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + ), + ), + ("reject_reason", models.TextField(blank=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Leave Allocation Request", + "verbose_name_plural": "Leave Allocation Requests", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="LeaveGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("compensatory_leave", models.BooleanField(default=True)), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OverrideLeaveRequests", + fields=[ + ( + "leaverequest_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="leave.leaverequest", + ), + ), + ], + options={ + "abstract": False, + }, + bases=("leave.leaverequest",), + ), + migrations.CreateModel( + name="LeaveRequestConditionApproval", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("sequence", models.IntegerField()), + ("is_approved", models.BooleanField(default=False)), + ("is_rejected", models.BooleanField(default=False)), + ( + "leave_request_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="leave.leaverequest", + ), + ), + ( + "manager_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ], + ), + migrations.CreateModel( + name="LeaverequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "request_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="leave.leaverequest", + ), + ), + ( + "files", + models.ManyToManyField(blank=True, to="leave.leaverequestfile"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="LeaveallocationrequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "request_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="leave.leaveallocationrequest", + ), + ), + ( + "files", + models.ManyToManyField(blank=True, to="leave.leaverequestfile"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="CompensatoryLeaverequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "request_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="leave.compensatoryleaverequest", + ), + ), + ( + "files", + models.ManyToManyField(blank=True, to="leave.leaverequestfile"), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="LeaveType", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "icon", + models.ImageField( + blank=True, + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Icon", + ), + ), + ("name", models.CharField(max_length=30, verbose_name="Name")), + ( + "color", + models.CharField(max_length=30, null=True, verbose_name="Color"), + ), + ( + "payment", + models.CharField( + choices=[("paid", "Paid"), ("unpaid", "Unpaid")], + default="unpaid", + max_length=30, + verbose_name="Is Paid", + ), + ), + ("count", models.FloatField(default=1, null=True)), + ( + "period_in", + models.CharField( + choices=[("day", "Day"), ("month", "Month"), ("year", "Year")], + default="day", + max_length=30, + ), + ), + ( + "limit_leave", + models.BooleanField(default=True, verbose_name="Limit Leave Days"), + ), + ("total_days", models.FloatField(default=1, null=True)), + ("reset", models.BooleanField(default=False, verbose_name="Reset")), + ( + "is_encashable", + models.BooleanField(default=False, verbose_name="Is Encashable"), + ), + ( + "reset_based", + models.CharField( + blank=True, + choices=[ + ("yearly", "Yearly"), + ("monthly", "Monthly"), + ("weekly", "Weekly"), + ], + max_length=30, + null=True, + verbose_name="Reset Period", + ), + ), + ( + "reset_month", + models.CharField( + blank=True, + choices=[ + ("1", "Jan"), + ("2", "Feb"), + ("3", "Mar"), + ("4", "Apr"), + ("5", "May"), + ("6", "Jun"), + ("7", "Jul"), + ("8", "Aug"), + ("9", "Sep"), + ("10", "Oct"), + ("11", "Nov"), + ("12", "Dec"), + ], + max_length=30, + verbose_name="Reset Month", + ), + ), + ( + "reset_day", + models.CharField( + blank=True, + choices=[ + ("last day", "Last Day"), + ("1", "1st"), + ("2", "2nd"), + ("3", "3rd"), + ("4", "4th"), + ("5", "5th"), + ("6", "6th"), + ("7", "7th"), + ("8", "8th"), + ("9", "9th"), + ("10", "10th"), + ("11", "11th"), + ("12", "12th"), + ("13", "13th"), + ("14", "14th"), + ("15", "15th"), + ("16", "16th"), + ("17", "17th"), + ("18", "18th"), + ("19", "19th"), + ("20", "20th"), + ("21", "21th"), + ("22", "22th"), + ("23", "23th"), + ("24", "24th"), + ("25", "25th"), + ("26", "26th"), + ("27", "27th"), + ("28", "28th"), + ("29", "29th"), + ("30", "30th"), + ("31", "31th"), + ], + max_length=30, + null=True, + verbose_name="Reset Day", + ), + ), + ( + "reset_weekend", + models.CharField( + blank=True, + choices=[ + ("0", "Monday"), + ("1", "Tuesday"), + ("2", "Wednesday"), + ("3", "Thursday"), + ("4", "Friday"), + ("5", "Saturday"), + ("6", "Sunday"), + ], + max_length=10, + null=True, + verbose_name="Reset Weekday", + ), + ), + ( + "carryforward_type", + models.CharField( + choices=[ + ("no carryforward", "No Carry Forward"), + ("carryforward", "Carry Forward"), + ("carryforward expire", "Carry Forward with Expire"), + ], + default="no carryforward", + max_length=30, + verbose_name="Carryforward Type", + ), + ), + ( + "carryforward_max", + models.FloatField( + blank=True, null=True, verbose_name="Carryforward Max" + ), + ), + ( + "carryforward_expire_in", + models.IntegerField( + blank=True, null=True, verbose_name="Carryforward Expire In" + ), + ), + ( + "carryforward_expire_period", + models.CharField( + blank=True, + choices=[("day", "Day"), ("month", "Month"), ("year", "Year")], + max_length=30, + null=True, + verbose_name="Carryforward Expire Period", + ), + ), + ( + "carryforward_expire_date", + models.DateField( + blank=True, null=True, verbose_name="Carryforward Expire Date" + ), + ), + ( + "require_approval", + models.CharField( + blank=True, + choices=[("yes", "Yes"), ("no", "No")], + default="yes", + max_length=30, + null=True, + verbose_name="Require Approval", + ), + ), + ( + "require_attachment", + models.CharField( + blank=True, + choices=[("yes", "Yes"), ("no", "No")], + default="no", + max_length=30, + null=True, + verbose_name="Require Attachment", + ), + ), + ( + "exclude_company_leave", + models.CharField( + choices=[("yes", "Yes"), ("no", "No")], + default="no", + max_length=30, + verbose_name="Exclude Company Holidays", + ), + ), + ( + "exclude_holiday", + models.CharField( + choices=[("yes", "Yes"), ("no", "No")], + default="no", + max_length=30, + verbose_name="Exclude Holidays", + ), + ), + ("is_compensatory_leave", models.BooleanField(default=False)), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.AddField( + model_name="leaverequest", + name="leave_type_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="leave.leavetype", + verbose_name="Leave Type", + ), + ), + migrations.AddField( + model_name="leaveallocationrequest", + name="leave_type_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + migrations.CreateModel( + name="HistoricalLeaveRequest", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "start_date_breakdown", + models.CharField( + choices=[ + ("full_day", "Full Day"), + ("first_half", "First Half"), + ("second_half", "Second Half"), + ], + default="full_day", + max_length=30, + verbose_name="Start Date Breakdown", + ), + ), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "end_date_breakdown", + models.CharField( + choices=[ + ("full_day", "Full Day"), + ("first_half", "First Half"), + ("second_half", "Second Half"), + ], + default="full_day", + max_length=30, + verbose_name="End Date Breakdown", + ), + ), + ( + "requested_days", + models.FloatField( + blank=True, null=True, verbose_name="Requested Days" + ), + ), + ( + "leave_clashes_count", + models.IntegerField(default=0, verbose_name="Leave Clashes Count"), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "attachment", + models.TextField( + blank=True, max_length=100, null=True, verbose_name="Attachment" + ), + ), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("cancelled", "Cancelled"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + verbose_name="Status", + ), + ), + ( + "requested_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Created Date" + ), + ), + ("approved_available_days", models.FloatField(default=0)), + ("approved_carryforward_days", models.FloatField(default=0)), + ( + "reject_reason", + models.TextField( + blank=True, max_length=255, verbose_name="Reject Reason" + ), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="leave.leaverequest", + ), + ), + ( + "leave_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="leave.leavetype", + verbose_name="Leave Type", + ), + ), + ], + options={ + "verbose_name": "historical Leave Request", + "verbose_name_plural": "historical Leave Requests", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalLeaveAllocationRequest", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "requested_days", + models.FloatField( + blank=True, null=True, verbose_name="Requested days" + ), + ), + ("requested_date", models.DateField(default=django.utils.timezone.now)), + ( + "attachment", + models.TextField( + blank=True, max_length=100, null=True, verbose_name="Attachment" + ), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + ), + ), + ("reject_reason", models.TextField(blank=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="leave.leaveallocationrequest", + ), + ), + ( + "leave_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + ], + options={ + "verbose_name": "historical Leave Allocation Request", + "verbose_name_plural": "historical Leave Allocation Requests", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalCompensatoryLeaveRequest", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("requested_days", models.FloatField(blank=True, null=True)), + ("requested_date", models.DateField(default=django.utils.timezone.now)), + ("description", models.TextField(max_length=255)), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=30, + ), + ), + ("reject_reason", models.TextField(blank=True, max_length=255)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="leave.compensatoryleaverequest", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "leave_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + ], + options={ + "verbose_name": "historical compensatory leave request", + "verbose_name_plural": "historical compensatory leave requests", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalAvailableLeave", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "available_days", + models.FloatField(default=0, verbose_name="Available Days"), + ), + ( + "carryforward_days", + models.FloatField(default=0, verbose_name="Carryforward Days"), + ), + ( + "total_leave_days", + models.FloatField(default=0, verbose_name="Total Leave Days"), + ), + ( + "assigned_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Assigned Date" + ), + ), + ( + "reset_date", + models.DateField( + blank=True, null=True, verbose_name="Leave Reset Date" + ), + ), + ( + "expired_date", + models.DateField( + blank=True, null=True, verbose_name="CarryForward Expired Date" + ), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="leave.availableleave", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "leave_type_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + ], + options={ + "verbose_name": "historical available leave", + "verbose_name_plural": "historical available leaves", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="compensatoryleaverequest", + name="leave_type_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + migrations.AddField( + model_name="availableleave", + name="leave_type_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_available_leave", + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + migrations.CreateModel( + name="RestrictLeave", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=200, verbose_name="Title")), + ("start_date", models.DateField(verbose_name="Start Date")), + ("end_date", models.DateField(verbose_name="End Date")), + ( + "include_all", + models.BooleanField( + default=True, + help_text="Enable to select all Leave types.", + verbose_name="Include All", + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "department", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="base.department", + verbose_name="Department", + ), + ), + ( + "exclued_leave_types", + models.ManyToManyField( + blank=True, + help_text="Choose leave types to exclude from restriction.", + related_name="excluded_leave_type", + to="leave.leavetype", + verbose_name="Exclude Leave Types", + ), + ), + ( + "job_position", + models.ManyToManyField( + blank=True, + help_text="If no job positions are specifically selected, the system will consider all job positions under the selected department.", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "spesific_leave_types", + models.ManyToManyField( + blank=True, + help_text="Choose specific leave types to restrict.", + related_name="spesific_leave_type", + to="leave.leavetype", + verbose_name="Specific Leave Types", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="CompanyLeave", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "based_on_week", + models.CharField( + blank=True, + choices=[ + ("0", "First Week"), + ("1", "Second Week"), + ("2", "Third Week"), + ("3", "Fourth Week"), + ("4", "Fifth Week"), + ], + max_length=100, + null=True, + ), + ), + ( + "based_on_week_day", + models.CharField( + choices=[ + ("0", "Monday"), + ("1", "Tuesday"), + ("2", "Wednesday"), + ("3", "Thursday"), + ("4", "Friday"), + ("5", "Saturday"), + ("6", "Sunday"), + ], + max_length=100, + ), + ), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "unique_together": {("based_on_week", "based_on_week_day")}, + }, + ), + migrations.AlterUniqueTogether( + name="availableleave", + unique_together={("leave_type_id", "employee_id")}, + ), + ] diff --git a/notifications/migrations/0001_initial.py b/notifications/migrations/0001_initial.py new file mode 100644 index 000000000..5979c9f6f --- /dev/null +++ b/notifications/migrations/0001_initial.py @@ -0,0 +1,119 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import django.utils.timezone +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("contenttypes", "0002_remove_content_type_name"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Notification", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "level", + models.CharField( + choices=[ + ("success", "success"), + ("info", "info"), + ("warning", "warning"), + ("error", "error"), + ], + default="info", + max_length=20, + ), + ), + ("unread", models.BooleanField(db_index=True, default=True)), + ("actor_object_id", models.CharField(max_length=255)), + ("verb", models.CharField(max_length=255)), + ("description", models.TextField(blank=True, null=True)), + ( + "target_object_id", + models.CharField(blank=True, max_length=255, null=True), + ), + ( + "action_object_object_id", + models.CharField(blank=True, max_length=255, null=True), + ), + ( + "timestamp", + models.DateTimeField( + db_index=True, default=django.utils.timezone.now + ), + ), + ("public", models.BooleanField(db_index=True, default=True)), + ("deleted", models.BooleanField(db_index=True, default=False)), + ("emailed", models.BooleanField(db_index=True, default=False)), + ("data", models.JSONField(blank=True, null=True)), + ("verb_en", models.CharField(default="", max_length=255, null=True)), + ("verb_ar", models.CharField(default="", max_length=255, null=True)), + ("verb_de", models.CharField(default="", max_length=255, null=True)), + ("verb_es", models.CharField(default="", max_length=255, null=True)), + ("verb_fr", models.CharField(default="", max_length=255, null=True)), + ( + "action_object_content_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="notify_action_object", + to="contenttypes.contenttype", + ), + ), + ( + "actor_content_type", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notify_actor", + to="contenttypes.contenttype", + ), + ), + ( + "recipient", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notifications", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "target_content_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="notify_target", + to="contenttypes.contenttype", + ), + ), + ], + options={ + "ordering": ("-timestamp",), + "abstract": False, + "swappable": "NOTIFICATIONS_NOTIFICATION_MODEL", + "indexes": [ + models.Index( + fields=["recipient", "unread"], + name="notificatio_recipie_8bedf2_idx", + ) + ], + }, + ), + ] diff --git a/offboarding/migrations/0001_initial.py b/offboarding/migrations/0001_initial.py new file mode 100644 index 000000000..75999a796 --- /dev/null +++ b/offboarding/migrations/0001_initial.py @@ -0,0 +1,867 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import horilla.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Offboarding", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=20)), + ("description", models.TextField(max_length=255)), + ( + "status", + models.CharField( + choices=[("ongoing", "Ongoing"), ("completed", "Completed")], + default="ongoing", + max_length=10, + ), + ), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("managers", models.ManyToManyField(to="employee.employee")), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OffboardingEmployee", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("notice_period", models.IntegerField(null=True)), + ( + "unit", + models.CharField( + choices=[("day", "days"), ("month", "Month")], + default="month", + max_length=10, + null=True, + ), + ), + ("notice_period_starts", models.DateField(null=True)), + ("notice_period_ends", models.DateField(blank=True, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.OneToOneField( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeTask", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "status", + models.CharField( + choices=[ + ("todo", "Todo"), + ("in_progress", "In progress"), + ("stuck", "Stuck"), + ("completed", "Completed"), + ], + default="todo", + max_length=20, + ), + ), + ( + "description", + models.TextField(editable=False, max_length=255, null=True), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "employee_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingemployee", + verbose_name="Employee", + ), + ), + ], + ), + migrations.CreateModel( + name="OffboardingGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("resignation_request", models.BooleanField(default=False)), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OffboardingStage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=20)), + ( + "type", + models.CharField( + choices=[ + ("notice_period", "Notice period"), + ("fnf", "FnF Settlement"), + ("other", "Other"), + ("interview", "Interview"), + ("handover", "Work handover"), + ("archived", "Archived"), + ], + max_length=13, + ), + ), + ("sequence", models.IntegerField(default=0, editable=False)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("managers", models.ManyToManyField(to="employee.employee")), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "offboarding_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboarding", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AddField( + model_name="offboardingemployee", + name="stage_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingstage", + verbose_name="Stage", + ), + ), + migrations.CreateModel( + name="OffboardingStageMultipleFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("attachment", models.FileField(upload_to=horilla.models.upload_path)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OffboardingNote", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingemployee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "note_by", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="employee.employee", + ), + ), + ( + "stage_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="offboarding.offboardingstage", + ), + ), + ( + "attachments", + models.ManyToManyField( + blank=True, + editable=False, + to="offboarding.offboardingstagemultiplefile", + ), + ), + ], + options={ + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="ExitReason", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ("description", models.TextField(max_length=255)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "offboarding_employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingemployee", + ), + ), + ( + "attachments", + models.ManyToManyField( + to="offboarding.offboardingstagemultiplefile" + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OffboardingTask", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=30)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("managers", models.ManyToManyField(to="employee.employee")), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "stage_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="offboarding.offboardingstage", + verbose_name="Stage", + ), + ), + ], + options={ + "unique_together": {("title", "stage_id")}, + }, + ), + migrations.CreateModel( + name="HistoricalEmployeeTask", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "status", + models.CharField( + choices=[ + ("todo", "Todo"), + ("in_progress", "In progress"), + ("stuck", "Stuck"), + ("completed", "Completed"), + ], + default="todo", + max_length=20, + ), + ), + ( + "description", + models.TextField(editable=False, max_length=255, null=True), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="offboarding.employeetask", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="offboarding.offboardingemployee", + verbose_name="Employee", + ), + ), + ( + "task_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="offboarding.offboardingtask", + ), + ), + ], + options={ + "verbose_name": "historical employee task", + "verbose_name_plural": "historical employee tasks", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="employeetask", + name="task_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingtask", + ), + ), + migrations.CreateModel( + name="ResignationLetter", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100, null=True)), + ("description", models.TextField(max_length=255, null=True)), + ("planned_to_leave_on", models.DateField()), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=10, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "offboarding_employee_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="offboarding.offboardingemployee", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AlterUniqueTogether( + name="employeetask", + unique_together={("employee_id", "task_id")}, + ), + ] diff --git a/onboarding/migrations/0001_initial.py b/onboarding/migrations/0001_initial.py new file mode 100644 index 000000000..ff73a57c4 --- /dev/null +++ b/onboarding/migrations/0001_initial.py @@ -0,0 +1,558 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + ("recruitment", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="OnboardingCandidate", + fields=[], + options={ + "verbose_name": "Onboarding Candidate", + "verbose_name_plural": "Onboarding Candidates", + "proxy": True, + "indexes": [], + "constraints": [], + }, + bases=("recruitment.candidate",), + ), + migrations.CreateModel( + name="OnboardingPortal", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("token", models.CharField(max_length=200)), + ("used", models.BooleanField(default=False)), + ("count", models.IntegerField(default=0)), + ( + "profile", + models.ImageField( + blank=True, null=True, upload_to="employee/profile" + ), + ), + ( + "candidate_id", + models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="onboarding_portal", + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="OnboardingStage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "stage_title", + models.CharField(max_length=200, verbose_name="Stage Title"), + ), + ("sequence", models.IntegerField(null=True)), + ( + "is_final_stage", + models.BooleanField(default=False, verbose_name="Is Final Stage"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + to="employee.employee", verbose_name="Stage Managers" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "recruitment_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="onboarding_stage", + to="recruitment.recruitment", + verbose_name="Recruitment", + ), + ), + ], + options={ + "verbose_name": "Onboarding Stage", + "verbose_name_plural": "Onboarding Stages", + "ordering": ["sequence"], + }, + ), + migrations.CreateModel( + name="CandidateTask", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "status", + models.CharField( + blank=True, + choices=[ + ("todo", "Todo"), + ("scheduled", "Scheduled"), + ("ongoing", "Ongoing"), + ("stuck", "Stuck"), + ("done", "Done"), + ], + default="todo", + max_length=50, + null=True, + ), + ), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate_task", + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "stage_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate_task", + to="onboarding.onboardingstage", + ), + ), + ], + options={ + "verbose_name": "Onboarding Task", + "verbose_name_plural": "Onboarding Tasks", + }, + ), + migrations.CreateModel( + name="CandidateStage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("onboarding_end_date", models.DateField(blank=True, null=True)), + ("sequence", models.IntegerField(default=0, null=True)), + ( + "candidate_id", + models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="onboarding_stage", + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "onboarding_stage_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate", + to="onboarding.onboardingstage", + verbose_name="Stage", + ), + ), + ], + options={ + "verbose_name": "Candidate Onboarding Stage", + "ordering": ["sequence"], + }, + ), + migrations.CreateModel( + name="OnboardingTask", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "task_title", + models.CharField(max_length=200, verbose_name="Task Title"), + ), + ( + "candidates", + models.ManyToManyField( + blank=True, + related_name="cand_onboarding_task", + to="recruitment.candidate", + verbose_name="Candidates", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + related_name="onboarding_task", + to="employee.employee", + verbose_name="Task Managers", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "stage_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="onboarding_task", + to="onboarding.onboardingstage", + ), + ), + ], + options={ + "verbose_name": "Onboarding Task", + "verbose_name_plural": "Onboarding Tasks", + }, + ), + migrations.CreateModel( + name="HistoricalCandidateTask", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "status", + models.CharField( + blank=True, + choices=[ + ("todo", "Todo"), + ("scheduled", "Scheduled"), + ("ongoing", "Ongoing"), + ("stuck", "Stuck"), + ("done", "Done"), + ], + default="todo", + max_length=50, + null=True, + ), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "candidate_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="onboarding.candidatetask", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "stage_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="onboarding.onboardingstage", + ), + ), + ( + "onboarding_task_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="onboarding.onboardingtask", + ), + ), + ], + options={ + "verbose_name": "historical Onboarding Task", + "verbose_name_plural": "historical Onboarding Tasks", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="candidatetask", + name="onboarding_task_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="onboarding.onboardingtask", + ), + ), + ] diff --git a/payroll/migrations/0001_initial.py b/payroll/migrations/0001_initial.py new file mode 100644 index 000000000..d0b16cd38 --- /dev/null +++ b/payroll/migrations/0001_initial.py @@ -0,0 +1,2312 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import base.models +import django.db.models.deletion +import horilla.models +import payroll.models.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("asset", "0001_initial"), + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + ("leave", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="EncashmentGeneralSettings", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("bonus_amount", models.IntegerField(default=1)), + ( + "leave_amount", + models.IntegerField(blank=True, null=True, verbose_name="Amount"), + ), + ], + ), + migrations.CreateModel( + name="MultipleCondition", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("field", models.CharField(max_length=255)), + ( + "condition", + models.CharField( + blank=True, + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("icontains", "Contains"), + ], + max_length=255, + null=True, + ), + ), + ( + "value", + models.CharField( + blank=True, + help_text="The value must be like the data stored in the database", + max_length=255, + null=True, + ), + ), + ], + ), + migrations.CreateModel( + name="OverrideLeaveRequest", + fields=[ + ( + "leaverequest_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="leave.leaverequest", + ), + ), + ], + options={ + "abstract": False, + }, + bases=("leave.leaverequest",), + ), + migrations.CreateModel( + name="ReimbursementFile", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("file", models.FileField(upload_to=horilla.models.upload_path)), + ], + ), + migrations.CreateModel( + name="ReimbursementMultipleAttachment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("attachment", models.FileField(upload_to=horilla.models.upload_path)), + ], + ), + migrations.CreateModel( + name="Allowance", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField( + help_text="Title of the allowance", max_length=255 + ), + ), + ( + "one_time_date", + models.DateField( + blank=True, + help_text="The one-time allowance in which the allowance will apply to the payslips if the date between the payslip period", + null=True, + ), + ), + ( + "include_active_employees", + models.BooleanField( + default=False, + help_text="Target allowance to all active employees in the company", + verbose_name="Include all active employees", + ), + ), + ( + "is_taxable", + models.BooleanField( + default=True, + help_text="This field is used to calculate the taxable allowances", + ), + ), + ( + "is_condition_based", + models.BooleanField( + default=False, + help_text="This field is used to target allowance to the specific employees when the condition satisfies with the employee's information", + ), + ), + ( + "field", + models.CharField( + blank=True, + choices=[ + ("children", "Children"), + ("marital_status", "Marital Status"), + ("experience", "Experience"), + ("employee_work_info__experience", "Company Experience"), + ("gender", "Gender"), + ("country", "Country"), + ("state", "State"), + ("contract_set__pay_frequency", "Pay Frequency"), + ("contract_set__wage_type", "Wage Type"), + ( + "contract_set__department__department", + "Department on Contract", + ), + ], + help_text="The related field of the employees", + max_length=255, + null=True, + ), + ), + ( + "condition", + models.CharField( + blank=True, + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("icontains", "Contains"), + ], + max_length=255, + null=True, + ), + ), + ( + "value", + models.CharField( + blank=True, + help_text="The value must be like the data stored in the database", + max_length=255, + null=True, + ), + ), + ( + "is_fixed", + models.BooleanField( + default=True, + help_text="To specify, the allowance is fixed or not", + ), + ), + ( + "amount", + models.FloatField( + blank=True, + help_text="Fixed amount for this allowance", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "based_on", + models.CharField( + blank=True, + choices=[ + ("basic_pay", "Basic Pay"), + ("children", "Children"), + ("overtime", "Overtime"), + ("shift_id", "Shift"), + ("work_type_id", "Work Type"), + ("attendance", "Attendance"), + ], + default="basic_pay", + help_text="If the allowance is not fixed then specifies how the allowance provided", + max_length=255, + null=True, + ), + ), + ( + "rate", + models.FloatField( + blank=True, + help_text="The percentage of based on", + null=True, + validators=[payroll.models.models.rate_validator], + ), + ), + ( + "per_attendance_fixed_amount", + models.FloatField( + blank=True, + default=0.0, + help_text="The attendance fixed amount for one validated attendance", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "per_children_fixed_amount", + models.FloatField( + blank=True, + default=0.0, + help_text="The fixed amount per children", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "shift_per_attendance_amount", + models.FloatField( + blank=True, + default=0.0, + help_text="The fixed amount for one validated attendance with that shift", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "amount_per_one_hr", + models.FloatField( + blank=True, + default=0.0, + help_text="The fixed amount for one hour overtime that are validated and approved the overtime attendance", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "work_type_per_attendance_amount", + models.FloatField( + blank=True, + default=0.0, + help_text="The fixed amount for one validated attendance with that work type", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "has_max_limit", + models.BooleanField( + default=False, + help_text="Limit the allowance amount", + verbose_name="Has max limit for allowance", + ), + ), + ( + "maximum_amount", + models.FloatField( + blank=True, + help_text="The maximum amount for the allowance", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "maximum_unit", + models.CharField( + choices=[("month_working_days", "For working days on month")], + default="month_working_days", + help_text="The maximum amount for ?", + max_length=20, + null=True, + ), + ), + ( + "if_choice", + models.CharField( + choices=[("basic_pay", "Basic Pay")], + default="basic_pay", + help_text="The pay head for the if condition", + max_length=10, + ), + ), + ( + "if_condition", + models.CharField( + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("range", "Range"), + ], + default="gt", + help_text="Apply for those, if the pay-head conditions satisfy", + max_length=10, + ), + ), + ( + "if_amount", + models.FloatField( + default=0.0, help_text="The amount of the pay-head" + ), + ), + ( + "start_range", + models.FloatField( + blank=True, + help_text="The start amount of the pay-head range", + null=True, + ), + ), + ( + "end_range", + models.FloatField( + blank=True, + help_text="The end amount of the pay-head range", + null=True, + ), + ), + ( + "only_show_under_employee", + models.BooleanField(default=False, editable=False), + ), + ("is_loan", models.BooleanField(default=False, editable=False)), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "exclude_employees", + models.ManyToManyField( + blank=True, + help_text="To ignore the allowance to the employees when target them by all employees or through condition-based", + related_name="allowance_excluded", + to="employee.employee", + verbose_name="Exclude Employees", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "shift_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.employeeshift", + verbose_name="Shift", + ), + ), + ( + "specific_employees", + models.ManyToManyField( + blank=True, + help_text="Target allowance to the specific employees", + related_name="allowance_specific", + to="employee.employee", + verbose_name="Employees Specific", + ), + ), + ( + "work_type_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.worktype", + verbose_name="Work Type", + ), + ), + ( + "other_conditions", + models.ManyToManyField( + blank=True, editable=False, to="payroll.multiplecondition" + ), + ), + ], + options={ + "verbose_name": "Allowance", + "unique_together": { + ( + "title", + "is_taxable", + "is_condition_based", + "field", + "condition", + "value", + "is_fixed", + "amount", + "based_on", + "rate", + "per_attendance_fixed_amount", + "shift_id", + "shift_per_attendance_amount", + "amount_per_one_hr", + "work_type_id", + "work_type_per_attendance_amount", + ) + }, + }, + ), + migrations.CreateModel( + name="Deduction", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField( + help_text="Title of the deduction", max_length=255 + ), + ), + ( + "one_time_date", + models.DateField( + blank=True, + help_text="The one-time deduction in which the deduction will apply to the payslips if the date between the payslip period", + null=True, + ), + ), + ( + "include_active_employees", + models.BooleanField( + default=False, + help_text="Target deduction to all active employees in the company", + verbose_name="Include all active employees", + ), + ), + ( + "is_tax", + models.BooleanField( + default=False, + help_text="To specify the deduction is tax or normal deduction", + ), + ), + ( + "is_pretax", + models.BooleanField( + default=True, + help_text="To find taxable gross, taxable_gross = (basic_pay + taxable_deduction)-pre_tax_deductions ", + ), + ), + ( + "is_condition_based", + models.BooleanField( + default=False, + help_text="This field is used to target deduction to the specific employees when the condition satisfies with the employee's information", + ), + ), + ( + "field", + models.CharField( + blank=True, + choices=[ + ("children", "Children"), + ("marital_status", "Marital Status"), + ("experience", "Experience"), + ("employee_work_info__experience", "Company Experience"), + ("gender", "Gender"), + ("country", "Country"), + ("state", "State"), + ("contract_set__pay_frequency", "Pay Frequency"), + ("contract_set__wage_type", "Wage Type"), + ( + "contract_set__department__department", + "Department on Contract", + ), + ], + help_text="The related field of the employees", + max_length=255, + null=True, + ), + ), + ( + "condition", + models.CharField( + blank=True, + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("icontains", "Contains"), + ], + max_length=255, + null=True, + ), + ), + ( + "value", + models.CharField( + blank=True, + help_text="The value must be like the data stored in the database", + max_length=255, + null=True, + ), + ), + ( + "update_compensation", + models.CharField( + blank=True, + choices=[ + ("basic_pay", "Basic pay"), + ("gross_pay", "Gross Pay"), + ("net_pay", "Net Pay"), + ], + help_text="Update compensation is used to update pay-head before any other deduction calculation starts", + max_length=10, + null=True, + ), + ), + ( + "is_fixed", + models.BooleanField( + default=True, + help_text="To specify, the deduction is fixed or not", + ), + ), + ( + "amount", + models.FloatField( + blank=True, + help_text="Fixed amount for this deduction", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "based_on", + models.CharField( + blank=True, + choices=[ + ("basic_pay", "Basic Pay"), + ("gross_pay", "Gross Pay"), + ("taxable_gross_pay", "Taxable Gross Pay"), + ("net_pay", "Net Pay"), + ], + help_text="If the deduction is not fixed then specifies how the deduction provided", + max_length=255, + null=True, + ), + ), + ( + "rate", + models.FloatField( + blank=True, + default=0.0, + help_text="The percentage of based on", + null=True, + validators=[payroll.models.models.rate_validator], + verbose_name="Employee rate", + ), + ), + ( + "employer_rate", + models.FloatField( + default=0.0, validators=[payroll.models.models.rate_validator] + ), + ), + ( + "has_max_limit", + models.BooleanField( + default=False, + help_text="Limit the deduction", + verbose_name="Has max limit for deduction", + ), + ), + ( + "maximum_amount", + models.FloatField( + blank=True, + help_text="The maximum amount for the deduction", + null=True, + validators=[payroll.models.models.min_zero], + ), + ), + ( + "maximum_unit", + models.CharField( + choices=[("month_working_days", "For working days on month")], + default="month_working_days", + help_text="The maximum amount for ?", + max_length=20, + null=True, + ), + ), + ( + "if_choice", + models.CharField( + choices=[ + ("basic_pay", "Basic Pay"), + ("gross_pay", "Gross Pay"), + ], + default="basic_pay", + help_text="The pay head for the if condition", + max_length=10, + ), + ), + ( + "if_condition", + models.CharField( + choices=[ + ("equal", "Equal (==)"), + ("notequal", "Not Equal (!=)"), + ("lt", "Less Than (<)"), + ("gt", "Greater Than (>)"), + ("le", "Less Than or Equal To (<=)"), + ("ge", "Greater Than or Equal To (>=)"), + ("range", "Range"), + ], + default="gt", + help_text="Apply for those, if the pay-head conditions satisfy", + max_length=10, + ), + ), + ( + "if_amount", + models.FloatField( + default=0.0, help_text="The amount of the pay-head" + ), + ), + ( + "start_range", + models.FloatField( + blank=True, + help_text="The start amount of the pay-head range", + null=True, + ), + ), + ( + "end_range", + models.FloatField( + blank=True, + help_text="The end amount of the pay-head range", + null=True, + ), + ), + ( + "only_show_under_employee", + models.BooleanField(default=False, editable=False), + ), + ("is_installment", models.BooleanField(default=False, editable=False)), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "exclude_employees", + models.ManyToManyField( + blank=True, + help_text="To ignore the deduction to the employees when target them by all employees or through condition-based", + related_name="deduction_exclude", + to="employee.employee", + verbose_name="Exclude Employees", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "specific_employees", + models.ManyToManyField( + blank=True, + help_text="Target deduction to the specific employees", + related_name="deduction_specific", + to="employee.employee", + verbose_name="Employees Specific", + ), + ), + ( + "other_conditions", + models.ManyToManyField( + blank=True, editable=False, to="payroll.multiplecondition" + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="FilingStatus", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "filing_status", + models.CharField(max_length=30, verbose_name="Filing status"), + ), + ( + "based_on", + models.CharField( + choices=[ + ("basic_pay", "Basic Pay"), + ("gross_pay", "Gross Pay"), + ("taxable_gross_pay", "Taxable Gross Pay"), + ], + default="taxable_gross_pay", + max_length=255, + verbose_name="Based on", + ), + ), + ( + "use_py", + models.BooleanField(default=False, verbose_name="Python Code"), + ), + ("python_code", models.TextField(null=True)), + ( + "description", + models.TextField( + blank=True, max_length=255, verbose_name="Description" + ), + ), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Filing Status", + "verbose_name_plural": "Filing Statuses", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="Contract", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "contract_name", + models.CharField( + help_text="Contract Title.", + max_length=250, + verbose_name="Contract", + ), + ), + ("contract_start_date", models.DateField(verbose_name="Start Date")), + ( + "contract_end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "wage_type", + models.CharField( + choices=[ + ("daily", "Daily"), + ("monthly", "Monthly"), + ("hourly", "Hourly"), + ], + default="monthly", + max_length=250, + verbose_name="Wage Type", + ), + ), + ( + "pay_frequency", + models.CharField( + choices=[ + ("weekly", "Weekly"), + ("monthly", "Monthly"), + ("semi_monthly", "Semi-Monthly"), + ], + default="monthly", + max_length=20, + null=True, + verbose_name="Pay Frequency", + ), + ), + ( + "wage", + models.FloatField( + default=0, null=True, verbose_name="Basic Salary" + ), + ), + ( + "contract_status", + models.CharField( + choices=[ + ("draft", "Draft"), + ("active", "Active"), + ("expired", "Expired"), + ("terminated", "Terminated"), + ], + default="draft", + max_length=250, + verbose_name="Status", + ), + ), + ( + "notice_period_in_days", + models.IntegerField( + default=30, + help_text="Notice period in total days.", + validators=[payroll.models.models.min_zero], + verbose_name="Notice Period", + ), + ), + ( + "contract_document", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ( + "deduct_leave_from_basic_pay", + models.BooleanField( + default=True, + help_text="Deduct the leave amount from basic pay.", + verbose_name="Deduct From Basic Pay", + ), + ), + ( + "calculate_daily_leave_amount", + models.BooleanField( + default=True, + help_text="Leave amount will be calculated by dividing the basic pay by number of working days.", + verbose_name="Calculate Daily Leave Amount", + ), + ), + ( + "deduction_for_one_leave_amount", + models.FloatField( + blank=True, + default=0, + null=True, + verbose_name="Deduction For One Leave Amount", + ), + ), + ("note", models.TextField(blank=True, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "department", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="base.department", + verbose_name="Department", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="contract_set", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "job_position", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "job_role", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="base.jobrole", + verbose_name="Job Role", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "shift", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="base.employeeshift", + verbose_name="Shift", + ), + ), + ( + "work_type", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="base.worktype", + verbose_name="Work Type", + ), + ), + ( + "filing_status", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="contracts", + to="payroll.filingstatus", + verbose_name="Filing Status", + ), + ), + ], + options={ + "unique_together": { + ("employee_id", "contract_start_date", "contract_end_date") + }, + }, + ), + migrations.CreateModel( + name="HistoricalContract", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "contract_name", + models.CharField( + help_text="Contract Title.", + max_length=250, + verbose_name="Contract", + ), + ), + ("contract_start_date", models.DateField(verbose_name="Start Date")), + ( + "contract_end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "wage_type", + models.CharField( + choices=[ + ("daily", "Daily"), + ("monthly", "Monthly"), + ("hourly", "Hourly"), + ], + default="monthly", + max_length=250, + verbose_name="Wage Type", + ), + ), + ( + "pay_frequency", + models.CharField( + choices=[ + ("weekly", "Weekly"), + ("monthly", "Monthly"), + ("semi_monthly", "Semi-Monthly"), + ], + default="monthly", + max_length=20, + null=True, + verbose_name="Pay Frequency", + ), + ), + ( + "wage", + models.FloatField( + default=0, null=True, verbose_name="Basic Salary" + ), + ), + ( + "contract_status", + models.CharField( + choices=[ + ("draft", "Draft"), + ("active", "Active"), + ("expired", "Expired"), + ("terminated", "Terminated"), + ], + default="draft", + max_length=250, + verbose_name="Status", + ), + ), + ( + "notice_period_in_days", + models.IntegerField( + default=30, + help_text="Notice period in total days.", + validators=[payroll.models.models.min_zero], + verbose_name="Notice Period", + ), + ), + ( + "contract_document", + models.TextField(blank=True, max_length=100, null=True), + ), + ( + "deduct_leave_from_basic_pay", + models.BooleanField( + default=True, + help_text="Deduct the leave amount from basic pay.", + verbose_name="Deduct From Basic Pay", + ), + ), + ( + "calculate_daily_leave_amount", + models.BooleanField( + default=True, + help_text="Leave amount will be calculated by dividing the basic pay by number of working days.", + verbose_name="Calculate Daily Leave Amount", + ), + ), + ( + "deduction_for_one_leave_amount", + models.FloatField( + blank=True, + default=0, + null=True, + verbose_name="Deduction For One Leave Amount", + ), + ), + ("note", models.TextField(blank=True, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "department", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.department", + verbose_name="Department", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "filing_status", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="payroll.filingstatus", + verbose_name="Filing Status", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="payroll.contract", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "job_position", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "job_role", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.jobrole", + verbose_name="Job Role", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "shift", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.employeeshift", + verbose_name="Shift", + ), + ), + ( + "work_type", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.worktype", + verbose_name="Work Type", + ), + ), + ], + options={ + "verbose_name": "historical contract", + "verbose_name_plural": "historical contracts", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="LoanAccount", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100)), + ( + "type", + models.CharField( + choices=[ + ("loan", "Loan"), + ("advanced_salary", "Advanced Salary"), + ("fine", "Penalty / Fine"), + ], + default="loan", + max_length=15, + ), + ), + ("loan_amount", models.FloatField(default=0, verbose_name="Amount")), + ("provided_date", models.DateField()), + ("description", models.TextField(null=True)), + ("is_fixed", models.BooleanField(default=True, editable=False)), + ("rate", models.FloatField(default=0, editable=False)), + ( + "installment_amount", + models.FloatField( + blank=True, null=True, verbose_name="installment Amount" + ), + ), + ( + "installments", + models.IntegerField(verbose_name="Total installments"), + ), + ( + "installment_start_date", + models.DateField( + help_text="From the start date deduction will apply" + ), + ), + ( + "apply_on", + models.CharField( + default="end_of_month", editable=False, max_length=20 + ), + ), + ("settled", models.BooleanField(default=False)), + ("settled_date", models.DateTimeField(null=True)), + ( + "allowance_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="payroll.allowance", + ), + ), + ( + "asset_id", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="asset.asset", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "deduction_ids", + models.ManyToManyField(editable=False, to="payroll.deduction"), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="PayrollGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "notice_period", + models.IntegerField( + default=30, + help_text="Notice period in days", + validators=[payroll.models.models.min_zero], + ), + ), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + ], + ), + migrations.CreateModel( + name="PayrollSettings", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "currency_symbol", + models.CharField(default="$", max_length=5, null=True), + ), + ( + "position", + models.CharField( + choices=[("prefix", "Prefix"), ("postfix", "Postfix")], + default="postfix", + max_length=15, + null=True, + ), + ), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Payroll Settings", + "verbose_name_plural": "Payroll Settings", + }, + ), + migrations.CreateModel( + name="Payslip", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "group_name", + models.CharField( + blank=True, max_length=50, null=True, verbose_name="Batch name" + ), + ), + ("reference", models.CharField(blank=True, max_length=255, null=True)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ("pay_head_data", models.JSONField()), + ("contract_wage", models.FloatField(default=0, null=True)), + ("basic_pay", models.FloatField(default=0, null=True)), + ("gross_pay", models.FloatField(default=0, null=True)), + ("deduction", models.FloatField(default=0, null=True)), + ("net_pay", models.FloatField(default=0, null=True)), + ( + "status", + models.CharField( + choices=[ + ("draft", "Draft"), + ("review_ongoing", "Review Ongoing"), + ("confirmed", "Confirmed"), + ("paid", "Paid"), + ], + default="draft", + max_length=20, + null=True, + ), + ), + ("sent_to_employee", models.BooleanField(default=False, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "installment_ids", + models.ManyToManyField(editable=False, to="payroll.deduction"), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-end_date"], + }, + ), + migrations.CreateModel( + name="HistoricalPayslip", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "group_name", + models.CharField( + blank=True, max_length=50, null=True, verbose_name="Batch name" + ), + ), + ("reference", models.CharField(blank=True, max_length=255, null=True)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ("pay_head_data", models.JSONField()), + ("contract_wage", models.FloatField(default=0, null=True)), + ("basic_pay", models.FloatField(default=0, null=True)), + ("gross_pay", models.FloatField(default=0, null=True)), + ("deduction", models.FloatField(default=0, null=True)), + ("net_pay", models.FloatField(default=0, null=True)), + ( + "status", + models.CharField( + choices=[ + ("draft", "Draft"), + ("review_ongoing", "Review Ongoing"), + ("confirmed", "Confirmed"), + ("paid", "Paid"), + ], + default="draft", + max_length=20, + null=True, + ), + ), + ("sent_to_employee", models.BooleanField(default=False, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="payroll.payslip", + ), + ), + ], + options={ + "verbose_name": "historical payslip", + "verbose_name_plural": "historical payslips", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="PayslipAutoGenerate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "generate_day", + models.CharField( + choices=[ + ("last day", "Last Day"), + ("1", "1st"), + ("2", "2nd"), + ("3", "3rd"), + ("4", "4th"), + ("5", "5th"), + ("6", "6th"), + ("7", "7th"), + ("8", "8th"), + ("9", "9th"), + ("10", "10th"), + ("11", "11th"), + ("12", "12th"), + ("13", "13th"), + ("14", "14th"), + ("15", "15th"), + ("16", "16th"), + ("17", "17th"), + ("18", "18th"), + ("19", "19th"), + ("20", "20th"), + ("21", "21th"), + ("22", "22th"), + ("23", "23th"), + ("24", "24th"), + ("25", "25th"), + ("26", "26th"), + ("27", "27th"), + ("28", "28th"), + ("29", "29th"), + ("30", "30th"), + ("31", "31th"), + ], + default="1", + help_text="On this day of every month,Payslip will auto generate", + max_length=30, + verbose_name="Payslip Generate Day", + ), + ), + ("auto_generate", models.BooleanField(default=False)), + ( + "company_id", + models.OneToOneField( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ], + ), + migrations.CreateModel( + name="Reimbursement", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ( + "type", + models.CharField( + choices=[ + ("reimbursement", "Reimbursement"), + ("bonus_encashment", "Bonus Point Encashment"), + ("leave_encashment", "Leave Encashment"), + ], + default="reimbursement", + max_length=16, + ), + ), + ("allowance_on", models.DateField()), + ( + "attachment", + models.FileField(null=True, upload_to=horilla.models.upload_path), + ), + ( + "ad_to_encash", + models.FloatField( + default=0, + help_text="Available Days to encash", + verbose_name="Available days", + ), + ), + ( + "cfd_to_encash", + models.FloatField( + default=0, + help_text="Carry Forward Days to encash", + verbose_name="Carry forward days", + ), + ), + ( + "bonus_to_encash", + models.IntegerField( + default=0, + help_text="Bonus points to encash", + verbose_name="Bonus points", + ), + ), + ("amount", models.FloatField(default=0)), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=10, + ), + ), + ("description", models.TextField(null=True)), + ( + "allowance_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="payroll.allowance", + ), + ), + ( + "approved_by", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="approved_by", + to="employee.employee", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "leave_type_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="leave.leavetype", + verbose_name="Leave type", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "other_attachments", + models.ManyToManyField( + blank=True, + editable=False, + to="payroll.reimbursementmultipleattachment", + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="ReimbursementrequestComment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "comment", + models.TextField(max_length=255, null=True, verbose_name="Comment"), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ( + "files", + models.ManyToManyField(blank=True, to="payroll.reimbursementfile"), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "request_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="payroll.reimbursement", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="TaxBracket", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("min_income", models.FloatField(verbose_name="Min. Income")), + ( + "max_income", + models.FloatField( + blank=True, null=True, verbose_name="Max. Income" + ), + ), + ("tax_rate", models.FloatField(default=0.0, verbose_name="Tax Rate")), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "filing_status_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="payroll.filingstatus", + verbose_name="Filing status", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="WorkRecord", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "record_name", + models.CharField(blank=True, max_length=250, null=True), + ), + ( + "work_record_type", + models.CharField( + choices=[ + ("FDP", "Present"), + ("HDP", "Half Day Present"), + ("ABS", "Absent"), + ("HD", "Holiday/Company Leave"), + ("CONF", "Conflict"), + ("DFT", "Draft"), + ], + max_length=5, + null=True, + ), + ), + ("date", models.DateField(blank=True, null=True)), + ( + "at_work", + models.CharField( + blank=True, + default="00:00", + max_length=5, + null=True, + validators=[base.models.validate_time_format], + ), + ), + ( + "min_hour", + models.CharField( + blank=True, + default="00:00", + max_length=5, + null=True, + validators=[base.models.validate_time_format], + ), + ), + ( + "at_work_second", + models.IntegerField(blank=True, default=0, null=True), + ), + ( + "min_hour_second", + models.IntegerField(blank=True, default=0, null=True), + ), + ("note", models.TextField(max_length=255)), + ("message", models.CharField(blank=True, max_length=30, null=True)), + ("is_attendance_record", models.BooleanField(default=False)), + ("is_leave_record", models.BooleanField(default=False)), + ("day_percentage", models.FloatField(default=0)), + ("last_update", models.DateTimeField(blank=True, null=True)), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="employee.employee", + verbose_name="Employee", + ), + ), + ], + ), + ] diff --git a/pms/migrations/0001_initial.py b/pms/migrations/0001_initial.py new file mode 100644 index 000000000..e88dd9b7f --- /dev/null +++ b/pms/migrations/0001_initial.py @@ -0,0 +1,1924 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.core.validators +import django.db.models.deletion +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="BonusPointSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "model", + models.CharField( + choices=[ + ("pms.models.EmployeeObjective", "Objective"), + ("pms.models.EmployeeKeyResult", "Key Result"), + ("project.models.Task", "Task"), + ("project.models.Project", "Project"), + ], + max_length=100, + ), + ), + ( + "applicable_for", + models.CharField( + blank=True, + choices=[ + ("owner", "Owner"), + ("members", "Members"), + ("managers", "Managers"), + ], + max_length=50, + null=True, + ), + ), + ( + "bonus_for", + models.CharField( + choices=[("completed", "Completing"), ("Closed", "Closing")], + max_length=25, + ), + ), + ( + "field_1", + models.CharField( + blank=True, + choices=[("complition_date", "Completion Date")], + max_length=25, + null=True, + ), + ), + ( + "conditions", + models.CharField( + blank=True, + choices=[ + ("=", "="), + (">", ">"), + ("<", "<"), + ("<=", "<="), + (">=", ">="), + ], + max_length=25, + null=True, + ), + ), + ( + "field_2", + models.CharField( + blank=True, + choices=[("end_date", "End Date")], + max_length=25, + null=True, + ), + ), + ( + "points", + models.IntegerField( + default=0, + validators=[django.core.validators.MinValueValidator(0)], + ), + ), + ("is_active", models.BooleanField(default=True)), + ], + ), + migrations.CreateModel( + name="AnonymousFeedback", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("feedback_subject", models.CharField(max_length=100)), + ( + "based_on", + models.CharField( + choices=[ + ("general", "General"), + ("employee", "Employee"), + ("department", "Department"), + ("job_position", "Job Position"), + ], + default="general", + max_length=50, + ), + ), + ( + "status", + models.CharField( + choices=[ + ("On Track", "On Track"), + ("Behind", "Behind"), + ("Closed", "Closed"), + ("At Risk", "At Risk"), + ("Not Started", "Not Started"), + ], + default="Not Started", + max_length=50, + ), + ), + ("created_at", models.DateField(auto_now_add=True)), + ("archive", models.BooleanField(blank=True, default=False, null=True)), + ( + "anonymous_feedback_id", + models.CharField(editable=False, max_length=10, null=True), + ), + ( + "feedback_description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "department_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.department", + verbose_name="Department", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ], + ), + migrations.CreateModel( + name="EmployeeBonusPoint", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("bonus_point", models.IntegerField(default=0)), + ("instance", models.CharField(blank=True, max_length=150, null=True)), + ("based_on", models.CharField(max_length=150)), + ( + "bonus_point_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="employeebonuspoint_set", + to="employee.bonuspoint", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="employe_bonus_point", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="EmployeeObjective", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "objective", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="Title" + ), + ), + ( + "objective_description", + models.TextField( + blank=True, + max_length=255, + null=True, + verbose_name="Description", + ), + ), + ("created_at", models.DateField(auto_now_add=True)), + ("updated_at", models.DateField(auto_now=True)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ( + "status", + models.CharField( + choices=[ + ("Not Started", "Not Started"), + ("On Track", "On Track"), + ("Behind", "Behind"), + ("At Risk", "At Risk"), + ("Closed", "Closed"), + ], + default="Not Started", + max_length=20, + ), + ), + ("progress_percentage", models.IntegerField(default=0)), + ("archive", models.BooleanField(default=False)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_objective", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + ), + migrations.CreateModel( + name="EmployeeKeyResult", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("key_result", models.CharField(blank=True, max_length=60, null=True)), + ( + "key_result_description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "progress_type", + models.CharField( + blank=True, + choices=[ + ("%", "Percentage"), + ("#", "Number"), + ("Currency", [("$", "USD$"), ("₹", "INR"), ("€", "EUR")]), + ], + max_length=60, + null=True, + ), + ), + ( + "status", + models.CharField( + blank=True, + choices=[ + ("Not Started", "Not Started"), + ("On Track", "On Track"), + ("Behind", "Behind"), + ("At Risk", "At Risk"), + ("Closed", "Closed"), + ], + default="Not Started", + max_length=20, + null=True, + ), + ), + ("created_at", models.DateField(auto_now_add=True, null=True)), + ("updated_at", models.DateField(auto_now=True, null=True)), + ("start_value", models.IntegerField(blank=True, default=0, null=True)), + ( + "current_value", + models.IntegerField(blank=True, default=0, null=True), + ), + ("target_value", models.IntegerField(blank=True, default=0, null=True)), + ("start_date", models.DateField(blank=True, null=True)), + ("end_date", models.DateField(blank=True, null=True)), + ("progress_percentage", models.IntegerField(default=0)), + ( + "employee_objective_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="employee_key_result", + to="pms.employeeobjective", + ), + ), + ], + ), + migrations.CreateModel( + name="Comment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("comment", models.TextField()), + ("created_at", models.DateTimeField(auto_now_add=True, null=True)), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="comment", + to="employee.employee", + ), + ), + ( + "employee_objective_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="emp_objective", + to="pms.employeeobjective", + ), + ), + ], + ), + migrations.CreateModel( + name="Feedback", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "review_cycle", + models.CharField(max_length=100, verbose_name="Title"), + ), + ( + "status", + models.CharField( + choices=[ + ("On Track", "On Track"), + ("Behind", "Behind"), + ("Closed", "Closed"), + ("At Risk", "At Risk"), + ("Not Started", "Not Started"), + ], + default="Not Started", + max_length=50, + ), + ), + ("archive", models.BooleanField(blank=True, default=False, null=True)), + ("start_date", models.DateField(verbose_name="Start Date")), + ("end_date", models.DateField(null=True, verbose_name="End Date")), + ( + "cyclic_feedback", + models.BooleanField( + default=False, verbose_name="Is Cyclic Feedback" + ), + ), + ( + "cyclic_feedback_days_count", + models.IntegerField( + blank=True, null=True, verbose_name="Cycle Period" + ), + ), + ( + "cyclic_feedback_period", + models.CharField( + blank=True, + choices=[ + ("days", "Days"), + ("months", "Months"), + ("years", "Years"), + ], + max_length=50, + null=True, + ), + ), + ("cyclic_next_start_date", models.DateField(blank=True, null=True)), + ("cyclic_next_end_date", models.DateField(blank=True, null=True)), + ( + "colleague_id", + models.ManyToManyField( + blank=True, + help_text="Employees working on the same department.", + related_name="feedback_colleague", + to="employee.employee", + verbose_name="Colleague", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="feedback_employee", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "employee_key_results_id", + models.ManyToManyField( + blank=True, + to="pms.employeekeyresult", + verbose_name="Key Result", + ), + ), + ( + "manager_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="feedback_manager", + to="employee.employee", + verbose_name="Manager", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "others_id", + models.ManyToManyField( + blank=True, + related_name="feedback_others", + to="employee.employee", + verbose_name="Other Employees", + ), + ), + ( + "subordinate_id", + models.ManyToManyField( + blank=True, + help_text="Employees for whom the feedback requester is the reporting manager", + related_name="feedback_subordinate", + to="employee.employee", + verbose_name="Subordinates", + ), + ), + ], + options={ + "verbose_name": "Feedback", + "verbose_name_plural": "Feedbacks", + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="HistoricalComment", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "created_at", + models.DateTimeField(blank=True, editable=False, null=True), + ), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + ), + ), + ( + "employee_objective_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="pms.employeeobjective", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "verbose_name": "historical comment", + "verbose_name_plural": "historical comments", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalKeyResult", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "title", + models.CharField(max_length=60, null=True, verbose_name="Title"), + ), + ( + "description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ( + "progress_type", + models.CharField( + choices=[ + ("%", "Percentage"), + ("#", "Number"), + ("Currency", [("$", "USD$"), ("₹", "INR"), ("€", "EUR")]), + ], + default="%", + max_length=60, + ), + ), + ( + "target_value", + models.IntegerField(blank=True, default=100, null=True), + ), + ( + "duration", + models.IntegerField(blank=True, help_text="In Days", null=True), + ), + ("archive", models.BooleanField(default=False)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "historical key result", + "verbose_name_plural": "historical key results", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="HistoricalObjective", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("title", models.CharField(max_length=100, verbose_name="Title")), + ( + "description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ( + "duration_unit", + models.CharField( + blank=True, + choices=[ + ("days", "Days"), + ("months", "Months"), + ("years", "Years"), + ], + default="days", + max_length=20, + null=True, + verbose_name="Duration Unit", + ), + ), + ( + "duration", + models.IntegerField( + default=1, + validators=[django.core.validators.MinValueValidator(0)], + ), + ), + ("add_assignees", models.BooleanField(default=False)), + ("archive", models.BooleanField(default=False)), + ("self_employee_progress_update", models.BooleanField(default=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "historical objective", + "verbose_name_plural": "historical objectives", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="KeyResult", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField(max_length=60, null=True, verbose_name="Title"), + ), + ( + "description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ( + "progress_type", + models.CharField( + choices=[ + ("%", "Percentage"), + ("#", "Number"), + ("Currency", [("$", "USD$"), ("₹", "INR"), ("€", "EUR")]), + ], + default="%", + max_length=60, + ), + ), + ( + "target_value", + models.IntegerField(blank=True, default=100, null=True), + ), + ( + "duration", + models.IntegerField(blank=True, help_text="In Days", null=True), + ), + ("archive", models.BooleanField(default=False)), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="HistoricalEmployeeKeyResult", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("key_result", models.CharField(blank=True, max_length=60, null=True)), + ( + "key_result_description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "progress_type", + models.CharField( + blank=True, + choices=[ + ("%", "Percentage"), + ("#", "Number"), + ("Currency", [("$", "USD$"), ("₹", "INR"), ("€", "EUR")]), + ], + max_length=60, + null=True, + ), + ), + ( + "status", + models.CharField( + blank=True, + choices=[ + ("Not Started", "Not Started"), + ("On Track", "On Track"), + ("Behind", "Behind"), + ("At Risk", "At Risk"), + ("Closed", "Closed"), + ], + default="Not Started", + max_length=20, + null=True, + ), + ), + ("created_at", models.DateField(blank=True, editable=False, null=True)), + ("updated_at", models.DateField(blank=True, editable=False, null=True)), + ("start_value", models.IntegerField(blank=True, default=0, null=True)), + ( + "current_value", + models.IntegerField(blank=True, default=0, null=True), + ), + ("target_value", models.IntegerField(blank=True, default=0, null=True)), + ("start_date", models.DateField(blank=True, null=True)), + ("end_date", models.DateField(blank=True, null=True)), + ("progress_percentage", models.IntegerField(default=0)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "employee_objective_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="pms.employeeobjective", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "key_result_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="pms.keyresult", + verbose_name="Key result", + ), + ), + ], + options={ + "verbose_name": "historical employee key result", + "verbose_name_plural": "historical employee key results", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="employeeobjective", + name="key_result_id", + field=models.ManyToManyField( + blank=True, + related_name="employee_objective", + to="pms.keyresult", + verbose_name="Key results", + ), + ), + migrations.AddField( + model_name="employeekeyresult", + name="key_result_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_key_result", + to="pms.keyresult", + verbose_name="Key result", + ), + ), + migrations.CreateModel( + name="KeyResultFeedback", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("answer", models.JSONField(blank=True, max_length=200, null=True)), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="employee_key_result", + to="employee.employee", + ), + ), + ( + "feedback_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="feedback_key_result", + to="pms.feedback", + ), + ), + ( + "key_result_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="key_result_feedback", + to="pms.employeekeyresult", + ), + ), + ], + ), + migrations.CreateModel( + name="Meetings", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100)), + ("date", models.DateTimeField(blank=True, null=True)), + ("response", models.TextField(blank=True, null=True)), + ("show_response", models.BooleanField(default=False, editable=False)), + ( + "answer_employees", + models.ManyToManyField( + blank=True, + help_text="Select the employees who can respond to question template in this meeting's, if any are added.", + related_name="meeting_answer_employees", + to="employee.employee", + verbose_name="Answerable Employees", + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + related_name="meeting_employee", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "manager", + models.ManyToManyField( + related_name="meeting_manager", to="employee.employee" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Meetings", + "verbose_name_plural": "Meetings", + }, + ), + migrations.CreateModel( + name="Objective", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100, verbose_name="Title")), + ( + "description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ( + "duration_unit", + models.CharField( + blank=True, + choices=[ + ("days", "Days"), + ("months", "Months"), + ("years", "Years"), + ], + default="days", + max_length=20, + null=True, + verbose_name="Duration Unit", + ), + ), + ( + "duration", + models.IntegerField( + default=1, + validators=[django.core.validators.MinValueValidator(0)], + ), + ), + ("add_assignees", models.BooleanField(default=False)), + ("archive", models.BooleanField(default=False)), + ("self_employee_progress_update", models.BooleanField(default=True)), + ( + "assignees", + models.ManyToManyField( + blank=True, + related_name="assignees_objective", + to="employee.employee", + verbose_name="Assignees", + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "key_result_id", + models.ManyToManyField( + blank=True, + related_name="objective", + to="pms.keyresult", + verbose_name="Default Key results", + ), + ), + ( + "managers", + models.ManyToManyField( + blank=True, + related_name="objective", + to="employee.employee", + verbose_name="Managers", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "ordering": ["-id"], + }, + ), + migrations.CreateModel( + name="HistoricalEmployeeObjective", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "objective", + models.CharField( + blank=True, max_length=100, null=True, verbose_name="Title" + ), + ), + ( + "objective_description", + models.TextField( + blank=True, + max_length=255, + null=True, + verbose_name="Description", + ), + ), + ("created_at", models.DateField(blank=True, editable=False)), + ("updated_at", models.DateField(blank=True, editable=False)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ( + "status", + models.CharField( + choices=[ + ("Not Started", "Not Started"), + ("On Track", "On Track"), + ("Behind", "Behind"), + ("At Risk", "At Risk"), + ("Closed", "Closed"), + ], + default="Not Started", + max_length=20, + ), + ), + ("progress_percentage", models.IntegerField(default=0)), + ("archive", models.BooleanField(default=False)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="pms.employeeobjective", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "objective_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="pms.objective", + verbose_name="Objective", + ), + ), + ], + options={ + "verbose_name": "historical employee objective", + "verbose_name_plural": "historical employee objectives", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="employeeobjective", + name="objective_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="employee_objective", + to="pms.objective", + verbose_name="Objective", + ), + ), + migrations.CreateModel( + name="Period", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("period_name", models.CharField(max_length=150, unique=True)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ( + "company_id", + models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Question", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("question", models.CharField(max_length=250)), + ( + "question_type", + models.CharField( + blank=True, + choices=[ + ("1", "Text"), + ("2", "Rating"), + ("3", "Boolean"), + ("4", "Multi-choices"), + ("5", "Likert"), + ], + max_length=100, + null=True, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="MeetingsAnswer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("answer", models.JSONField(blank=True, max_length=200, null=True)), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="employee_meeting_answer", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "meeting_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="meeting_answer", + to="pms.meetings", + ), + ), + ( + "question_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="meeting_answer_question_id", + to="pms.question", + ), + ), + ], + ), + migrations.CreateModel( + name="Answer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("answer", models.JSONField(blank=True, max_length=200, null=True)), + ( + "employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="employee_answer", + to="employee.employee", + ), + ), + ( + "feedback_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="feedback_answer", + to="pms.feedback", + ), + ), + ( + "question_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="answer_question_id", + to="pms.question", + ), + ), + ], + ), + migrations.CreateModel( + name="QuestionOptions", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("option_a", models.CharField(blank=True, max_length=250, null=True)), + ("option_b", models.CharField(blank=True, max_length=250, null=True)), + ("option_c", models.CharField(blank=True, max_length=250, null=True)), + ("option_d", models.CharField(blank=True, max_length=250, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "question_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="question_options", + to="pms.question", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="QuestionTemplate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "question_template", + models.CharField(max_length=100, unique=True, verbose_name="Title"), + ), + ( + "company_id", + models.ManyToManyField( + blank=True, to="base.company", verbose_name="Company" + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.AddField( + model_name="question", + name="template_id", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="question", + to="pms.questiontemplate", + ), + ), + migrations.AddField( + model_name="meetings", + name="question_template", + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="pms.questiontemplate", + ), + ), + migrations.AddField( + model_name="feedback", + name="question_template_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="feedback_question_template", + to="pms.questiontemplate", + verbose_name="Question Template", + ), + ), + migrations.AlterUniqueTogether( + name="employeeobjective", + unique_together={("employee_id", "objective_id")}, + ), + ] diff --git a/project/migrations/0001_initial.py b/project/migrations/0001_initial.py new file mode 100644 index 000000000..54ac75194 --- /dev/null +++ b/project/migrations/0001_initial.py @@ -0,0 +1,437 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.db.models.deletion +import django.utils.timezone +import horilla.models +import project.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Project", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField(max_length=200, unique=True, verbose_name="Name"), + ), + ( + "status", + models.CharField( + choices=[ + ("new", "New"), + ("in_progress", "In Progress"), + ("completed", "Completed"), + ("on_hold", "On Hold"), + ("cancelled", "Cancelled"), + ("expired", "Expired"), + ], + default="new", + max_length=250, + verbose_name="Status", + ), + ), + ("start_date", models.DateField(verbose_name="Start Date")), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "document", + models.FileField( + blank=True, + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Project File", + ), + ), + ("description", models.TextField(verbose_name="Description")), + ( + "company_id", + models.ForeignKey( + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "managers", + models.ManyToManyField( + blank=True, + related_name="project_managers", + to="employee.employee", + verbose_name="Project Managers", + ), + ), + ( + "members", + models.ManyToManyField( + blank=True, + related_name="project_members", + to="employee.employee", + verbose_name="Project Members", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Project", + "verbose_name_plural": "Projects", + }, + ), + migrations.CreateModel( + name="ProjectStage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=200, verbose_name="Title")), + ( + "sequence", + models.IntegerField(blank=True, editable=False, null=True), + ), + ( + "is_end_stage", + models.BooleanField(default=False, verbose_name="Is end stage"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "project", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="project_stages", + to="project.project", + verbose_name="Project", + ), + ), + ], + options={ + "verbose_name": "Project Stage", + "verbose_name_plural": "Project Stages", + "unique_together": {("project", "title")}, + }, + ), + migrations.CreateModel( + name="Task", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=200, verbose_name="Title")), + ( + "status", + models.CharField( + choices=[ + ("to_do", "To Do"), + ("in_progress", "In Progress"), + ("completed", "Completed"), + ("expired", "Expired"), + ], + default="to_do", + max_length=250, + verbose_name="Status", + ), + ), + ( + "start_date", + models.DateField(blank=True, null=True, verbose_name="Start Date"), + ), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "document", + models.FileField( + blank=True, + null=True, + upload_to=horilla.models.upload_path, + verbose_name="Task File", + ), + ), + ("description", models.TextField(verbose_name="Description")), + ("sequence", models.IntegerField(default=0)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "project", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="project.project", + verbose_name="Project", + ), + ), + ( + "stage", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="tasks", + to="project.projectstage", + verbose_name="Project Stage", + ), + ), + ( + "task_managers", + models.ManyToManyField( + blank=True, to="employee.employee", verbose_name="Task Managers" + ), + ), + ( + "task_members", + models.ManyToManyField( + blank=True, + related_name="tasks", + to="employee.employee", + verbose_name="Task Members", + ), + ), + ], + options={ + "verbose_name": "Task", + "verbose_name_plural": "Tasks", + "unique_together": {("project", "title")}, + }, + ), + migrations.CreateModel( + name="TimeSheet", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Date" + ), + ), + ( + "time_spent", + models.CharField( + default="00:00", + max_length=10, + null=True, + validators=[project.models.validate_time_format], + verbose_name="Hours Spent", + ), + ), + ( + "status", + models.CharField( + choices=[ + ("in_Progress", "In Progress"), + ("completed", "Completed"), + ], + default="in_Progress", + max_length=250, + verbose_name="Status", + ), + ), + ( + "description", + models.TextField(blank=True, null=True, verbose_name="Description"), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "project_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="project_timesheet", + to="project.project", + verbose_name="Project", + ), + ), + ( + "task_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="task_timesheet", + to="project.task", + verbose_name="Task", + ), + ), + ], + options={ + "verbose_name": "Time Sheet", + "verbose_name_plural": "Time Sheets", + }, + ), + ] diff --git a/recruitment/migrations/0001_initial.py b/recruitment/migrations/0001_initial.py new file mode 100644 index 000000000..d46e45e8e --- /dev/null +++ b/recruitment/migrations/0001_initial.py @@ -0,0 +1,2182 @@ +# Generated by Django 5.2.7 on 2025-10-25 14:02 + +import django.core.validators +import django.db.models.deletion +import django.utils.timezone +import horilla.models +import recruitment.models +import simple_history.models +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + initial = True + + dependencies = [ + ("base", "0001_initial"), + ("employee", "0001_initial"), + ("horilla_audit", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="Candidate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "name", + models.CharField(max_length=100, null=True, verbose_name="Name"), + ), + ( + "profile", + models.ImageField(null=True, upload_to=horilla.models.upload_path), + ), + ("portfolio", models.URLField(blank=True)), + ( + "schedule_date", + models.DateTimeField( + blank=True, null=True, verbose_name="Schedule date" + ), + ), + ("email", models.EmailField(max_length=254, verbose_name="Email")), + ( + "mobile", + models.CharField( + blank=True, + max_length=15, + validators=[recruitment.models.validate_mobile], + verbose_name="Mobile", + ), + ), + ( + "resume", + models.FileField( + upload_to=horilla.models.upload_path, + validators=[recruitment.models.validate_pdf], + ), + ), + ( + "address", + models.TextField( + blank=True, max_length=255, null=True, verbose_name="Address" + ), + ), + ( + "country", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="Country" + ), + ), + ( + "dob", + models.DateField( + blank=True, null=True, verbose_name="Date of Birth" + ), + ), + ( + "state", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="State" + ), + ), + ( + "city", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="City" + ), + ), + ( + "zip", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="Zip Code" + ), + ), + ( + "gender", + models.CharField( + choices=[ + ("male", "Male"), + ("female", "Female"), + ("other", "Other"), + ], + default="male", + max_length=15, + null=True, + verbose_name="Gender", + ), + ), + ( + "source", + models.CharField( + blank=True, + choices=[ + ("application", "Application Form"), + ("software", "Inside software"), + ("other", "Other"), + ], + max_length=20, + null=True, + verbose_name="Source", + ), + ), + ( + "start_onboard", + models.BooleanField(default=False, verbose_name="Start Onboard"), + ), + ("hired", models.BooleanField(default=False, verbose_name="Hired")), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ( + "converted", + models.BooleanField(default=False, verbose_name="Converted"), + ), + ( + "joining_date", + models.DateField( + blank=True, null=True, verbose_name="Joining Date" + ), + ), + ("sequence", models.IntegerField(default=0, null=True)), + ("probation_end", models.DateField(editable=False, null=True)), + ( + "offer_letter_status", + models.CharField( + choices=[ + ("not_sent", "Not Sent"), + ("sent", "Sent"), + ("accepted", "Accepted"), + ("rejected", "Rejected"), + ("joined", "Joined"), + ], + default="not_sent", + editable=False, + max_length=10, + verbose_name="Offer Letter Status", + ), + ), + ("last_updated", models.DateField(auto_now=True, null=True)), + ("hired_date", models.DateField(blank=True, editable=False, null=True)), + ( + "converted_employee_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="candidate_get", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "referral", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="candidate_referral", + to="employee.employee", + verbose_name="Referral", + ), + ), + ], + options={ + "verbose_name": "Candidate", + "verbose_name_plural": "Candidates", + "ordering": ["sequence"], + "permissions": ( + ("view_history", "View Candidate History"), + ("archive_candidate", "Archive Candidate"), + ), + }, + ), + migrations.CreateModel( + name="CandidateDocumentRequest", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100)), + ( + "format", + models.CharField( + choices=[ + ("any", "Any"), + ("pdf", "PDF"), + ("txt", "TXT"), + ("docx", "DOCX"), + ("xlsx", "XLSX"), + ("jpg", "JPG"), + ("png", "PNG"), + ("jpeg", "JPEG"), + ], + max_length=10, + ), + ), + ("max_size", models.IntegerField(blank=True, null=True)), + ("description", models.TextField(blank=True, null=True)), + ("candidate_id", models.ManyToManyField(to="recruitment.candidate")), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="CandidateDocument", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=250)), + ( + "document", + models.FileField(null=True, upload_to=horilla.models.upload_path), + ), + ( + "status", + models.CharField( + choices=[ + ("requested", "Requested"), + ("approved", "Approved"), + ("rejected", "Rejected"), + ], + default="requested", + max_length=10, + ), + ), + ( + "reject_reason", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + to="recruitment.candidate", + verbose_name="Candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "document_request_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="recruitment.candidatedocumentrequest", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="InterviewSchedule", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("interview_date", models.DateField(verbose_name="Interview Date")), + ("interview_time", models.TimeField(verbose_name="Interview Time")), + ( + "description", + models.TextField(blank=True, verbose_name="Description"), + ), + ( + "completed", + models.BooleanField( + default=False, verbose_name="Is Interview Completed" + ), + ), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="candidate_interview", + to="recruitment.candidate", + verbose_name="Candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ManyToManyField( + to="employee.employee", verbose_name="Interviewer" + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Schedule Interview", + "verbose_name_plural": "Schedule Interviews", + }, + ), + migrations.CreateModel( + name="LinkedInAccount", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("username", models.CharField(max_length=250, verbose_name="App Name")), + ("email", models.EmailField(max_length=254, verbose_name="Email")), + ( + "api_token", + models.CharField(max_length=500, verbose_name="API Token"), + ), + ("sub_id", models.CharField(max_length=250, unique=True)), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "LinkedIn Account", + "verbose_name_plural": "LinkedIn Accounts", + }, + ), + migrations.CreateModel( + name="Recruitment", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "title", + models.CharField( + blank=True, max_length=50, null=True, verbose_name="Title" + ), + ), + ( + "description", + models.TextField(null=True, verbose_name="Description"), + ), + ( + "is_event_based", + models.BooleanField( + default=False, + help_text="To start recruitment for multiple job positions", + ), + ), + ( + "closed", + models.BooleanField( + default=False, + help_text="To close the recruitment, If closed then not visible on pipeline view.", + verbose_name="Closed", + ), + ), + ( + "is_published", + models.BooleanField( + default=True, + help_text="To publish a recruitment in website, if false then it will not appear on open recruitment page.", + verbose_name="Is Published", + ), + ), + ( + "vacancy", + models.IntegerField(default=0, null=True, verbose_name="Vacancy"), + ), + ( + "start_date", + models.DateField( + default=django.utils.timezone.now, verbose_name="Start Date" + ), + ), + ( + "end_date", + models.DateField(blank=True, null=True, verbose_name="End Date"), + ), + ( + "linkedin_post_id", + models.CharField(blank=True, max_length=150, null=True), + ), + ( + "publish_in_linkedin", + models.BooleanField( + default=True, + help_text="To publish a recruitment in Linkedin, if active is false then it will not post on LinkedIn.", + verbose_name="Post on LinkedIn", + ), + ), + ( + "optional_profile_image", + models.BooleanField( + default=False, + help_text="Profile image not mandatory for candidate creation", + verbose_name="Optional Profile Image", + ), + ), + ( + "optional_resume", + models.BooleanField( + default=False, + help_text="Resume not mandatory for candidate creation", + verbose_name="Optional Resume", + ), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="recruitment", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "linkedin_account_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="recruitment.linkedinaccount", + verbose_name="LinkedIn Account", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "open_positions", + models.ManyToManyField( + blank=True, + related_name="open_positions", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "recruitment_managers", + models.ManyToManyField( + to="employee.employee", verbose_name="Managers" + ), + ), + ], + options={ + "verbose_name": "Recruitment", + "verbose_name_plural": "Recruitments", + "permissions": (("archive_recruitment", "Archive Recruitment"),), + }, + ), + migrations.AddField( + model_name="candidate", + name="recruitment_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate", + to="recruitment.recruitment", + verbose_name="Recruitment", + ), + ), + migrations.CreateModel( + name="RecruitmentGeneralSetting", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("candidate_self_tracking", models.BooleanField(default=False)), + ("show_overall_rating", models.BooleanField(default=False)), + ( + "company_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="RecruitmentSurvey", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("is_mandatory", models.BooleanField(default=False)), + ("question", models.TextField()), + ("sequence", models.IntegerField(default=0, null=True)), + ( + "type", + models.CharField( + choices=[ + ("checkbox", "Yes/No"), + ("options", "Choices"), + ("multiple", "Multiple Choice"), + ("text", "Text"), + ("number", "Number"), + ("percentage", "Percentage"), + ("date", "Date"), + ("textarea", "Textarea"), + ("file", "File Upload"), + ("rating", "Rating"), + ], + max_length=15, + ), + ), + ( + "options", + models.TextField( + default="", + help_text="Separate choices by ', '", + max_length=255, + null=True, + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "job_position_ids", + models.ManyToManyField( + editable=False, + to="base.jobposition", + verbose_name="Job Positions", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "recruitment_ids", + models.ManyToManyField( + to="recruitment.recruitment", verbose_name="Recruitment" + ), + ), + ], + options={ + "ordering": ["sequence"], + }, + ), + migrations.CreateModel( + name="QuestionOrdering", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("sequence", models.IntegerField(default=0)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "recruitment_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="recruitment.recruitment", + ), + ), + ( + "question_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="recruitment.recruitmentsurvey", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="RecruitmentSurveyAnswer", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("answer_json", models.JSONField()), + ( + "attachment", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "job_position_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "recruitment_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="recruitment.recruitment", + verbose_name="Recruitment", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="RejectedCandidate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("description", models.TextField(max_length=255)), + ( + "candidate_id", + models.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + related_name="rejected_candidate", + to="recruitment.candidate", + verbose_name="Candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="HistoricalRejectedCandidate", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ("description", models.TextField(max_length=255)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "candidate_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="recruitment.candidate", + verbose_name="Candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="recruitment.rejectedcandidate", + ), + ), + ], + options={ + "verbose_name": "historical rejected candidate", + "verbose_name_plural": "historical rejected candidates", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.CreateModel( + name="RejectReason", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50)), + ( + "description", + models.TextField(blank=True, max_length=255, null=True), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Reject Reason", + "verbose_name_plural": "Reject Reasons", + }, + ), + migrations.AddField( + model_name="rejectedcandidate", + name="reject_reason_id", + field=models.ManyToManyField( + blank=True, to="recruitment.rejectreason", verbose_name="Reject reason" + ), + ), + migrations.CreateModel( + name="Resume", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "file", + models.FileField( + upload_to=horilla.models.upload_path, + validators=[recruitment.models.validate_pdf], + ), + ), + ("is_candidate", models.BooleanField(default=False)), + ( + "recruitment_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="resume", + to="recruitment.recruitment", + ), + ), + ], + ), + migrations.CreateModel( + name="Skill", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=100)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Skill", + "verbose_name_plural": "Skills", + }, + ), + migrations.AddField( + model_name="recruitment", + name="skills", + field=models.ManyToManyField( + blank=True, to="recruitment.skill", verbose_name="Skills" + ), + ), + migrations.CreateModel( + name="SkillZone", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50, verbose_name="Skill Zone")), + ( + "description", + models.TextField(max_length=255, verbose_name="Description"), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Skill Zone", + "verbose_name_plural": "Skill Zones", + }, + ), + migrations.CreateModel( + name="SkillZoneCandidate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("reason", models.CharField(max_length=200, verbose_name="Reason")), + ("added_on", models.DateField(auto_now_add=True)), + ( + "candidate_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="skillzonecandidate_set", + to="recruitment.candidate", + verbose_name="Candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "skill_zone_id", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="skillzonecandidate_set", + to="recruitment.skillzone", + verbose_name="Skill Zone", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="Stage", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("stage", models.CharField(max_length=50, verbose_name="Stage")), + ( + "stage_type", + models.CharField( + choices=[ + ("initial", "Initial"), + ("applied", "Applied"), + ("test", "Test"), + ("interview", "Interview"), + ("cancelled", "Cancelled"), + ("hired", "Hired"), + ], + default="interview", + max_length=20, + verbose_name="Stage Type", + ), + ), + ("sequence", models.IntegerField(default=0, null=True)), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "recruitment_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="stage_set", + to="recruitment.recruitment", + verbose_name="Recruitment", + ), + ), + ( + "stage_managers", + models.ManyToManyField( + to="employee.employee", verbose_name="Stage Managers" + ), + ), + ], + options={ + "verbose_name": "Stage", + "verbose_name_plural": "Stages", + "ordering": ["sequence"], + "permissions": (("archive_Stage", "Archive Stage"),), + "unique_together": {("recruitment_id", "stage")}, + }, + ), + migrations.CreateModel( + name="HistoricalCandidate", + fields=[ + ( + "id", + models.BigIntegerField( + auto_created=True, blank=True, db_index=True, verbose_name="ID" + ), + ), + ( + "created_at", + models.DateTimeField( + blank=True, editable=False, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "history_title", + models.CharField(blank=True, max_length=20, null=True), + ), + ("history_description", models.TextField(null=True)), + ("history_highlight", models.BooleanField(default=False, null=True)), + ( + "name", + models.CharField(max_length=100, null=True, verbose_name="Name"), + ), + ("profile", models.TextField(max_length=100, null=True)), + ("portfolio", models.URLField(blank=True)), + ( + "schedule_date", + models.DateTimeField( + blank=True, null=True, verbose_name="Schedule date" + ), + ), + ("email", models.EmailField(max_length=254, verbose_name="Email")), + ( + "mobile", + models.CharField( + blank=True, + max_length=15, + validators=[recruitment.models.validate_mobile], + verbose_name="Mobile", + ), + ), + ( + "resume", + models.TextField( + max_length=100, validators=[recruitment.models.validate_pdf] + ), + ), + ( + "address", + models.TextField( + blank=True, max_length=255, null=True, verbose_name="Address" + ), + ), + ( + "country", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="Country" + ), + ), + ( + "dob", + models.DateField( + blank=True, null=True, verbose_name="Date of Birth" + ), + ), + ( + "state", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="State" + ), + ), + ( + "city", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="City" + ), + ), + ( + "zip", + models.CharField( + blank=True, max_length=30, null=True, verbose_name="Zip Code" + ), + ), + ( + "gender", + models.CharField( + choices=[ + ("male", "Male"), + ("female", "Female"), + ("other", "Other"), + ], + default="male", + max_length=15, + null=True, + verbose_name="Gender", + ), + ), + ( + "source", + models.CharField( + blank=True, + choices=[ + ("application", "Application Form"), + ("software", "Inside software"), + ("other", "Other"), + ], + max_length=20, + null=True, + verbose_name="Source", + ), + ), + ( + "start_onboard", + models.BooleanField(default=False, verbose_name="Start Onboard"), + ), + ("hired", models.BooleanField(default=False, verbose_name="Hired")), + ( + "canceled", + models.BooleanField(default=False, verbose_name="Canceled"), + ), + ( + "converted", + models.BooleanField(default=False, verbose_name="Converted"), + ), + ( + "joining_date", + models.DateField( + blank=True, null=True, verbose_name="Joining Date" + ), + ), + ("sequence", models.IntegerField(default=0, null=True)), + ("probation_end", models.DateField(editable=False, null=True)), + ( + "offer_letter_status", + models.CharField( + choices=[ + ("not_sent", "Not Sent"), + ("sent", "Sent"), + ("accepted", "Accepted"), + ("rejected", "Rejected"), + ("joined", "Joined"), + ], + default="not_sent", + editable=False, + max_length=10, + verbose_name="Offer Letter Status", + ), + ), + ( + "last_updated", + models.DateField(blank=True, editable=False, null=True), + ), + ("hired_date", models.DateField(blank=True, editable=False, null=True)), + ("history_id", models.AutoField(primary_key=True, serialize=False)), + ("history_date", models.DateTimeField(db_index=True)), + ("history_change_reason", models.CharField(max_length=100, null=True)), + ( + "history_type", + models.CharField( + choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], + max_length=1, + ), + ), + ( + "converted_employee_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Employee", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "history_relation", + models.ForeignKey( + db_constraint=False, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="history_set", + to="recruitment.candidate", + ), + ), + ("history_tags", models.ManyToManyField(to="horilla_audit.audittag")), + ( + "history_user", + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "job_position_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="base.jobposition", + verbose_name="Job Position", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + db_constraint=False, + editable=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "referral", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="employee.employee", + verbose_name="Referral", + ), + ), + ( + "recruitment_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="recruitment.recruitment", + verbose_name="Recruitment", + ), + ), + ( + "stage_id", + models.ForeignKey( + blank=True, + db_constraint=False, + null=True, + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="+", + to="recruitment.stage", + verbose_name="Stage", + ), + ), + ], + options={ + "verbose_name": "historical Candidate", + "verbose_name_plural": "historical Candidates", + "ordering": ("-history_date", "-history_id"), + "get_latest_by": ("history_date", "history_id"), + }, + bases=(simple_history.models.HistoricalChanges, models.Model), + ), + migrations.AddField( + model_name="candidate", + name="stage_id", + field=models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="recruitment.stage", + verbose_name="Stage", + ), + ), + migrations.CreateModel( + name="StageFiles", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "files", + models.FileField( + blank=True, null=True, upload_to=horilla.models.upload_path + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="StageNote", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("description", models.TextField(verbose_name="Description")), + ("candidate_can_view", models.BooleanField(default=False)), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ( + "stage_files", + models.ManyToManyField(blank=True, to="recruitment.stagefiles"), + ), + ( + "stage_id", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="recruitment.stage", + ), + ), + ( + "updated_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="employee.employee", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SurveyTemplate", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ("title", models.CharField(max_length=50, unique=True)), + ("description", models.TextField(blank=True, null=True)), + ( + "is_general_template", + models.BooleanField(default=False, editable=False), + ), + ( + "company_id", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + to="base.company", + verbose_name="Company", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "verbose_name": "Survey Template", + "verbose_name_plural": "Survey Templates", + }, + ), + migrations.AddField( + model_name="recruitmentsurvey", + name="template_id", + field=models.ManyToManyField( + blank=True, to="recruitment.surveytemplate", verbose_name="Template" + ), + ), + migrations.AddField( + model_name="recruitment", + name="survey_templates", + field=models.ManyToManyField( + blank=True, + to="recruitment.surveytemplate", + verbose_name="Survey Templates", + ), + ), + migrations.CreateModel( + name="CandidateRating", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "created_at", + models.DateTimeField( + auto_now_add=True, null=True, verbose_name="Created At" + ), + ), + ( + "is_active", + models.BooleanField(default=True, verbose_name="Is Active"), + ), + ( + "rating", + models.IntegerField( + validators=[ + django.core.validators.MinValueValidator(0), + django.core.validators.MaxValueValidator(5), + ] + ), + ), + ( + "candidate_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate_rating", + to="recruitment.candidate", + ), + ), + ( + "created_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to=settings.AUTH_USER_MODEL, + verbose_name="Created By", + ), + ), + ( + "employee_id", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="candidate_rating", + to="employee.employee", + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + editable=False, + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(class)s_modified_by", + to=settings.AUTH_USER_MODEL, + verbose_name="Modified By", + ), + ), + ], + options={ + "unique_together": {("employee_id", "candidate_id")}, + }, + ), + migrations.AlterUniqueTogether( + name="candidate", + unique_together={("email", "recruitment_id")}, + ), + migrations.AlterUniqueTogether( + name="recruitment", + unique_together={ + ("job_position_id", "start_date"), + ("job_position_id", "start_date", "company_id"), + }, + ), + ]