fix(backend): alembic migration SQLite compat + sync push rollback on error

This commit is contained in:
2026-03-13 19:05:35 +02:00
parent 1e96db4d91
commit 165890b07d
2 changed files with 127 additions and 0 deletions

View File

@@ -0,0 +1,126 @@
"""sync_schema_alignment
Revision ID: 7df0fb1c1e6f
Revises: 1a4da27efc65
Create Date: 2026-03-13 18:46:36.554590
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '7df0fb1c1e6f'
down_revision: Union[str, None] = '1a4da27efc65'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('appointments', sa.Column('client_nume', sa.String(length=200), nullable=True))
op.add_column('appointments', sa.Column('client_telefon', sa.String(length=20), nullable=True))
op.add_column('appointments', sa.Column('data_ora', sa.Text(), nullable=True))
op.add_column('appointments', sa.Column('durata_minute', sa.Integer(), server_default='60', nullable=False))
op.add_column('appointments', sa.Column('observatii', sa.Text(), nullable=True))
op.add_column('appointments', sa.Column('status', sa.String(length=20), server_default='PROGRAMAT', nullable=False))
op.add_column('appointments', sa.Column('order_id', sa.String(length=36), nullable=True))
op.drop_column('appointments', 'descriere')
op.drop_column('appointments', 'data')
op.add_column('catalog_ansamble', sa.Column('denumire', sa.String(length=100), nullable=False))
op.drop_column('catalog_ansamble', 'nume')
op.add_column('catalog_marci', sa.Column('denumire', sa.String(length=100), nullable=False))
op.add_column('catalog_marci', sa.Column('activ', sa.Integer(), server_default='1', nullable=False))
op.drop_column('catalog_marci', 'nume')
op.add_column('catalog_modele', sa.Column('denumire', sa.String(length=100), nullable=False))
op.drop_column('catalog_modele', 'nume')
op.add_column('catalog_norme', sa.Column('cod', sa.String(length=50), nullable=True))
op.add_column('catalog_norme', sa.Column('denumire', sa.Text(), nullable=False))
op.add_column('catalog_norme', sa.Column('ore_normate', sa.Float(), server_default='0', nullable=False))
op.drop_column('catalog_norme', 'descriere')
op.drop_column('catalog_norme', 'ore')
op.add_column('catalog_tipuri_deviz', sa.Column('denumire', sa.String(length=100), nullable=False))
op.drop_column('catalog_tipuri_deviz', 'nume')
op.add_column('catalog_tipuri_motoare', sa.Column('denumire', sa.String(length=50), nullable=False))
op.drop_column('catalog_tipuri_motoare', 'nume')
op.add_column('invoices', sa.Column('serie_factura', sa.String(length=20), nullable=True))
op.add_column('invoices', sa.Column('modalitate_plata', sa.String(length=50), nullable=True))
op.add_column('invoices', sa.Column('client_nume', sa.String(length=200), nullable=True))
op.add_column('invoices', sa.Column('client_cod_fiscal', sa.String(length=20), nullable=True))
op.add_column('invoices', sa.Column('nr_auto', sa.String(length=20), nullable=True))
op.add_column('invoices', sa.Column('total_fara_tva', sa.Float(), server_default='0', nullable=False))
op.add_column('invoices', sa.Column('tva', sa.Float(), server_default='0', nullable=False))
op.add_column('invoices', sa.Column('total_general', sa.Float(), server_default='0', nullable=False))
op.add_column('mecanici', sa.Column('user_id', sa.String(length=36), nullable=True))
op.add_column('mecanici', sa.Column('prenume', sa.String(length=200), nullable=True))
op.add_column('mecanici', sa.Column('activ', sa.Integer(), server_default='1', nullable=False))
op.drop_column('mecanici', 'telefon')
op.add_column('order_lines', sa.Column('norma_id', sa.String(length=36), nullable=True))
op.add_column('order_lines', sa.Column('mecanic_id', sa.String(length=36), nullable=True))
op.add_column('order_lines', sa.Column('ordine', sa.Integer(), nullable=True))
op.add_column('orders', sa.Column('nr_comanda', sa.String(length=50), nullable=True))
op.add_column('orders', sa.Column('client_nume', sa.String(length=200), nullable=True))
op.add_column('orders', sa.Column('client_telefon', sa.String(length=20), nullable=True))
op.add_column('orders', sa.Column('nr_auto', sa.String(length=20), nullable=True))
op.add_column('orders', sa.Column('marca_denumire', sa.String(length=100), nullable=True))
op.add_column('orders', sa.Column('model_denumire', sa.String(length=100), nullable=True))
op.add_column('orders', sa.Column('created_by', sa.String(length=36), nullable=True))
op.add_column('vehicles', sa.Column('serie_sasiu', sa.String(length=50), nullable=True))
op.add_column('vehicles', sa.Column('client_cod_fiscal', sa.String(length=20), nullable=True))
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('vehicles', 'client_cod_fiscal')
op.drop_column('vehicles', 'serie_sasiu')
op.drop_column('orders', 'created_by')
op.drop_column('orders', 'model_denumire')
op.drop_column('orders', 'marca_denumire')
op.drop_column('orders', 'nr_auto')
op.drop_column('orders', 'client_telefon')
op.drop_column('orders', 'client_nume')
op.drop_column('orders', 'nr_comanda')
op.drop_column('order_lines', 'ordine')
op.drop_column('order_lines', 'mecanic_id')
op.drop_column('order_lines', 'norma_id')
op.add_column('mecanici', sa.Column('telefon', sa.VARCHAR(length=20), nullable=True))
op.drop_column('mecanici', 'activ')
op.drop_column('mecanici', 'prenume')
op.drop_column('mecanici', 'user_id')
op.drop_column('invoices', 'total_general')
op.drop_column('invoices', 'tva')
op.drop_column('invoices', 'total_fara_tva')
op.drop_column('invoices', 'nr_auto')
op.drop_column('invoices', 'client_cod_fiscal')
op.drop_column('invoices', 'client_nume')
op.drop_column('invoices', 'modalitate_plata')
op.drop_column('invoices', 'serie_factura')
op.add_column('catalog_tipuri_motoare', sa.Column('nume', sa.VARCHAR(length=50), nullable=False))
op.drop_column('catalog_tipuri_motoare', 'denumire')
op.add_column('catalog_tipuri_deviz', sa.Column('nume', sa.VARCHAR(length=100), nullable=False))
op.drop_column('catalog_tipuri_deviz', 'denumire')
op.add_column('catalog_norme', sa.Column('ore', sa.FLOAT(), nullable=False))
op.add_column('catalog_norme', sa.Column('descriere', sa.TEXT(), nullable=False))
op.drop_column('catalog_norme', 'ore_normate')
op.drop_column('catalog_norme', 'denumire')
op.drop_column('catalog_norme', 'cod')
op.add_column('catalog_modele', sa.Column('nume', sa.VARCHAR(length=100), nullable=False))
op.drop_column('catalog_modele', 'denumire')
op.add_column('catalog_marci', sa.Column('nume', sa.VARCHAR(length=100), nullable=False))
op.drop_column('catalog_marci', 'activ')
op.drop_column('catalog_marci', 'denumire')
op.add_column('catalog_ansamble', sa.Column('nume', sa.VARCHAR(length=100), nullable=False))
op.drop_column('catalog_ansamble', 'denumire')
op.add_column('appointments', sa.Column('data', sa.TEXT(), nullable=False))
op.add_column('appointments', sa.Column('descriere', sa.TEXT(), nullable=True))
op.drop_column('appointments', 'order_id')
op.drop_column('appointments', 'status')
op.drop_column('appointments', 'observatii')
op.drop_column('appointments', 'durata_minute')
op.drop_column('appointments', 'data_ora')
op.drop_column('appointments', 'client_telefon')
op.drop_column('appointments', 'client_nume')
# ### end Alembic commands ###

View File

@@ -130,6 +130,7 @@ async def apply_push(
applied += 1
except Exception as exc: # noqa: BLE001
errors.append({"table": table, "id": op.get("id"), "error": str(exc)})
await db.rollback()
await db.commit()
return {"applied": applied, "conflicts": errors}