diff --git a/liquibase.properties b/liquibase.properties
new file mode 100644
index 0000000..55dc152
--- /dev/null
+++ b/liquibase.properties
@@ -0,0 +1,14 @@
+# liquibase.properties (RAÍZ DEL PROYECTO)
+classpath=target/classes
+
+# Conexión (ajusta DB, user y pass)
+url=jdbc:mysql://localhost:3309/imprimelibros
+#url=jdbc:mysql://localhost:3306/imprimelibros?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
+username=imprimelibros_user
+password=om91irrDctd
+
+# Archivo que se generará con el snapshot (DEBE EXISTIR LA CARPETA)
+#outputChangeLogFile=src/main/resources/db/changelog/changesets/0001-baseline.yml
+
+# Para LEER los cambios en los demás comandos (sync, update, rollback…)
+changeLogFile=src/main/resources/db/changelog/master.yml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 0224edd..2e5351a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -29,6 +29,7 @@
21
+ 4.29.2
@@ -143,6 +144,13 @@
1.0.10
+
+
+ org.liquibase
+ liquibase-core
+ ${liquibase.version}
+
+
@@ -151,6 +159,17 @@
org.springframework.boot
spring-boot-maven-plugin
+
+
+
+ org.liquibase
+ liquibase-maven-plugin
+ 4.29.2
+
+
+ liquibase.properties
+
+
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 66f623c..a58a4f4 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -92,3 +92,13 @@ spring.jpa.properties.hibernate.jdbc.time_zone=UTC
# PDF Templates
imprimelibros.pdf.templates.PRESUPUESTO_presupuesto-a4=imprimelibros/pdf/presupuesto-a4
imprimelibros.pdf.templates.FACTURA_factura-a4=imprimelibros/pdf/factura-a4
+
+# Liquibase
+spring.liquibase.enabled=true
+spring.liquibase.change-log=classpath:db/changelog/master.yml
+# Si quieres especificar el schema por defecto:
+# spring.liquibase.default-schema=imprimelibros
+# Si necesitas parámetros de conexión distintos a los de Spring Data (no suele hacer falta):
+# spring.liquibase.url=jdbc:mysql://localhost:3306/imprimelibros
+# spring.liquibase.user=tu_user
+# spring.liquibase.password=tu_pass
diff --git a/src/main/resources/db/changelog/changesets/0001-baseline.yml b/src/main/resources/db/changelog/changesets/0001-baseline.yml
new file mode 100644
index 0000000..eae860c
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/0001-baseline.yml
@@ -0,0 +1,1065 @@
+databaseChangeLog:
+- changeSet:
+ id: 1761213112413-1
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: cart_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: presupuesto_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP
+ name: created_at
+ type: datetime
+ tableName: cart_items
+- changeSet:
+ id: 1761213112413-2
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: user_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: ACTIVE
+ name: status
+ type: ENUM('ACTIVE', 'LOCKED', 'ABANDONED')
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: EUR
+ name: currency
+ type: VARCHAR(3)
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP
+ name: created_at
+ type: datetime
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
+ name: updated_at
+ type: datetime
+ tableName: carts
+- changeSet:
+ id: 1761213112413-3
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT UNSIGNED
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: A5
+ name: formato
+ type: ENUM('A5', '_17x24_', 'A4')
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: medium
+ name: tamanio_letra
+ type: ENUM('small', 'medium', 'big')
+ - column:
+ constraints:
+ nullable: false
+ defaultValueNumeric: 2695
+ name: matrices_pagina
+ type: INT
+ tableName: maquetacion_matrices_formato
+- changeSet:
+ id: 1761213112413-4
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT UNSIGNED
+ - column:
+ name: keyword
+ type: VARCHAR(255)
+ - column:
+ constraints:
+ nullable: false
+ name: value
+ type: DOUBLE
+ tableName: maquetacion_precios
+- changeSet:
+ id: 1761213112413-5
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: tamanio
+ type: ENUM('_50x140_', '_50x170_', '_50x210_')
+ - column:
+ constraints:
+ nullable: false
+ name: caras_impresion
+ type: ENUM('una_cara', 'dos_caras')
+ - column:
+ constraints:
+ nullable: false
+ name: papel
+ type: ENUM('cartulina_grafica', 'estucado_mate')
+ - column:
+ constraints:
+ nullable: false
+ name: gramaje
+ type: INT
+ - column:
+ constraints:
+ nullable: false
+ name: acabado
+ type: ENUM('ninguno', 'plastificado_brillo_1c', 'plastificado_brillo_2c',
+ 'plastificado_mate_1c', 'plastificado_mate_2c')
+ - column:
+ constraints:
+ nullable: false
+ name: unidades_min
+ type: INT
+ - column:
+ constraints:
+ nullable: false
+ name: precio_unidades_min
+ type: DOUBLE
+ - column:
+ constraints:
+ nullable: false
+ name: margen_unidades_min
+ type: INT
+ - column:
+ constraints:
+ nullable: false
+ name: unidades_max
+ type: INT
+ - column:
+ constraints:
+ nullable: false
+ name: precio_unidades_max
+ type: DOUBLE
+ - column:
+ constraints:
+ nullable: false
+ name: margen_unidades_max
+ type: INT
+ tableName: marcapaginas
+- changeSet:
+ id: 1761213112413-6
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: importe_min
+ type: DECIMAL(12, 2)
+ - column:
+ constraints:
+ nullable: false
+ name: importe_max
+ type: DECIMAL(12, 2)
+ - column:
+ constraints:
+ nullable: false
+ name: margen_min
+ type: DECIMAL(6, 2)
+ - column:
+ constraints:
+ nullable: false
+ name: margen_max
+ type: DECIMAL(6, 2)
+ - column:
+ constraints:
+ nullable: false
+ defaultValueNumeric: 0
+ name: deleted
+ type: BIT(1)
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP
+ name: created_at
+ type: datetime
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP
+ name: updated_at
+ type: datetime
+ - column:
+ name: deleted_at
+ type: datetime
+ tableName: margenes_presupuesto
+- changeSet:
+ id: 1761213112413-7
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: created_at
+ type: datetime
+ - column:
+ constraints:
+ nullable: false
+ name: expires_at
+ type: datetime
+ - column:
+ name: request_ip
+ type: VARCHAR(64)
+ - column:
+ constraints:
+ nullable: false
+ name: token_hash
+ type: VARCHAR(128)
+ - column:
+ name: used_at
+ type: datetime
+ - column:
+ name: user_agent
+ type: VARCHAR(255)
+ - column:
+ constraints:
+ nullable: false
+ name: user_id
+ type: BIGINT
+ tableName: password_reset_tokens
+- changeSet:
+ id: 1761213112413-8
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ constraints:
+ nullable: false
+ name: username
+ type: VARCHAR(64)
+ - column:
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: series
+ type: VARCHAR(64)
+ - column:
+ constraints:
+ nullable: false
+ name: token
+ type: VARCHAR(64)
+ - column:
+ constraints:
+ nullable: false
+ name: last_used
+ type: timestamp
+ tableName: persistent_logins
+- changeSet:
+ id: 1761213112413-9
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ name: titulo
+ type: VARCHAR(255)
+ - column:
+ name: autor
+ type: VARCHAR(255)
+ - column:
+ name: isbn
+ type: VARCHAR(255)
+ - column:
+ name: tirada1
+ type: INT
+ - column:
+ name: tirada2
+ type: INT
+ - column:
+ name: tirada3
+ type: INT
+ - column:
+ name: tirada4
+ type: INT
+ - column:
+ name: paginas_color
+ type: INT
+ - column:
+ name: paginas_negro
+ type: INT
+ - column:
+ name: alto
+ type: INT
+ - column:
+ name: ancho
+ type: INT
+ - column:
+ name: formato_personalizado
+ type: BIT(1)
+ - column:
+ name: paginas_color_total
+ type: INT
+ - column:
+ name: posicion_paginas_color
+ type: VARCHAR(255)
+ - column:
+ name: tipo_impresion
+ type: ENUM('color', 'colorhq', 'negro', 'negrohq')
+ - column:
+ name: gramaje_interior
+ type: INT
+ - column:
+ name: papel_interior_id
+ type: INT
+ - column:
+ name: tipo_encuadernacion
+ type: ENUM('cosido', 'espiral', 'fresado', 'grapado', 'wireo')
+ - column:
+ name: cabezada
+ type: VARCHAR(255)
+ - column:
+ name: cubierta_caras
+ type: INT
+ - column:
+ name: gramaje_cubierta
+ type: INT
+ - column:
+ name: gramaje_guardas
+ type: INT
+ - column:
+ name: guardas_impresas
+ type: INT
+ - column:
+ name: papel_cubierta_id
+ type: INT
+ - column:
+ name: papel_guardas_id
+ type: INT
+ - column:
+ name: solapas_cubierta
+ type: BIT(1)
+ - column:
+ name: tamanio_solapas_cubierta
+ type: INT
+ - column:
+ name: tipo_cubierta
+ type: ENUM('tapaBlanda', 'tapaDura', 'tapaDuraLomoRedondo')
+ - column:
+ name: acabado
+ type: INT
+ - column:
+ name: acabado_sobrecubierta
+ type: INT
+ - column:
+ name: faja
+ type: BIT(1)
+ - column:
+ name: gramaje_faja
+ type: INT
+ - column:
+ name: gramaje_sobrecubierta
+ type: INT
+ - column:
+ name: papel_faja_id
+ type: INT
+ - column:
+ name: papel_sobrecubierta_id
+ type: INT
+ - column:
+ name: sobrecubierta
+ type: BIT(1)
+ - column:
+ name: tamanio_solapas_faja
+ type: INT
+ - column:
+ name: tamanio_solapas_sobrecubierta
+ type: INT
+ - column:
+ name: acabado_faja
+ type: INT
+ - column:
+ name: alto_faja
+ type: INT
+ - column:
+ name: selected_tirada
+ type: INT
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: publico
+ name: origen
+ type: VARCHAR(10)
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: borrador
+ name: estado
+ type: VARCHAR(20)
+ - column:
+ name: user_id
+ type: BIGINT
+ - column:
+ name: session_id
+ type: VARCHAR(64)
+ - column:
+ name: visitor_id
+ type: VARCHAR(64)
+ - column:
+ name: ip_hash
+ type: VARCHAR(88)
+ - column:
+ name: ip_trunc
+ type: VARCHAR(64)
+ - column:
+ name: pais
+ type: VARCHAR(64)
+ - column:
+ name: region
+ type: VARCHAR(128)
+ - column:
+ name: ciudad
+ type: VARCHAR(128)
+ - column:
+ name: precio_unitario
+ type: DECIMAL(12, 4)
+ - column:
+ name: precio_total_tirada
+ type: DECIMAL(12, 2)
+ - column:
+ name: servicios_total
+ type: DECIMAL(12, 2)
+ - column:
+ name: base_imponible
+ type: DECIMAL(12, 2)
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: peninsula
+ name: entrega_tipo
+ type: ENUM('peninsula', 'canarias', 'paises_ue')
+ - column:
+ name: iva_importe_4
+ type: DECIMAL(12, 2)
+ - column:
+ name: iva_importe_21
+ type: DECIMAL(12, 2)
+ - column:
+ name: total_con_iva
+ type: DECIMAL(12, 2)
+ - column:
+ name: precios_por_tirada_json
+ type: JSON
+ - column:
+ name: servicios_json
+ type: JSON
+ - column:
+ name: datos_maquetacion_json
+ type: JSON
+ - column:
+ name: datos_marcapaginas_json
+ type: JSON
+ - column:
+ name: pricing_snapshot
+ type: JSON
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP(3)
+ name: created_at
+ type: datetime
+ - column:
+ constraints:
+ nullable: false
+ defaultValueComputed: CURRENT_TIMESTAMP(3) on update CURRENT_TIMESTAMP(3)
+ name: updated_at
+ type: datetime
+ - column:
+ name: created_by
+ type: BIGINT
+ - column:
+ name: updated_by
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ defaultValueNumeric: 0
+ name: deleted
+ type: BIT(1)
+ - column:
+ name: deleted_at
+ type: datetime
+ - column:
+ name: deleted_by
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ defaultValue: '1'
+ name: iva_reducido
+ type: BIT(1)
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-10
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ name: name
+ type: VARCHAR(255)
+ tableName: roles
+- changeSet:
+ id: 1761213112413-11
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ unique: true
+ name: username
+ type: VARCHAR(190)
+ - column:
+ constraints:
+ nullable: false
+ name: fullname
+ type: VARCHAR(255)
+ - column:
+ constraints:
+ nullable: false
+ name: password
+ type: VARCHAR(255)
+ - column:
+ name: enabled
+ type: BIT(1)
+ - column:
+ constraints:
+ nullable: false
+ defaultValueNumeric: 0
+ name: deleted
+ type: BIT(1)
+ - column:
+ name: deleted_at
+ type: timestamp
+ - column:
+ name: deleted_by
+ type: BIGINT
+ tableName: users
+- changeSet:
+ id: 1761213112413-12
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: user_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: role_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ defaultValueNumeric: 0
+ name: deleted
+ type: BIT(1)
+ - column:
+ name: deleted_at
+ type: timestamp
+ tableName: users_roles
+- changeSet:
+ id: 1761213112413-13
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ unique: true
+ name: clave
+ type: VARCHAR(255)
+ - column:
+ constraints:
+ nullable: false
+ name: valor
+ type: VARCHAR(255)
+ tableName: variables
+- changeSet:
+ id: 1761213112413-14
+ author: jjimenez (generated)
+ changes:
+ - createTable:
+ columns:
+ - column:
+ autoIncrement: true
+ constraints:
+ nullable: false
+ primaryKey: true
+ name: id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ unique: true
+ name: token
+ type: VARCHAR(64)
+ - column:
+ constraints:
+ nullable: false
+ name: user_id
+ type: BIGINT
+ - column:
+ constraints:
+ nullable: false
+ name: created_at
+ type: datetime
+ - column:
+ constraints:
+ nullable: false
+ name: expires_at
+ type: datetime
+ - column:
+ name: used_at
+ type: datetime
+ tableName: verification_tokens
+- changeSet:
+ id: 1761213112413-15
+ author: jjimenez (generated)
+ changes:
+ - addUniqueConstraint:
+ columnNames: cart_id, presupuesto_id
+ constraintName: uq_cartitem_unique
+ tableName: cart_items
+- changeSet:
+ id: 1761213112413-16
+ author: jjimenez (generated)
+ changes:
+ - addUniqueConstraint:
+ columnNames: user_id, status
+ constraintName: uq_carts_user_active
+ tableName: carts
+- changeSet:
+ id: 1761213112413-17
+ author: jjimenez (generated)
+ changes:
+ - addUniqueConstraint:
+ columnNames: user_id, role_id, deleted
+ constraintName: ux_users_roles_active
+ tableName: users_roles
+- changeSet:
+ id: 1761213112413-18
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: role_id
+ indexName: FKj6m8fwv7oqv74fcehir1a9ffy
+ tableName: users_roles
+- changeSet:
+ id: 1761213112413-19
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: created_by
+ indexName: fk_presupuesto_created_by
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-20
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: deleted_by
+ indexName: fk_presupuesto_deleted_by
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-21
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: updated_by
+ indexName: fk_presupuesto_updated_by
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-22
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: user_id
+ indexName: fk_verification_tokens_user
+ tableName: verification_tokens
+- changeSet:
+ id: 1761213112413-23
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: cart_id
+ indexName: idx_cart_items_cart
+ tableName: cart_items
+- changeSet:
+ id: 1761213112413-24
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: presupuesto_id
+ indexName: idx_cart_items_pres
+ tableName: cart_items
+- changeSet:
+ id: 1761213112413-25
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ defaultValueNumeric: !!float '0'
+ name: deleted
+ indexName: idx_presupuesto_deleted
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-26
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: pais
+ - column:
+ name: region
+ - column:
+ name: ciudad
+ indexName: idx_presupuesto_geo
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-27
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: origen
+ - column:
+ name: estado
+ indexName: idx_presupuesto_origen_estado
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-28
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: session_id
+ indexName: idx_presupuesto_session
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-29
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: user_id
+ indexName: idx_presupuesto_user
+ tableName: presupuesto
+- changeSet:
+ id: 1761213112413-30
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: token_hash
+ indexName: idx_prt_token_hash
+ tableName: password_reset_tokens
+- changeSet:
+ id: 1761213112413-31
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: user_id
+ indexName: idx_prt_user_id
+ tableName: password_reset_tokens
+- changeSet:
+ id: 1761213112413-32
+ author: jjimenez (generated)
+ changes:
+ - createIndex:
+ associatedWith: ''
+ columns:
+ - column:
+ name: deleted_by
+ indexName: idx_users_deleted_by
+ tableName: users
+- changeSet:
+ id: 1761213112413-33
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: user_id
+ baseTableName: users_roles
+ constraintName: FK2o0jvgh89lemvvo17cbqvdxaa
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-34
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: role_id
+ baseTableName: users_roles
+ constraintName: FKj6m8fwv7oqv74fcehir1a9ffy
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: roles
+ validate: true
+- changeSet:
+ id: 1761213112413-35
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: cart_id
+ baseTableName: cart_items
+ constraintName: fk_cart_items_cart
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: CASCADE
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: carts
+ validate: true
+- changeSet:
+ id: 1761213112413-36
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: created_by
+ baseTableName: presupuesto
+ constraintName: fk_presupuesto_created_by
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-37
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: deleted_by
+ baseTableName: presupuesto
+ constraintName: fk_presupuesto_deleted_by
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-38
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: updated_by
+ baseTableName: presupuesto
+ constraintName: fk_presupuesto_updated_by
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-39
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: user_id
+ baseTableName: presupuesto
+ constraintName: fk_presupuesto_user
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-40
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: deleted_by
+ baseTableName: users
+ constraintName: fk_users_deleted_by
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: SET NULL
+ onUpdate: CASCADE
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+- changeSet:
+ id: 1761213112413-41
+ author: jjimenez (generated)
+ changes:
+ - addForeignKeyConstraint:
+ baseColumnNames: user_id
+ baseTableName: verification_tokens
+ constraintName: fk_verification_tokens_user
+ deferrable: false
+ initiallyDeferred: false
+ onDelete: CASCADE
+ onUpdate: CASCADE
+ referencedColumnNames: id
+ referencedTableName: users
+ validate: true
+
diff --git a/src/main/resources/db/changelog/changesets/0002-create-pedidos.yml b/src/main/resources/db/changelog/changesets/0002-create-pedidos.yml
new file mode 100644
index 0000000..7a6eee3
--- /dev/null
+++ b/src/main/resources/db/changelog/changesets/0002-create-pedidos.yml
@@ -0,0 +1,146 @@
+databaseChangeLog:
+ - changeSet:
+ id: 0002-create-pedidos
+ author: jjo
+
+ preConditions:
+ - not:
+ tableExists:
+ tableName: pedidos
+
+ changes:
+ - createTable:
+ tableName: pedidos
+ columns:
+ - column:
+ name: id
+ type: BIGINT AUTO_INCREMENT
+ constraints:
+ primaryKey: true
+ primaryKeyName: pk_pedidos
+ - column:
+ name: presupuesto_id
+ type: BIGINT
+ constraints:
+ nullable: false
+ - column:
+ name: created_by
+ type: BIGINT
+ constraints:
+ nullable: true
+ - column:
+ name: updated_by
+ type: BIGINT
+ constraints:
+ nullable: true
+ - column:
+ name: deleted_by
+ type: BIGINT
+ constraints:
+ nullable: true
+ - column:
+ name: deleted
+ type: TINYINT(1)
+ defaultValueNumeric: 0
+ constraints:
+ nullable: false
+ - column:
+ name: created_at
+ type: TIMESTAMP
+ defaultValueComputed: CURRENT_TIMESTAMP
+ constraints:
+ nullable: false
+ - column:
+ name: updated_at
+ type: TIMESTAMP
+ defaultValueComputed: CURRENT_TIMESTAMP
+ constraints:
+ nullable: false
+ - column:
+ name: deleted_at
+ type: TIMESTAMP
+ constraints:
+ nullable: true
+
+ # Forzamos ON UPDATE para updated_at (MySQL/MariaDB)
+ - sql:
+ dbms: mysql
+ splitStatements: false
+ sql: |
+ ALTER TABLE pedidos
+ MODIFY COLUMN updated_at TIMESTAMP NOT NULL
+ DEFAULT CURRENT_TIMESTAMP
+ ON UPDATE CURRENT_TIMESTAMP;
+
+ # Índices
+ - createIndex:
+ tableName: pedidos
+ indexName: idx_pedidos_presupuesto
+ columns:
+ - column:
+ name: presupuesto_id
+ - createIndex:
+ tableName: pedidos
+ indexName: idx_pedidos_deleted
+ columns:
+ - column:
+ name: deleted
+
+ # Claves foráneas (ajusta nombres si difieren)
+ - addForeignKeyConstraint:
+ baseTableName: pedidos
+ baseColumnNames: presupuesto_id
+ constraintName: fk_pedidos_presupuesto
+ referencedTableName: presupuesto
+ referencedColumnNames: id
+ onDelete: RESTRICT
+ onUpdate: RESTRICT
+
+ - addForeignKeyConstraint:
+ baseTableName: pedidos
+ baseColumnNames: created_by
+ constraintName: fk_pedidos_created_by
+ referencedTableName: users
+ referencedColumnNames: id
+ onDelete: SET NULL
+ onUpdate: RESTRICT
+
+ - addForeignKeyConstraint:
+ baseTableName: pedidos
+ baseColumnNames: updated_by
+ constraintName: fk_pedidos_updated_by
+ referencedTableName: users
+ referencedColumnNames: id
+ onDelete: SET NULL
+ onUpdate: RESTRICT
+
+ - addForeignKeyConstraint:
+ baseTableName: pedidos
+ baseColumnNames: deleted_by
+ constraintName: fk_pedidos_deleted_by
+ referencedTableName: users
+ referencedColumnNames: id
+ onDelete: SET NULL
+ onUpdate: RESTRICT
+
+ rollback:
+ - dropForeignKeyConstraint:
+ baseTableName: pedidos
+ constraintName: fk_pedidos_deleted_by
+ - dropForeignKeyConstraint:
+ baseTableName: pedidos
+ constraintName: fk_pedidos_updated_by
+ - dropForeignKeyConstraint:
+ baseTableName: pedidos
+ constraintName: fk_pedidos_created_by
+ - dropForeignKeyConstraint:
+ baseTableName: pedidos
+ constraintName: fk_pedidos_presupuesto
+ - dropIndex:
+ tableName: pedidos
+ indexName: idx_pedidos_deleted
+ - dropIndex:
+ tableName: pedidos
+ indexName: idx_pedidos_presupuesto
+ - dropTable:
+ tableName: pedidos
diff --git a/src/main/resources/db/changelog/master.yml b/src/main/resources/db/changelog/master.yml
new file mode 100644
index 0000000..d57981d
--- /dev/null
+++ b/src/main/resources/db/changelog/master.yml
@@ -0,0 +1,5 @@
+databaseChangeLog:
+ - include:
+ file: db/changelog/changesets/0001-baseline.yml
+ - include:
+ file: db/changelog/changesets/0002-create-pedidos.yml
\ No newline at end of file