diff --git a/alembic/versions/20260414_release_a_clients.py b/alembic/versions/20260414_release_a_clients.py index 8a0a9dc..73cfc15 100644 --- a/alembic/versions/20260414_release_a_clients.py +++ b/alembic/versions/20260414_release_a_clients.py @@ -15,9 +15,27 @@ branch_labels = None depends_on = None +def _has_column(table_name: str, column_name: str) -> bool: + bind = op.get_bind() + inspector = sa.inspect(bind) + return column_name in [c["name"] for c in inspector.get_columns(table_name)] + + def upgrade(): - # engagement_mode column already exists from the earlier partial migration, - # so do NOT add it again. + # On the original production database this column was added out-of-band, + # outside of tracked migration history. On a fresh database (new env, + # new backend such as Postgres) it does not exist yet, so create it + # defensively here instead of assuming it's already present. + if not _has_column("clients", "engagement_mode"): + op.add_column( + "clients", + sa.Column( + "engagement_mode", + sa.String(length=30), + nullable=False, + server_default="internal_managed", + ), + ) # Make partner_id nullable in a SQLite-safe way with op.batch_alter_table("clients") as batch_op: @@ -31,7 +49,7 @@ def upgrade(): with op.batch_alter_table("clients") as batch_op: batch_op.alter_column( "engagement_mode", - existing_type=sa.String(length=32), + existing_type=sa.String(length=30), server_default=None, ) diff --git a/alembic/versions/20260420_services_catalogue_and_firm_templates.py b/alembic/versions/20260420_services_catalogue_and_firm_templates.py index 6fadacb..991ffcc 100644 --- a/alembic/versions/20260420_services_catalogue_and_firm_templates.py +++ b/alembic/versions/20260420_services_catalogue_and_firm_templates.py @@ -107,9 +107,9 @@ def upgrade() -> None: MIN(s.category) AS category, MIN(s.description) AS description, NULL AS recurrence_type, - MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) AS is_active, - MAX(CASE WHEN s.is_client_requestable THEN 1 ELSE 0 END) AS is_client_requestable, - MAX(CASE WHEN s.is_consultant_requestable THEN 1 ELSE 0 END) AS is_consultant_requestable, + (MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) = 1) AS is_active, + (MAX(CASE WHEN s.is_client_requestable THEN 1 ELSE 0 END) = 1) AS is_client_requestable, + (MAX(CASE WHEN s.is_consultant_requestable THEN 1 ELSE 0 END) = 1) AS is_consultant_requestable, MIN(s.created_by_user_id) AS created_by_user_id, MIN(s.updated_by_user_id) AS updated_by_user_id, MIN(s.created_at_utc) AS created_at_utc, diff --git a/alembic/versions/20260420_services_catalogue_firm_toggle.py b/alembic/versions/20260420_services_catalogue_firm_toggle.py index 35a9b9d..5417421 100644 --- a/alembic/versions/20260420_services_catalogue_firm_toggle.py +++ b/alembic/versions/20260420_services_catalogue_firm_toggle.py @@ -83,7 +83,7 @@ def upgrade(): SELECT s.tenant_id, sc.id, - MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) AS is_enabled, + (MAX(CASE WHEN s.is_active THEN 1 ELSE 0 END) = 1) AS is_enabled, MIN(s.branch_id) AS default_branch_id, MIN(s.created_by_user_id) AS activated_by_user_id, MIN(s.updated_by_user_id) AS updated_by_user_id, diff --git a/alembic/versions/20260507_task_communication_phase_4c.py b/alembic/versions/20260507_task_communication_phase_4c.py index 672ba4b..c463c36 100644 --- a/alembic/versions/20260507_task_communication_phase_4c.py +++ b/alembic/versions/20260507_task_communication_phase_4c.py @@ -46,7 +46,7 @@ def upgrade() -> None: sa.Column("created_by_user_id", sa.Integer(), sa.ForeignKey("users.id"), nullable=True), sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")), sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")), - sa.Column("is_deleted", sa.Boolean(), nullable=False, server_default=sa.text("0")), + sa.Column("is_deleted", sa.Boolean(), nullable=False, server_default=sa.text("false")), ) index_specs = [ diff --git a/alembic/versions/20260511_consultant_completion_phase_5a5_5a6.py b/alembic/versions/20260511_consultant_completion_phase_5a5_5a6.py index 1cea8d4..9cb6b74 100644 --- a/alembic/versions/20260511_consultant_completion_phase_5a5_5a6.py +++ b/alembic/versions/20260511_consultant_completion_phase_5a5_5a6.py @@ -55,7 +55,7 @@ def upgrade() -> None: sa.Column("reviewed_at_utc", sa.DateTime(timezone=True), nullable=True), sa.Column("created_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")), sa.Column("updated_at_utc", sa.DateTime(timezone=True), nullable=False, server_default=sa.text("CURRENT_TIMESTAMP")), - sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("1")), + sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")), ) for index_name, columns in { @@ -77,7 +77,7 @@ def upgrade() -> None: if _has_table(bind, "service_catalogues") and not _has_column(bind, "service_catalogues", "is_consultant_requestable"): with op.batch_alter_table("service_catalogues") as batch_op: - batch_op.add_column(sa.Column("is_consultant_requestable", sa.Boolean(), nullable=False, server_default=sa.text("0"))) + batch_op.add_column(sa.Column("is_consultant_requestable", sa.Boolean(), nullable=False, server_default=sa.text("false"))) def downgrade() -> None: diff --git a/alembic/versions/20260613_phase_7t1_domain_mapping_table.py b/alembic/versions/20260613_phase_7t1_domain_mapping_table.py index 384faf7..dd5e7e3 100644 --- a/alembic/versions/20260613_phase_7t1_domain_mapping_table.py +++ b/alembic/versions/20260613_phase_7t1_domain_mapping_table.py @@ -34,8 +34,8 @@ def upgrade() -> None: sa.Column("branch_id", sa.Integer(), nullable=True), sa.Column("consultant_id", sa.Integer(), nullable=True), sa.Column("parent_tenant_id", sa.Integer(), nullable=True), - sa.Column("is_primary", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("is_verified", sa.Boolean(), nullable=False, server_default=sa.text("0")), + sa.Column("is_primary", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("is_verified", sa.Boolean(), nullable=False, server_default=sa.text("false")), sa.Column("status", sa.String(length=30), nullable=False, server_default="draft"), sa.Column("verification_token", sa.String(length=120), nullable=True), sa.Column("dns_txt_name", sa.String(length=255), nullable=True), diff --git a/alembic/versions/7f1c9b2d4a10_reconcile_common_tables_and_clients_safely.py b/alembic/versions/7f1c9b2d4a10_reconcile_common_tables_and_clients_safely.py index 0bc7eca..c6f92ed 100644 --- a/alembic/versions/7f1c9b2d4a10_reconcile_common_tables_and_clients_safely.py +++ b/alembic/versions/7f1c9b2d4a10_reconcile_common_tables_and_clients_safely.py @@ -199,19 +199,19 @@ def upgrade() -> None: sa.Column("onboarding_date", sa.Date(), nullable=True), sa.Column("closing_date", sa.Date(), nullable=True), sa.Column("notes", sa.Text(), nullable=True), - sa.Column("gst_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("income_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("tds_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("roc_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("audit_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("pf_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("esi_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("professional_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("payroll_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("msme_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("import_export_applicable", sa.Boolean(), nullable=False, server_default=sa.text("0")), - sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("1")), - sa.Column("is_archived", sa.Boolean(), nullable=False, server_default=sa.text("0")), + sa.Column("gst_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("income_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("tds_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("roc_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("audit_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("pf_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("esi_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("professional_tax_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("payroll_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("msme_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("import_export_applicable", sa.Boolean(), nullable=False, server_default=sa.text("false")), + sa.Column("is_active", sa.Boolean(), nullable=False, server_default=sa.text("true")), + sa.Column("is_archived", sa.Boolean(), nullable=False, server_default=sa.text("false")), sa.Column("archived_at_utc", sa.DateTime(timezone=True), nullable=True), sa.Column("created_by_user_id", sa.Integer(), nullable=True), sa.Column("updated_by_user_id", sa.Integer(), nullable=True),