diff --git a/backend/alembic/versions/7df0fb1c1e6f_sync_schema_alignment.py b/backend/alembic/versions/7df0fb1c1e6f_sync_schema_alignment.py new file mode 100644 index 0000000..2429876 --- /dev/null +++ b/backend/alembic/versions/7df0fb1c1e6f_sync_schema_alignment.py @@ -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 ### diff --git a/backend/app/sync/service.py b/backend/app/sync/service.py index 8ed493d..878ca0f 100644 --- a/backend/app/sync/service.py +++ b/backend/app/sync/service.py @@ -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}