feat(pricing): add workspace user rates and price units

This commit is contained in:
2026-04-26 10:19:04 +03:30
parent f960ca8221
commit fadf898486
19 changed files with 731 additions and 266 deletions

View File

@@ -0,0 +1,89 @@
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import uuid
class Migration(migrations.Migration):
dependencies = [
("workspaces", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="WorkspaceUserRate",
fields=[
("id", models.UUIDField(default=uuid.uuid7, primary_key=True, serialize=False)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("deleted_at", models.DateTimeField(blank=True, null=True)),
("is_deleted", models.BooleanField(default=False)),
("is_active", models.BooleanField(default=False)),
(
"created_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="created_workspaces_workspaceuserrate_set",
to=settings.AUTH_USER_MODEL,
),
),
(
"updated_by",
models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="updated_workspaces_workspaceuserrate_set",
to=settings.AUTH_USER_MODEL,
),
),
("hourly_rate", models.DecimalField(decimal_places=2, max_digits=10)),
("currency", models.CharField(default="USD", max_length=3)),
("effective_from", models.DateTimeField()),
(
"user",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="workspace_rates",
to=settings.AUTH_USER_MODEL,
),
),
(
"workspace",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="user_rates",
to="workspaces.workspace",
),
),
],
options={
"db_table": "workspace_user_rate",
"ordering": ("-effective_from",),
},
),
migrations.AddIndex(
model_name="workspaceuserrate",
index=models.Index(fields=["id"], name="workspaceuserrate_id_idx"),
),
migrations.AddIndex(
model_name="workspaceuserrate",
index=models.Index(fields=["workspace"], name="wur_workspace_idx"),
),
migrations.AddIndex(
model_name="workspaceuserrate",
index=models.Index(fields=["user"], name="wur_user_idx"),
),
migrations.AddConstraint(
model_name="workspaceuserrate",
constraint=models.UniqueConstraint(
condition=models.Q(("is_deleted", False)),
fields=("workspace", "user"),
name="unique_workspace_user_rate",
),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 5.2.12 on 2026-04-26 05:53
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('workspaces', '0002_workspaceuserrate'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RemoveIndex(
model_name='workspaceuserrate',
name='workspaceuserrate_id_idx',
),
migrations.AlterField(
model_name='workspaceuserrate',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='workspaceuserrate',
name='updated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL),
),
]

View File

@@ -0,0 +1,45 @@
import uuid
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("workspaces", "0003_remove_workspaceuserrate_workspaceuserrate_id_idx_and_more"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name="PriceUnit",
fields=[
("id", models.UUIDField(default=uuid.uuid7, primary_key=True, serialize=False)),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("deleted_at", models.DateTimeField(blank=True, null=True)),
("is_deleted", models.BooleanField(default=False)),
("is_active", models.BooleanField(default=False)),
("code", models.CharField(max_length=8, unique=True)),
("name", models.CharField(max_length=64)),
("local_name", models.CharField(blank=True, max_length=64)),
("symbol", models.CharField(blank=True, max_length=16)),
("created_by", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="created_workspaces_priceunit_set", to=settings.AUTH_USER_MODEL)),
("updated_by", models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="updated_workspaces_priceunit_set", to=settings.AUTH_USER_MODEL)),
],
options={
"db_table": "price_unit",
"ordering": ("code",),
},
),
migrations.AddIndex(
model_name="priceunit",
index=models.Index(fields=["id"], name="priceunit_id_idx"),
),
migrations.AddIndex(
model_name="priceunit",
index=models.Index(fields=["code"], name="price_unit_code_idx"),
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 5.2.12 on 2026-04-26 06:25
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('workspaces', '0004_priceunit'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.RemoveIndex(
model_name='priceunit',
name='priceunit_id_idx',
),
migrations.AlterField(
model_name='priceunit',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='priceunit',
name='updated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_%(app_label)s_%(class)s_set', to=settings.AUTH_USER_MODEL),
),
]