diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index 2085c86..391c2ee 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -5,40 +5,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -54,8 +53,8 @@
-
+
@@ -162,7 +161,7 @@
-
+
@@ -302,10 +301,6 @@
4
-
- file://$PROJECT_DIR$/templates/client-dashboard-content.html
-
-
diff --git a/accounts/migrations/0001_initial.py b/accounts/migrations/0001_initial.py
new file mode 100644
index 0000000..8ef029b
--- /dev/null
+++ b/accounts/migrations/0001_initial.py
@@ -0,0 +1,182 @@
+# Generated by Django 5.2.3 on 2025-06-27 11:42
+
+import django.contrib.auth.models
+import django.contrib.auth.validators
+import django.db.models.deletion
+import django.utils.timezone
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("auth", "0012_alter_user_first_name_max_length"),
+ ("common", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="ClientPermission",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ],
+ options={
+ "permissions": (
+ ("can_book_container", "Can book container"),
+ ("can_view_bookings", "Can view bookings"),
+ ("can_manage_company_users", "Can manage company users"),
+ ),
+ "managed": True,
+ "default_permissions": (),
+ },
+ ),
+ migrations.CreateModel(
+ name="DepotUser",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("password", models.CharField(max_length=128, verbose_name="password")),
+ (
+ "last_login",
+ models.DateTimeField(
+ blank=True, null=True, verbose_name="last login"
+ ),
+ ),
+ (
+ "is_superuser",
+ models.BooleanField(
+ default=False,
+ help_text="Designates that this user has all permissions without explicitly assigning them.",
+ verbose_name="superuser status",
+ ),
+ ),
+ (
+ "username",
+ models.CharField(
+ error_messages={
+ "unique": "A user with that username already exists."
+ },
+ help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ max_length=150,
+ unique=True,
+ validators=[
+ django.contrib.auth.validators.UnicodeUsernameValidator()
+ ],
+ verbose_name="username",
+ ),
+ ),
+ (
+ "first_name",
+ models.CharField(
+ blank=True, max_length=150, verbose_name="first name"
+ ),
+ ),
+ (
+ "last_name",
+ models.CharField(
+ blank=True, max_length=150, verbose_name="last name"
+ ),
+ ),
+ (
+ "is_staff",
+ models.BooleanField(
+ default=False,
+ help_text="Designates whether the user can log into this admin site.",
+ verbose_name="staff status",
+ ),
+ ),
+ (
+ "is_active",
+ models.BooleanField(
+ default=True,
+ help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
+ verbose_name="active",
+ ),
+ ),
+ (
+ "date_joined",
+ models.DateTimeField(
+ default=django.utils.timezone.now, verbose_name="date joined"
+ ),
+ ),
+ (
+ "phone_number",
+ models.CharField(blank=True, max_length=15, null=True),
+ ),
+ ("email", models.EmailField(max_length=254, unique=True)),
+ ("new_field1", models.BooleanField(default=False)),
+ ("is_company_admin", models.BooleanField(default=False)),
+ (
+ "company",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="user_lines",
+ to="common.companymodel",
+ ),
+ ),
+ (
+ "groups",
+ models.ManyToManyField(
+ blank=True,
+ help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
+ related_name="user_set",
+ related_query_name="user",
+ to="auth.group",
+ verbose_name="groups",
+ ),
+ ),
+ (
+ "line",
+ models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="user_lines",
+ to="common.linesmodel",
+ ),
+ ),
+ (
+ "user_permissions",
+ models.ManyToManyField(
+ blank=True,
+ help_text="Specific permissions for this user.",
+ related_name="user_set",
+ related_query_name="user",
+ to="auth.permission",
+ verbose_name="user permissions",
+ ),
+ ),
+ (
+ "company_permissions",
+ models.ManyToManyField(to="accounts.clientpermission"),
+ ),
+ ],
+ options={
+ "verbose_name": "user",
+ "verbose_name_plural": "users",
+ "abstract": False,
+ },
+ managers=[
+ ("objects", django.contrib.auth.models.UserManager()),
+ ],
+ ),
+ ]
diff --git a/accounts/migrations/0002_clientpermission_codename_clientpermission_name.py b/accounts/migrations/0002_clientpermission_codename_clientpermission_name.py
new file mode 100644
index 0000000..74a3605
--- /dev/null
+++ b/accounts/migrations/0002_clientpermission_codename_clientpermission_name.py
@@ -0,0 +1,23 @@
+# Generated by Django 5.2.3 on 2025-07-02 08:02
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="clientpermission",
+ name="codename",
+ field=models.CharField(default="", max_length=100),
+ ),
+ migrations.AddField(
+ model_name="clientpermission",
+ name="name",
+ field=models.CharField(default="", max_length=255),
+ ),
+ ]
diff --git a/accounts/migrations/0003_remove_depotuser_is_company_admin_and_more.py b/accounts/migrations/0003_remove_depotuser_is_company_admin_and_more.py
new file mode 100644
index 0000000..23a8704
--- /dev/null
+++ b/accounts/migrations/0003_remove_depotuser_is_company_admin_and_more.py
@@ -0,0 +1,35 @@
+# Generated by Django 5.2.3 on 2025-07-02 12:04
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0002_clientpermission_codename_clientpermission_name"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="depotuser",
+ name="is_company_admin",
+ ),
+ migrations.RemoveField(
+ model_name="depotuser",
+ name="new_field1",
+ ),
+ migrations.AddField(
+ model_name="depotuser",
+ name="user_type",
+ field=models.CharField(
+ choices=[
+ ("BS", "Barrier Staff"),
+ ("CA", "Company Admin"),
+ ("EM", "Employee"),
+ ("CL", "Client"),
+ ],
+ default="CL",
+ max_length=2,
+ ),
+ ),
+ ]
diff --git a/accounts/migrations/0004_employeepermission_depotuser_employee_permissions.py b/accounts/migrations/0004_employeepermission_depotuser_employee_permissions.py
new file mode 100644
index 0000000..f6b9106
--- /dev/null
+++ b/accounts/migrations/0004_employeepermission_depotuser_employee_permissions.py
@@ -0,0 +1,43 @@
+# Generated by Django 5.2.3 on 2025-07-03 08:11
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0003_remove_depotuser_is_company_admin_and_more"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="EmployeePermission",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("codename", models.CharField(default="", max_length=100)),
+ ("name", models.CharField(default="", max_length=255)),
+ ],
+ options={
+ "permissions": (
+ ("can_manage_containers", "Can manage containers"),
+ ("can_view_reports", "Can view reports"),
+ ("can_handle_operations", "Can handle operations"),
+ ),
+ "managed": True,
+ "default_permissions": (),
+ },
+ ),
+ migrations.AddField(
+ model_name="depotuser",
+ name="employee_permissions",
+ field=models.ManyToManyField(blank=True, to="accounts.employeepermission"),
+ ),
+ ]
diff --git a/accounts/migrations/0005_alter_depotuser_managers_alter_depotuser_user_type.py b/accounts/migrations/0005_alter_depotuser_managers_alter_depotuser_user_type.py
new file mode 100644
index 0000000..ace2c6a
--- /dev/null
+++ b/accounts/migrations/0005_alter_depotuser_managers_alter_depotuser_user_type.py
@@ -0,0 +1,32 @@
+# Generated by Django 5.2.3 on 2025-07-03 14:17
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0004_employeepermission_depotuser_employee_permissions"),
+ ]
+
+ operations = [
+ migrations.AlterModelManagers(
+ name="depotuser",
+ managers=[],
+ ),
+ migrations.AlterField(
+ model_name="depotuser",
+ name="user_type",
+ field=models.CharField(
+ choices=[
+ ("BS", "Barrier Staff"),
+ ("CA", "Company Admin"),
+ ("EM", "Employee"),
+ ("CL", "Client"),
+ ("AD", "Admin"),
+ ],
+ default="CL",
+ max_length=2,
+ ),
+ ),
+ ]
diff --git a/accounts/migrations/0006_alter_clientpermission_options.py b/accounts/migrations/0006_alter_clientpermission_options.py
new file mode 100644
index 0000000..1b39ecf
--- /dev/null
+++ b/accounts/migrations/0006_alter_clientpermission_options.py
@@ -0,0 +1,29 @@
+# Generated by Django 5.2.3 on 2025-07-09 12:51
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0005_alter_depotuser_managers_alter_depotuser_user_type"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="clientpermission",
+ options={
+ "default_permissions": (),
+ "managed": True,
+ "permissions": (
+ ("can_view_booking", "Can view booking"),
+ ("can_manage_booking", "Can book container"),
+ ("can_view_preinfo", "Can view preinfo"),
+ ("can_manage_preinfo", "Can manage preinfo"),
+ ("can_view_payment", "Can view payment"),
+ ("can_manage_payment", "Can manage payment"),
+ ("can_manage_company_users", "Can manage company users"),
+ ),
+ },
+ ),
+ ]
diff --git a/accounts/migrations/0007_auto_20250725_1920.py b/accounts/migrations/0007_auto_20250725_1920.py
new file mode 100644
index 0000000..ad9e5f2
--- /dev/null
+++ b/accounts/migrations/0007_auto_20250725_1920.py
@@ -0,0 +1,12 @@
+# Generated by Django 5.2.3 on 2025-07-25 16:20
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("accounts", "0006_alter_clientpermission_options"),
+ ]
+
+ operations = []
diff --git a/booking/migrations/0001_initial.py b/booking/migrations/0001_initial.py
new file mode 100644
index 0000000..72ebd06
--- /dev/null
+++ b/booking/migrations/0001_initial.py
@@ -0,0 +1,61 @@
+# Generated by Django 5.2.3 on 2025-06-27 10:20
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("common", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="BookingModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("number", models.CharField(max_length=50, unique=True)),
+ ("vehicles", models.CharField(blank=True, null=True)),
+ ("container_count", models.IntegerField()),
+ ("carrier", models.CharField(blank=True, max_length=100, null=True)),
+ ("visible", models.BooleanField(default=True)),
+ ("is_new", models.BooleanField(default=True)),
+ (
+ "container_number",
+ models.CharField(blank=True, max_length=11, null=True),
+ ),
+ ("vehicles_left", models.IntegerField(blank=True, null=True)),
+ ("created_on", models.DateTimeField(auto_now_add=True)),
+ ("created_by", models.IntegerField()),
+ ("updated_on", models.DateTimeField(auto_now=True)),
+ ("updated_by", models.IntegerField()),
+ (
+ "container_type",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="booking_container_types",
+ to="common.containertypemodel",
+ ),
+ ),
+ (
+ "line",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="booking_lines",
+ to="common.linesmodel",
+ ),
+ ),
+ ],
+ ),
+ ]
diff --git a/booking/migrations/0002_rename_bookingmodel_booking.py b/booking/migrations/0002_rename_bookingmodel_booking.py
new file mode 100644
index 0000000..8ea5c26
--- /dev/null
+++ b/booking/migrations/0002_rename_bookingmodel_booking.py
@@ -0,0 +1,19 @@
+# Generated by Django 5.2.3 on 2025-06-30 15:11
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("booking", "0001_initial"),
+ ("common", "0002_alter_companymodel_short_name_and_more"),
+ ("containers", "0005_alter_container_expedited_by_and_more"),
+ ]
+
+ operations = [
+ migrations.RenameModel(
+ old_name="BookingModel",
+ new_name="Booking",
+ ),
+ ]
diff --git a/booking/migrations/0003_booking_container_expedited_count.py b/booking/migrations/0003_booking_container_expedited_count.py
new file mode 100644
index 0000000..1befeaa
--- /dev/null
+++ b/booking/migrations/0003_booking_container_expedited_count.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.3 on 2025-07-01 08:41
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("booking", "0002_rename_bookingmodel_booking"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="booking",
+ name="container_expedited_count",
+ field=models.IntegerField(default=0),
+ ),
+ ]
diff --git a/booking/migrations/0004_booking_status.py b/booking/migrations/0004_booking_status.py
new file mode 100644
index 0000000..14a9843
--- /dev/null
+++ b/booking/migrations/0004_booking_status.py
@@ -0,0 +1,26 @@
+# Generated by Django 5.2.3 on 2025-07-01 09:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("booking", "0003_booking_container_expedited_count"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="booking",
+ name="status",
+ field=models.CharField(
+ choices=[
+ ("active", "Active"),
+ ("finished", "Finished"),
+ ("canceled", "Canceled"),
+ ],
+ default="active",
+ max_length=10,
+ ),
+ ),
+ ]
diff --git a/booking/migrations/0005_alter_booking_vehicles_left.py b/booking/migrations/0005_alter_booking_vehicles_left.py
new file mode 100644
index 0000000..977f7be
--- /dev/null
+++ b/booking/migrations/0005_alter_booking_vehicles_left.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.3 on 2025-07-01 09:31
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("booking", "0004_booking_status"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="booking",
+ name="vehicles_left",
+ field=models.CharField(blank=True, null=True),
+ ),
+ ]
diff --git a/booking/views/common.py b/booking/views/common.py
new file mode 100644
index 0000000..e69de29
diff --git a/common/migrations/0001_initial.py b/common/migrations/0001_initial.py
new file mode 100644
index 0000000..9eb6bbe
--- /dev/null
+++ b/common/migrations/0001_initial.py
@@ -0,0 +1,132 @@
+# Generated by Django 5.2.3 on 2025-06-27 10:20
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = []
+
+ operations = [
+ migrations.CreateModel(
+ name="CompanyModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=100, unique=True)),
+ ("short_name", models.CharField(max_length=5, unique=True)),
+ ("description", models.TextField(blank=True, null=True)),
+ ],
+ options={
+ "ordering": ["name"],
+ "abstract": False,
+ },
+ ),
+ migrations.CreateModel(
+ name="ContainerKindModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=100, unique=True)),
+ ("short_name", models.CharField(max_length=5, unique=True)),
+ ("description", models.TextField(blank=True, null=True)),
+ ],
+ options={
+ "ordering": ["name"],
+ "abstract": False,
+ },
+ ),
+ migrations.CreateModel(
+ name="OperationModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=100, unique=True)),
+ ("short_name", models.CharField(max_length=5, unique=True)),
+ ("description", models.TextField(blank=True, null=True)),
+ ],
+ options={
+ "ordering": ["name"],
+ "abstract": False,
+ },
+ ),
+ migrations.CreateModel(
+ name="ContainerTypeModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=6, unique=True)),
+ ("length", models.IntegerField()),
+ ("height", models.BooleanField()),
+ ("deleted", models.BooleanField(default=False)),
+ (
+ "container_type",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_type_container_kinds",
+ to="common.containerkindmodel",
+ ),
+ ),
+ ],
+ ),
+ migrations.CreateModel(
+ name="LinesModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=100, unique=True)),
+ ("short_name", models.CharField(max_length=5, unique=True)),
+ ("description", models.TextField(blank=True, null=True)),
+ (
+ "company",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="line_company",
+ to="common.companymodel",
+ ),
+ ),
+ ],
+ options={
+ "ordering": ["name"],
+ "abstract": False,
+ },
+ ),
+ ]
diff --git a/common/migrations/0002_alter_companymodel_short_name_and_more.py b/common/migrations/0002_alter_companymodel_short_name_and_more.py
new file mode 100644
index 0000000..054cdb5
--- /dev/null
+++ b/common/migrations/0002_alter_companymodel_short_name_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 5.2.3 on 2025-06-27 15:12
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("common", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="companymodel",
+ name="short_name",
+ field=models.CharField(blank=True, max_length=5, null=True),
+ ),
+ migrations.AlterField(
+ model_name="containerkindmodel",
+ name="short_name",
+ field=models.CharField(blank=True, max_length=5, null=True),
+ ),
+ migrations.AlterField(
+ model_name="linesmodel",
+ name="short_name",
+ field=models.CharField(blank=True, max_length=5, null=True),
+ ),
+ migrations.AlterField(
+ model_name="operationmodel",
+ name="short_name",
+ field=models.CharField(blank=True, max_length=5, null=True),
+ ),
+ ]
diff --git a/common/migrations/0003_auto_20250725_1920.py b/common/migrations/0003_auto_20250725_1920.py
new file mode 100644
index 0000000..8a6a213
--- /dev/null
+++ b/common/migrations/0003_auto_20250725_1920.py
@@ -0,0 +1,12 @@
+# Generated by Django 5.2.3 on 2025-07-25 16:20
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("common", "0002_alter_companymodel_short_name_and_more"),
+ ]
+
+ operations = []
diff --git a/common/migrations/0005_companymodel_active_containerkindmodel_active_and_more.py b/common/migrations/0005_companymodel_active_containerkindmodel_active_and_more.py
new file mode 100644
index 0000000..6b77af7
--- /dev/null
+++ b/common/migrations/0005_companymodel_active_containerkindmodel_active_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 5.2.3 on 2025-07-30 14:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("common", "0004_populate_initial_data"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="companymodel",
+ name="active",
+ field=models.BooleanField(default=True),
+ ),
+ migrations.AddField(
+ model_name="containerkindmodel",
+ name="active",
+ field=models.BooleanField(default=True),
+ ),
+ migrations.AddField(
+ model_name="linesmodel",
+ name="active",
+ field=models.BooleanField(default=True),
+ ),
+ migrations.AddField(
+ model_name="operationmodel",
+ name="active",
+ field=models.BooleanField(default=True),
+ ),
+ ]
diff --git a/containers/migrations/0001_initial.py b/containers/migrations/0001_initial.py
new file mode 100644
index 0000000..a4b5adc
--- /dev/null
+++ b/containers/migrations/0001_initial.py
@@ -0,0 +1,112 @@
+# Generated by Django 5.2.3 on 2025-06-27 10:20
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("booking", "0001_initial"),
+ ("common", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="Container",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("number", models.CharField(max_length=11)),
+ ("received_on", models.DateTimeField(auto_now_add=True)),
+ ("received_by", models.IntegerField()),
+ (
+ "receive_vehicles",
+ models.CharField(blank=True, max_length=100, null=True),
+ ),
+ ("damages", models.TextField(blank=True, null=True)),
+ ("heavy_damaged", models.BooleanField(default=False)),
+ ("position", models.CharField(blank=True, max_length=100, null=True)),
+ ("swept", models.BooleanField(default=False)),
+ ("swept_on", models.DateTimeField(blank=True, null=True)),
+ ("swept_by", models.IntegerField(blank=True, null=True)),
+ ("washed", models.BooleanField(default=False)),
+ ("washed_on", models.DateTimeField(blank=True, null=True)),
+ ("washed_by", models.IntegerField(blank=True, null=True)),
+ ("expedited", models.BooleanField(default=False)),
+ ("expedited_on", models.DateTimeField(blank=True, null=True)),
+ ("expedited_by", models.IntegerField(blank=True, null=True)),
+ (
+ "expedition_vehicle",
+ models.CharField(blank=True, max_length=100, null=True),
+ ),
+ (
+ "booking",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_bookings",
+ to="booking.bookingmodel",
+ ),
+ ),
+ (
+ "container_type",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_container_types",
+ to="common.containertypemodel",
+ ),
+ ),
+ (
+ "line_id",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_lines",
+ to="common.linesmodel",
+ ),
+ ),
+ ],
+ ),
+ migrations.CreateModel(
+ name="ContainerHistory",
+ fields=[
+ (
+ "container_ptr",
+ models.OneToOneField(
+ auto_created=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ parent_link=True,
+ primary_key=True,
+ serialize=False,
+ to="containers.container",
+ ),
+ ),
+ ("operation_date", models.DateTimeField(auto_now_add=True)),
+ (
+ "container",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="history_containers",
+ to="containers.container",
+ ),
+ ),
+ (
+ "operation",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="history_operations",
+ to="common.operationmodel",
+ ),
+ ),
+ ],
+ bases=("containers.container",),
+ ),
+ ]
diff --git a/containers/migrations/0002_rename_receive_vehicles_container_receive_vehicle.py b/containers/migrations/0002_rename_receive_vehicles_container_receive_vehicle.py
new file mode 100644
index 0000000..6b8e489
--- /dev/null
+++ b/containers/migrations/0002_rename_receive_vehicles_container_receive_vehicle.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.3 on 2025-06-28 06:15
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("containers", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name="container",
+ old_name="receive_vehicles",
+ new_name="receive_vehicle",
+ ),
+ ]
diff --git a/containers/migrations/0003_alter_container_booking.py b/containers/migrations/0003_alter_container_booking.py
new file mode 100644
index 0000000..649ab21
--- /dev/null
+++ b/containers/migrations/0003_alter_container_booking.py
@@ -0,0 +1,26 @@
+# Generated by Django 5.2.3 on 2025-06-28 08:36
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("booking", "0001_initial"),
+ ("containers", "0002_rename_receive_vehicles_container_receive_vehicle"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="container",
+ name="booking",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_bookings",
+ to="booking.bookingmodel",
+ ),
+ ),
+ ]
diff --git a/containers/migrations/0004_rename_line_id_container_line.py b/containers/migrations/0004_rename_line_id_container_line.py
new file mode 100644
index 0000000..0e743f9
--- /dev/null
+++ b/containers/migrations/0004_rename_line_id_container_line.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2.3 on 2025-06-28 12:23
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("containers", "0003_alter_container_booking"),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name="container",
+ old_name="line_id",
+ new_name="line",
+ ),
+ ]
diff --git a/containers/migrations/0005_alter_container_expedited_by_and_more.py b/containers/migrations/0005_alter_container_expedited_by_and_more.py
new file mode 100644
index 0000000..c2fa8a7
--- /dev/null
+++ b/containers/migrations/0005_alter_container_expedited_by_and_more.py
@@ -0,0 +1,58 @@
+# Generated by Django 5.2.3 on 2025-06-28 12:30
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("containers", "0004_rename_line_id_container_line"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="container",
+ name="expedited_by",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_expedited_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AlterField(
+ model_name="container",
+ name="received_by",
+ field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_received_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AlterField(
+ model_name="container",
+ name="swept_by",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_swept_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AlterField(
+ model_name="container",
+ name="washed_by",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_washed_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ]
diff --git a/containers/migrations/0006_containerphotos.py b/containers/migrations/0006_containerphotos.py
new file mode 100644
index 0000000..cd1b6b6
--- /dev/null
+++ b/containers/migrations/0006_containerphotos.py
@@ -0,0 +1,48 @@
+# Generated by Django 5.2.3 on 2025-07-11 17:43
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("containers", "0005_alter_container_expedited_by_and_more"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="ContainerPhotos",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("photo", models.TextField(blank=True, null=True)),
+ ("uploaded_on", models.DateTimeField(auto_now_add=True)),
+ (
+ "container",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="photos",
+ to="containers.container",
+ ),
+ ),
+ (
+ "uploaded_by",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_photos_uploaded_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ ),
+ ]
diff --git a/containers/migrations/0007_container_preinfo.py b/containers/migrations/0007_container_preinfo.py
new file mode 100644
index 0000000..15f0bcc
--- /dev/null
+++ b/containers/migrations/0007_container_preinfo.py
@@ -0,0 +1,26 @@
+# Generated by Django 5.2.3 on 2025-07-18 07:05
+
+import django.db.models.deletion
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("containers", "0006_containerphotos"),
+ ("preinfo", "0003_rename_preinfomodel_preinfo"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="container",
+ name="preinfo",
+ field=models.ForeignKey(
+ default=1,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="container_preinfo",
+ to="preinfo.preinfo",
+ ),
+ preserve_default=False,
+ ),
+ ]
diff --git a/damages_api/__init__.py b/damages_api/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/payments/migrations/0001_initial.py b/payments/migrations/0001_initial.py
new file mode 100644
index 0000000..b58916d
--- /dev/null
+++ b/payments/migrations/0001_initial.py
@@ -0,0 +1,90 @@
+# Generated by Django 5.2.3 on 2025-07-14 07:49
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("common", "0002_alter_companymodel_short_name_and_more"),
+ ("containers", "0006_containerphotos"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="Payment",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("invoice_number", models.CharField(max_length=50, unique=True)),
+ ("total_amount", models.DecimalField(decimal_places=2, max_digits=10)),
+ ("created_on", models.DateTimeField(auto_now_add=True)),
+ ("paid", models.BooleanField(default=False)),
+ ("paid_on", models.DateTimeField(auto_now_add=True)),
+ ("paid_info", models.TextField(blank=True, null=True)),
+ (
+ "description",
+ models.CharField(blank=True, max_length=255, null=True),
+ ),
+ (
+ "company",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="payment_company",
+ to="common.companymodel",
+ ),
+ ),
+ (
+ "created_by",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="payments_user",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ],
+ ),
+ migrations.CreateModel(
+ name="PaymentItem",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("amount", models.DecimalField(decimal_places=2, max_digits=10)),
+ (
+ "container",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="payment_containers",
+ to="containers.container",
+ ),
+ ),
+ (
+ "payment",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="payment_items",
+ to="payments.payment",
+ ),
+ ),
+ ],
+ ),
+ ]
diff --git a/payments/migrations/0002_additionalfees_containertariffperiod.py b/payments/migrations/0002_additionalfees_containertariffperiod.py
new file mode 100644
index 0000000..f9fbb58
--- /dev/null
+++ b/payments/migrations/0002_additionalfees_containertariffperiod.py
@@ -0,0 +1,70 @@
+# Generated by Django 5.2.3 on 2025-07-15 18:07
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("payments", "0001_initial"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="AdditionalFees",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "reefer_daily_supplement",
+ models.DecimalField(decimal_places=2, default=3.0, max_digits=6),
+ ),
+ (
+ "sweeping_fee",
+ models.DecimalField(decimal_places=2, default=35.0, max_digits=6),
+ ),
+ (
+ "fumigation_fee",
+ models.DecimalField(decimal_places=2, default=75.0, max_digits=6),
+ ),
+ ],
+ options={
+ "verbose_name": "Additional Fees",
+ "verbose_name_plural": "Additional Fees",
+ },
+ ),
+ migrations.CreateModel(
+ name="ContainerTariffPeriod",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "container_size",
+ models.CharField(
+ choices=[("20", "20 feet"), ("40", "40/45 feet")], max_length=2
+ ),
+ ),
+ ("from_days", models.PositiveIntegerField()),
+ ("to_days", models.PositiveIntegerField(blank=True, null=True)),
+ ("daily_rate", models.DecimalField(decimal_places=2, max_digits=6)),
+ ],
+ options={
+ "ordering": ["container_size", "from_days"],
+ "unique_together": {("container_size", "from_days")},
+ },
+ ),
+ ]
diff --git a/payments/migrations/0003_auto_20250725_1920.py b/payments/migrations/0003_auto_20250725_1920.py
new file mode 100644
index 0000000..2ba2802
--- /dev/null
+++ b/payments/migrations/0003_auto_20250725_1920.py
@@ -0,0 +1,12 @@
+# Generated by Django 5.2.3 on 2025-07-25 16:20
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("payments", "0002_additionalfees_containertariffperiod"),
+ ]
+
+ operations = []
diff --git a/payments/migrations/__init__.py b/payments/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/preinfo/migrations/0001_initial.py b/preinfo/migrations/0001_initial.py
new file mode 100644
index 0000000..9b59db5
--- /dev/null
+++ b/preinfo/migrations/0001_initial.py
@@ -0,0 +1,72 @@
+# Generated by Django 5.2.3 on 2025-06-27 10:20
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("common", "0001_initial"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="PreinfoModel",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("container_number", models.CharField(max_length=11)),
+ ("created_on", models.DateTimeField(auto_now_add=True)),
+ ("deleted", models.BooleanField(default=False)),
+ ("deleted_on", models.DateTimeField(null=True)),
+ ("received", models.BooleanField(default=False)),
+ (
+ "container_type",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="preinfo_container_types",
+ to="common.containertypemodel",
+ ),
+ ),
+ (
+ "created_by",
+ models.ForeignKey(
+ db_column="created_by_id",
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="preinfo_created_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ (
+ "deleted_by",
+ models.ForeignKey(
+ db_column="deleted_by_id",
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="preinfo_deleted_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ (
+ "line",
+ models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="preinfo_lines",
+ to="common.linesmodel",
+ ),
+ ),
+ ],
+ ),
+ ]
diff --git a/preinfo/migrations/0002_alter_preinfomodel_deleted_by_and_more.py b/preinfo/migrations/0002_alter_preinfomodel_deleted_by_and_more.py
new file mode 100644
index 0000000..d210937
--- /dev/null
+++ b/preinfo/migrations/0002_alter_preinfomodel_deleted_by_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 5.2.3 on 2025-06-28 06:15
+
+import django.db.models.deletion
+from django.conf import settings
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("preinfo", "0001_initial"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="preinfomodel",
+ name="deleted_by",
+ field=models.ForeignKey(
+ blank=True,
+ db_column="deleted_by_id",
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="preinfo_deleted_by",
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ migrations.AlterField(
+ model_name="preinfomodel",
+ name="deleted_on",
+ field=models.DateTimeField(blank=True, null=True),
+ ),
+ ]
diff --git a/preinfo/migrations/0003_rename_preinfomodel_preinfo.py b/preinfo/migrations/0003_rename_preinfomodel_preinfo.py
new file mode 100644
index 0000000..3b56d5c
--- /dev/null
+++ b/preinfo/migrations/0003_rename_preinfomodel_preinfo.py
@@ -0,0 +1,20 @@
+# Generated by Django 5.2.3 on 2025-06-30 08:20
+
+from django.conf import settings
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("common", "0002_alter_companymodel_short_name_and_more"),
+ ("preinfo", "0002_alter_preinfomodel_deleted_by_and_more"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.RenameModel(
+ old_name="PreinfoModel",
+ new_name="Preinfo",
+ ),
+ ]