From 15e0b23f157d3fb1c77aaf5989de32ee135b8c0c Mon Sep 17 00:00:00 2001 From: r-dev Date: Sun, 11 Jan 2026 17:05:50 +0100 Subject: [PATCH] chore(migration): ajouter scripts et migrations de donnees --- migrations/Version20260110175413.php | 32 ---- migrations/Version20260110202855.php | 229 +++++++++++++++++++++++++++ scripts/insert_profiles.sql | 5 + scripts/migrate-inventory-data.sh | 45 ++++++ scripts/normalize-dump.py | 80 ++++++++++ scripts/validate-migration.php | 139 ++++++++++++++++ 6 files changed, 498 insertions(+), 32 deletions(-) delete mode 100644 migrations/Version20260110175413.php create mode 100644 migrations/Version20260110202855.php create mode 100644 scripts/insert_profiles.sql create mode 100755 scripts/migrate-inventory-data.sh create mode 100644 scripts/normalize-dump.py create mode 100644 scripts/validate-migration.php diff --git a/migrations/Version20260110175413.php b/migrations/Version20260110175413.php deleted file mode 100644 index 65b2208..0000000 --- a/migrations/Version20260110175413.php +++ /dev/null @@ -1,32 +0,0 @@ -addSql('CREATE TABLE profiles (id VARCHAR(30) NOT NULL, email VARCHAR(180) NOT NULL, first_name VARCHAR(100) NOT NULL, last_name VARCHAR(100) NOT NULL, is_active BOOLEAN DEFAULT true NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updated_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_email ON profiles (email)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('DROP TABLE profiles'); - } -} diff --git a/migrations/Version20260110202855.php b/migrations/Version20260110202855.php new file mode 100644 index 0000000..d715d94 --- /dev/null +++ b/migrations/Version20260110202855.php @@ -0,0 +1,229 @@ +addSql('CREATE TABLE composants (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, reference VARCHAR(255) DEFAULT NULL, prix NUMERIC(10, 2) DEFAULT NULL, structure JSON DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeComposantId VARCHAR(36) DEFAULT NULL, productId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_F95A31995E237E06 ON composants (name)'); + $this->addSql('CREATE INDEX IDX_F95A3199CC8A4CEE ON composants (typeComposantId)'); + $this->addSql('CREATE INDEX IDX_F95A319936799605 ON composants (productId)'); + $this->addSql('CREATE TABLE _ComposantConstructeurs (A VARCHAR(36) NOT NULL, B VARCHAR(36) NOT NULL, PRIMARY KEY (A, B))'); + $this->addSql('CREATE INDEX IDX_60760125D3D99E8B ON _ComposantConstructeurs (A)'); + $this->addSql('CREATE INDEX IDX_607601254AD0CF31 ON _ComposantConstructeurs (B)'); + $this->addSql('CREATE TABLE constructeurs (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, email VARCHAR(255) DEFAULT NULL, phone VARCHAR(255) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_CC8D6F55E237E06 ON constructeurs (name)'); + $this->addSql('CREATE TABLE custom_field_values (id VARCHAR(36) NOT NULL, value VARCHAR(255) NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, customFieldId VARCHAR(36) NOT NULL, machineId VARCHAR(36) DEFAULT NULL, composantId VARCHAR(36) DEFAULT NULL, pieceId VARCHAR(36) DEFAULT NULL, productId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_6B64D7FF5C4A705F ON custom_field_values (customFieldId)'); + $this->addSql('CREATE INDEX IDX_6B64D7FF633EC4FD ON custom_field_values (machineId)'); + $this->addSql('CREATE INDEX IDX_6B64D7FF345EE564 ON custom_field_values (composantId)'); + $this->addSql('CREATE INDEX IDX_6B64D7FF3C6A9D1 ON custom_field_values (pieceId)'); + $this->addSql('CREATE INDEX IDX_6B64D7FF36799605 ON custom_field_values (productId)'); + $this->addSql('CREATE TABLE custom_fields (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(50) NOT NULL, required BOOLEAN DEFAULT false NOT NULL, defaultValue VARCHAR(255) DEFAULT NULL, options JSON NOT NULL, orderIndex INT DEFAULT 0 NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeMachineId VARCHAR(36) DEFAULT NULL, typeComposantId VARCHAR(36) DEFAULT NULL, typePieceId VARCHAR(36) DEFAULT NULL, typeProductId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_4A48378C2F024C2 ON custom_fields (typeMachineId)'); + $this->addSql('CREATE INDEX IDX_4A48378CCC8A4CEE ON custom_fields (typeComposantId)'); + $this->addSql('CREATE INDEX IDX_4A48378C169F1CF6 ON custom_fields (typePieceId)'); + $this->addSql('CREATE INDEX IDX_4A48378C57B7763A ON custom_fields (typeProductId)'); + $this->addSql('CREATE TABLE documents (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, filename VARCHAR(255) NOT NULL, path VARCHAR(500) NOT NULL, mimeType VARCHAR(100) NOT NULL, size INT NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, machineId VARCHAR(36) DEFAULT NULL, composantId VARCHAR(36) DEFAULT NULL, pieceId VARCHAR(36) DEFAULT NULL, productId VARCHAR(36) DEFAULT NULL, siteId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_A2B07288633EC4FD ON documents (machineId)'); + $this->addSql('CREATE INDEX IDX_A2B07288345EE564 ON documents (composantId)'); + $this->addSql('CREATE INDEX IDX_A2B072883C6A9D1 ON documents (pieceId)'); + $this->addSql('CREATE INDEX IDX_A2B0728836799605 ON documents (productId)'); + $this->addSql('CREATE INDEX IDX_A2B072886973A4FD ON documents (siteId)'); + $this->addSql('CREATE TABLE machine_component_links (id VARCHAR(36) NOT NULL, nameOverride VARCHAR(255) DEFAULT NULL, referenceOverride VARCHAR(255) DEFAULT NULL, prixOverride NUMERIC(10, 2) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, machineId VARCHAR(36) NOT NULL, composantId VARCHAR(36) NOT NULL, parentLinkId VARCHAR(36) DEFAULT NULL, typeMachineComponentRequirementId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_528EFE19633EC4FD ON machine_component_links (machineId)'); + $this->addSql('CREATE INDEX IDX_528EFE19345EE564 ON machine_component_links (composantId)'); + $this->addSql('CREATE INDEX IDX_528EFE19EF6CF34B ON machine_component_links (parentLinkId)'); + $this->addSql('CREATE INDEX IDX_528EFE19C44B383C ON machine_component_links (typeMachineComponentRequirementId)'); + $this->addSql('CREATE TABLE machine_piece_links (id VARCHAR(36) NOT NULL, nameOverride VARCHAR(255) DEFAULT NULL, referenceOverride VARCHAR(255) DEFAULT NULL, prixOverride NUMERIC(10, 2) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, machineId VARCHAR(36) NOT NULL, pieceId VARCHAR(36) NOT NULL, parentLinkId VARCHAR(36) DEFAULT NULL, typeMachinePieceRequirementId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_62941615633EC4FD ON machine_piece_links (machineId)'); + $this->addSql('CREATE INDEX IDX_629416153C6A9D1 ON machine_piece_links (pieceId)'); + $this->addSql('CREATE INDEX IDX_62941615EF6CF34B ON machine_piece_links (parentLinkId)'); + $this->addSql('CREATE INDEX IDX_62941615F957D314 ON machine_piece_links (typeMachinePieceRequirementId)'); + $this->addSql('CREATE TABLE machine_product_links (id VARCHAR(36) NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, machineId VARCHAR(36) NOT NULL, productId VARCHAR(36) NOT NULL, typeMachineProductRequirementId VARCHAR(36) DEFAULT NULL, parentLinkId VARCHAR(36) DEFAULT NULL, parentComponentLinkId VARCHAR(36) DEFAULT NULL, parentPieceLinkId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_8CC32259633EC4FD ON machine_product_links (machineId)'); + $this->addSql('CREATE INDEX IDX_8CC3225936799605 ON machine_product_links (productId)'); + $this->addSql('CREATE INDEX IDX_8CC32259B590B209 ON machine_product_links (typeMachineProductRequirementId)'); + $this->addSql('CREATE INDEX IDX_8CC32259EF6CF34B ON machine_product_links (parentLinkId)'); + $this->addSql('CREATE INDEX IDX_8CC32259A63AC5DC ON machine_product_links (parentComponentLinkId)'); + $this->addSql('CREATE INDEX IDX_8CC32259937A1D7C ON machine_product_links (parentPieceLinkId)'); + $this->addSql('CREATE TABLE machines (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, reference VARCHAR(255) DEFAULT NULL, prix NUMERIC(10, 2) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, siteId VARCHAR(36) NOT NULL, typeMachineId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_F1CE8DED5E237E06 ON machines (name)'); + $this->addSql('CREATE INDEX IDX_F1CE8DED6973A4FD ON machines (siteId)'); + $this->addSql('CREATE INDEX IDX_F1CE8DED2F024C2 ON machines (typeMachineId)'); + $this->addSql('CREATE TABLE _MachineConstructeurs (A VARCHAR(36) NOT NULL, B VARCHAR(36) NOT NULL, PRIMARY KEY (A, B))'); + $this->addSql('CREATE INDEX IDX_E6A040CCD3D99E8B ON _MachineConstructeurs (A)'); + $this->addSql('CREATE INDEX IDX_E6A040CC4AD0CF31 ON _MachineConstructeurs (B)'); + $this->addSql('CREATE TABLE model_types (id VARCHAR(36) NOT NULL, name VARCHAR(120) NOT NULL, code VARCHAR(60) NOT NULL, category VARCHAR(255) NOT NULL, notes TEXT DEFAULT NULL, description TEXT DEFAULT NULL, componentSkeleton JSON DEFAULT NULL, pieceSkeleton JSON DEFAULT NULL, productSkeleton JSON DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_6773A9C777153098 ON model_types (code)'); + $this->addSql('CREATE UNIQUE INDEX unique_category_name ON model_types (category, name)'); + $this->addSql('CREATE TABLE pieces (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, reference VARCHAR(255) DEFAULT NULL, prix NUMERIC(10, 2) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typePieceId VARCHAR(36) DEFAULT NULL, productId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_B92D74725E237E06 ON pieces (name)'); + $this->addSql('CREATE INDEX IDX_B92D7472169F1CF6 ON pieces (typePieceId)'); + $this->addSql('CREATE INDEX IDX_B92D747236799605 ON pieces (productId)'); + $this->addSql('CREATE TABLE _PieceConstructeurs (A VARCHAR(36) NOT NULL, B VARCHAR(36) NOT NULL, PRIMARY KEY (A, B))'); + $this->addSql('CREATE INDEX IDX_E94732E5D3D99E8B ON _PieceConstructeurs (A)'); + $this->addSql('CREATE INDEX IDX_E94732E54AD0CF31 ON _PieceConstructeurs (B)'); + $this->addSql('CREATE TABLE products (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, reference VARCHAR(255) DEFAULT NULL, supplierPrice NUMERIC(10, 2) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeProductId VARCHAR(36) DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_B3BA5A5A5E237E06 ON products (name)'); + $this->addSql('CREATE INDEX IDX_B3BA5A5A57B7763A ON products (typeProductId)'); + $this->addSql('CREATE TABLE _ProductConstructeurs (A VARCHAR(36) NOT NULL, B VARCHAR(36) NOT NULL, PRIMARY KEY (A, B))'); + $this->addSql('CREATE INDEX IDX_CF7403FCD3D99E8B ON _ProductConstructeurs (A)'); + $this->addSql('CREATE INDEX IDX_CF7403FC4AD0CF31 ON _ProductConstructeurs (B)'); + $this->addSql('CREATE TABLE profiles (id VARCHAR(36) NOT NULL, email VARCHAR(180) DEFAULT NULL, firstName VARCHAR(100) NOT NULL, lastName VARCHAR(100) NOT NULL, isActive BOOLEAN DEFAULT true NOT NULL, roles JSON DEFAULT \'["ROLE_USER"]\' NOT NULL, password VARCHAR(255) DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_email ON profiles (email)'); + $this->addSql('CREATE TABLE sites (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, contactName VARCHAR(255) DEFAULT \'\' NOT NULL, contactPhone VARCHAR(20) DEFAULT \'\' NOT NULL, contactAddress VARCHAR(500) DEFAULT \'\' NOT NULL, contactPostalCode VARCHAR(10) DEFAULT \'\' NOT NULL, contactCity VARCHAR(100) DEFAULT \'\' NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE TABLE type_machine_component_requirements (id VARCHAR(36) NOT NULL, label VARCHAR(255) DEFAULT NULL, minCount INT DEFAULT 1 NOT NULL, maxCount INT DEFAULT NULL, allowNewModels BOOLEAN DEFAULT true NOT NULL, allow_new_models BOOLEAN DEFAULT true NOT NULL, orderIndex INT DEFAULT 0 NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeMachineId VARCHAR(36) NOT NULL, typeComposantId VARCHAR(36) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_969587902F024C2 ON type_machine_component_requirements (typeMachineId)'); + $this->addSql('CREATE INDEX IDX_96958790CC8A4CEE ON type_machine_component_requirements (typeComposantId)'); + $this->addSql('CREATE TABLE type_machine_piece_requirements (id VARCHAR(36) NOT NULL, label VARCHAR(255) DEFAULT NULL, minCount INT DEFAULT 0 NOT NULL, maxCount INT DEFAULT NULL, required BOOLEAN DEFAULT false NOT NULL, allowNewModels BOOLEAN DEFAULT true NOT NULL, orderIndex INT DEFAULT 0 NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeMachineId VARCHAR(36) NOT NULL, typePieceId VARCHAR(36) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_F609E59E2F024C2 ON type_machine_piece_requirements (typeMachineId)'); + $this->addSql('CREATE INDEX IDX_F609E59E169F1CF6 ON type_machine_piece_requirements (typePieceId)'); + $this->addSql('CREATE TABLE type_machine_product_requirements (id VARCHAR(36) NOT NULL, label VARCHAR(255) DEFAULT NULL, minCount INT DEFAULT 0 NOT NULL, maxCount INT DEFAULT NULL, required BOOLEAN DEFAULT false NOT NULL, allowNewModels BOOLEAN DEFAULT true NOT NULL, orderIndex INT DEFAULT 0 NOT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, typeMachineId VARCHAR(36) NOT NULL, typeProductId VARCHAR(36) NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_29A51F982F024C2 ON type_machine_product_requirements (typeMachineId)'); + $this->addSql('CREATE INDEX IDX_29A51F9857B7763A ON type_machine_product_requirements (typeProductId)'); + $this->addSql('CREATE TABLE type_machines (id VARCHAR(36) NOT NULL, name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, maintenanceFrequency VARCHAR(255) DEFAULT NULL, maintenance_frequency VARCHAR(255) DEFAULT NULL, criticalParts JSON DEFAULT NULL, machinePieces JSON DEFAULT NULL, machine_pieces JSON DEFAULT NULL, specifications JSON DEFAULT NULL, createdAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, updatedAt TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_3C31AA115E237E06 ON type_machines (name)'); + $this->addSql('ALTER TABLE composants ADD CONSTRAINT FK_F95A3199CC8A4CEE FOREIGN KEY (typeComposantId) REFERENCES model_types (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE composants ADD CONSTRAINT FK_F95A319936799605 FOREIGN KEY (productId) REFERENCES products (id) ON DELETE SET NULL NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _ComposantConstructeurs ADD CONSTRAINT FK_60760125D3D99E8B FOREIGN KEY (A) REFERENCES composants (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _ComposantConstructeurs ADD CONSTRAINT FK_607601254AD0CF31 FOREIGN KEY (B) REFERENCES constructeurs (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_field_values ADD CONSTRAINT FK_6B64D7FF5C4A705F FOREIGN KEY (customFieldId) REFERENCES custom_fields (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_field_values ADD CONSTRAINT FK_6B64D7FF633EC4FD FOREIGN KEY (machineId) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_field_values ADD CONSTRAINT FK_6B64D7FF345EE564 FOREIGN KEY (composantId) REFERENCES composants (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_field_values ADD CONSTRAINT FK_6B64D7FF3C6A9D1 FOREIGN KEY (pieceId) REFERENCES pieces (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_field_values ADD CONSTRAINT FK_6B64D7FF36799605 FOREIGN KEY (productId) REFERENCES products (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_fields ADD CONSTRAINT FK_4A48378C2F024C2 FOREIGN KEY (typeMachineId) REFERENCES type_machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_fields ADD CONSTRAINT FK_4A48378CCC8A4CEE FOREIGN KEY (typeComposantId) REFERENCES model_types (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_fields ADD CONSTRAINT FK_4A48378C169F1CF6 FOREIGN KEY (typePieceId) REFERENCES model_types (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE custom_fields ADD CONSTRAINT FK_4A48378C57B7763A FOREIGN KEY (typeProductId) REFERENCES model_types (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE documents ADD CONSTRAINT FK_A2B07288633EC4FD FOREIGN KEY (machineId) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE documents ADD CONSTRAINT FK_A2B07288345EE564 FOREIGN KEY (composantId) REFERENCES composants (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE documents ADD CONSTRAINT FK_A2B072883C6A9D1 FOREIGN KEY (pieceId) REFERENCES pieces (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE documents ADD CONSTRAINT FK_A2B0728836799605 FOREIGN KEY (productId) REFERENCES products (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE documents ADD CONSTRAINT FK_A2B072886973A4FD FOREIGN KEY (siteId) REFERENCES sites (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_component_links ADD CONSTRAINT FK_528EFE19633EC4FD FOREIGN KEY (machineId) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_component_links ADD CONSTRAINT FK_528EFE19345EE564 FOREIGN KEY (composantId) REFERENCES composants (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_component_links ADD CONSTRAINT FK_528EFE19EF6CF34B FOREIGN KEY (parentLinkId) REFERENCES machine_component_links (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_component_links ADD CONSTRAINT FK_528EFE19C44B383C FOREIGN KEY (typeMachineComponentRequirementId) REFERENCES type_machine_component_requirements (id) ON DELETE SET NULL NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_piece_links ADD CONSTRAINT FK_62941615633EC4FD FOREIGN KEY (machineId) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_piece_links ADD CONSTRAINT FK_629416153C6A9D1 FOREIGN KEY (pieceId) REFERENCES pieces (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_piece_links ADD CONSTRAINT FK_62941615EF6CF34B FOREIGN KEY (parentLinkId) REFERENCES machine_component_links (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_piece_links ADD CONSTRAINT FK_62941615F957D314 FOREIGN KEY (typeMachinePieceRequirementId) REFERENCES type_machine_piece_requirements (id) ON DELETE SET NULL NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC32259633EC4FD FOREIGN KEY (machineId) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC3225936799605 FOREIGN KEY (productId) REFERENCES products (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC32259B590B209 FOREIGN KEY (typeMachineProductRequirementId) REFERENCES type_machine_product_requirements (id) ON DELETE SET NULL NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC32259EF6CF34B FOREIGN KEY (parentLinkId) REFERENCES machine_product_links (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC32259A63AC5DC FOREIGN KEY (parentComponentLinkId) REFERENCES machine_component_links (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machine_product_links ADD CONSTRAINT FK_8CC32259937A1D7C FOREIGN KEY (parentPieceLinkId) REFERENCES machine_piece_links (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machines ADD CONSTRAINT FK_F1CE8DED6973A4FD FOREIGN KEY (siteId) REFERENCES sites (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE machines ADD CONSTRAINT FK_F1CE8DED2F024C2 FOREIGN KEY (typeMachineId) REFERENCES type_machines (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _MachineConstructeurs ADD CONSTRAINT FK_E6A040CCD3D99E8B FOREIGN KEY (A) REFERENCES machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _MachineConstructeurs ADD CONSTRAINT FK_E6A040CC4AD0CF31 FOREIGN KEY (B) REFERENCES constructeurs (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE pieces ADD CONSTRAINT FK_B92D7472169F1CF6 FOREIGN KEY (typePieceId) REFERENCES model_types (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE pieces ADD CONSTRAINT FK_B92D747236799605 FOREIGN KEY (productId) REFERENCES products (id) ON DELETE SET NULL NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _PieceConstructeurs ADD CONSTRAINT FK_E94732E5D3D99E8B FOREIGN KEY (A) REFERENCES pieces (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _PieceConstructeurs ADD CONSTRAINT FK_E94732E54AD0CF31 FOREIGN KEY (B) REFERENCES constructeurs (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE products ADD CONSTRAINT FK_B3BA5A5A57B7763A FOREIGN KEY (typeProductId) REFERENCES model_types (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _ProductConstructeurs ADD CONSTRAINT FK_CF7403FCD3D99E8B FOREIGN KEY (A) REFERENCES products (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE _ProductConstructeurs ADD CONSTRAINT FK_CF7403FC4AD0CF31 FOREIGN KEY (B) REFERENCES constructeurs (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_component_requirements ADD CONSTRAINT FK_969587902F024C2 FOREIGN KEY (typeMachineId) REFERENCES type_machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_component_requirements ADD CONSTRAINT FK_96958790CC8A4CEE FOREIGN KEY (typeComposantId) REFERENCES model_types (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_piece_requirements ADD CONSTRAINT FK_F609E59E2F024C2 FOREIGN KEY (typeMachineId) REFERENCES type_machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_piece_requirements ADD CONSTRAINT FK_F609E59E169F1CF6 FOREIGN KEY (typePieceId) REFERENCES model_types (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_product_requirements ADD CONSTRAINT FK_29A51F982F024C2 FOREIGN KEY (typeMachineId) REFERENCES type_machines (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE type_machine_product_requirements ADD CONSTRAINT FK_29A51F9857B7763A FOREIGN KEY (typeProductId) REFERENCES model_types (id) NOT DEFERRABLE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE composants DROP CONSTRAINT FK_F95A3199CC8A4CEE'); + $this->addSql('ALTER TABLE composants DROP CONSTRAINT FK_F95A319936799605'); + $this->addSql('ALTER TABLE _ComposantConstructeurs DROP CONSTRAINT FK_60760125D3D99E8B'); + $this->addSql('ALTER TABLE _ComposantConstructeurs DROP CONSTRAINT FK_607601254AD0CF31'); + $this->addSql('ALTER TABLE custom_field_values DROP CONSTRAINT FK_6B64D7FF5C4A705F'); + $this->addSql('ALTER TABLE custom_field_values DROP CONSTRAINT FK_6B64D7FF633EC4FD'); + $this->addSql('ALTER TABLE custom_field_values DROP CONSTRAINT FK_6B64D7FF345EE564'); + $this->addSql('ALTER TABLE custom_field_values DROP CONSTRAINT FK_6B64D7FF3C6A9D1'); + $this->addSql('ALTER TABLE custom_field_values DROP CONSTRAINT FK_6B64D7FF36799605'); + $this->addSql('ALTER TABLE custom_fields DROP CONSTRAINT FK_4A48378C2F024C2'); + $this->addSql('ALTER TABLE custom_fields DROP CONSTRAINT FK_4A48378CCC8A4CEE'); + $this->addSql('ALTER TABLE custom_fields DROP CONSTRAINT FK_4A48378C169F1CF6'); + $this->addSql('ALTER TABLE custom_fields DROP CONSTRAINT FK_4A48378C57B7763A'); + $this->addSql('ALTER TABLE documents DROP CONSTRAINT FK_A2B07288633EC4FD'); + $this->addSql('ALTER TABLE documents DROP CONSTRAINT FK_A2B07288345EE564'); + $this->addSql('ALTER TABLE documents DROP CONSTRAINT FK_A2B072883C6A9D1'); + $this->addSql('ALTER TABLE documents DROP CONSTRAINT FK_A2B0728836799605'); + $this->addSql('ALTER TABLE documents DROP CONSTRAINT FK_A2B072886973A4FD'); + $this->addSql('ALTER TABLE machine_component_links DROP CONSTRAINT FK_528EFE19633EC4FD'); + $this->addSql('ALTER TABLE machine_component_links DROP CONSTRAINT FK_528EFE19345EE564'); + $this->addSql('ALTER TABLE machine_component_links DROP CONSTRAINT FK_528EFE19EF6CF34B'); + $this->addSql('ALTER TABLE machine_component_links DROP CONSTRAINT FK_528EFE19C44B383C'); + $this->addSql('ALTER TABLE machine_piece_links DROP CONSTRAINT FK_62941615633EC4FD'); + $this->addSql('ALTER TABLE machine_piece_links DROP CONSTRAINT FK_629416153C6A9D1'); + $this->addSql('ALTER TABLE machine_piece_links DROP CONSTRAINT FK_62941615EF6CF34B'); + $this->addSql('ALTER TABLE machine_piece_links DROP CONSTRAINT FK_62941615F957D314'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC32259633EC4FD'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC3225936799605'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC32259B590B209'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC32259EF6CF34B'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC32259A63AC5DC'); + $this->addSql('ALTER TABLE machine_product_links DROP CONSTRAINT FK_8CC32259937A1D7C'); + $this->addSql('ALTER TABLE machines DROP CONSTRAINT FK_F1CE8DED6973A4FD'); + $this->addSql('ALTER TABLE machines DROP CONSTRAINT FK_F1CE8DED2F024C2'); + $this->addSql('ALTER TABLE _MachineConstructeurs DROP CONSTRAINT FK_E6A040CCD3D99E8B'); + $this->addSql('ALTER TABLE _MachineConstructeurs DROP CONSTRAINT FK_E6A040CC4AD0CF31'); + $this->addSql('ALTER TABLE pieces DROP CONSTRAINT FK_B92D7472169F1CF6'); + $this->addSql('ALTER TABLE pieces DROP CONSTRAINT FK_B92D747236799605'); + $this->addSql('ALTER TABLE _PieceConstructeurs DROP CONSTRAINT FK_E94732E5D3D99E8B'); + $this->addSql('ALTER TABLE _PieceConstructeurs DROP CONSTRAINT FK_E94732E54AD0CF31'); + $this->addSql('ALTER TABLE products DROP CONSTRAINT FK_B3BA5A5A57B7763A'); + $this->addSql('ALTER TABLE _ProductConstructeurs DROP CONSTRAINT FK_CF7403FCD3D99E8B'); + $this->addSql('ALTER TABLE _ProductConstructeurs DROP CONSTRAINT FK_CF7403FC4AD0CF31'); + $this->addSql('ALTER TABLE type_machine_component_requirements DROP CONSTRAINT FK_969587902F024C2'); + $this->addSql('ALTER TABLE type_machine_component_requirements DROP CONSTRAINT FK_96958790CC8A4CEE'); + $this->addSql('ALTER TABLE type_machine_piece_requirements DROP CONSTRAINT FK_F609E59E2F024C2'); + $this->addSql('ALTER TABLE type_machine_piece_requirements DROP CONSTRAINT FK_F609E59E169F1CF6'); + $this->addSql('ALTER TABLE type_machine_product_requirements DROP CONSTRAINT FK_29A51F982F024C2'); + $this->addSql('ALTER TABLE type_machine_product_requirements DROP CONSTRAINT FK_29A51F9857B7763A'); + $this->addSql('DROP TABLE composants'); + $this->addSql('DROP TABLE _ComposantConstructeurs'); + $this->addSql('DROP TABLE constructeurs'); + $this->addSql('DROP TABLE custom_field_values'); + $this->addSql('DROP TABLE custom_fields'); + $this->addSql('DROP TABLE documents'); + $this->addSql('DROP TABLE machine_component_links'); + $this->addSql('DROP TABLE machine_piece_links'); + $this->addSql('DROP TABLE machine_product_links'); + $this->addSql('DROP TABLE machines'); + $this->addSql('DROP TABLE _MachineConstructeurs'); + $this->addSql('DROP TABLE model_types'); + $this->addSql('DROP TABLE pieces'); + $this->addSql('DROP TABLE _PieceConstructeurs'); + $this->addSql('DROP TABLE products'); + $this->addSql('DROP TABLE _ProductConstructeurs'); + $this->addSql('DROP TABLE profiles'); + $this->addSql('DROP TABLE sites'); + $this->addSql('DROP TABLE type_machine_component_requirements'); + $this->addSql('DROP TABLE type_machine_piece_requirements'); + $this->addSql('DROP TABLE type_machine_product_requirements'); + $this->addSql('DROP TABLE type_machines'); + } +} diff --git a/scripts/insert_profiles.sql b/scripts/insert_profiles.sql new file mode 100644 index 0000000..e5fe79b --- /dev/null +++ b/scripts/insert_profiles.sql @@ -0,0 +1,5 @@ +INSERT INTO public.profiles (id, firstname, lastname, isactive, createdat, updatedat) +VALUES + ('admin-default-profile', 'Admin', 'General', true, '2025-09-23 13:09:47.804', '2025-09-23 13:09:47.804'), + ('cmhab2j3x003g47v77xhnm1ff', 'Elodie', 'Souriau', true, '2025-10-28 08:29:25.437', '2025-10-28 08:29:25.437') +ON CONFLICT (id) DO NOTHING; diff --git a/scripts/migrate-inventory-data.sh b/scripts/migrate-inventory-data.sh new file mode 100755 index 0000000..fd811f3 --- /dev/null +++ b/scripts/migrate-inventory-data.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +SOURCE_DB="${SOURCE_DB:-inventory_data}" +TARGET_DB="${TARGET_DB:-inventory}" +PGHOST="${PGHOST:-localhost}" +PGPORT="${PGPORT:-5433}" +PGUSER="${PGUSER:-postgres}" +PGPASSWORD="${PGPASSWORD:-postgres}" +DUMP_FILE="${DUMP_FILE:-/tmp/inventory_data_dump.sql}" + +export PGPASSWORD + +EXCLUDE_TABLES=( + "doctrine_migration_versions" + "migration_versions" + "_prisma_migrations" + "profiles" +) + +EXCLUDE_ARGS=() +for table in "${EXCLUDE_TABLES[@]}"; do + EXCLUDE_ARGS+=(--exclude-table-data="$table") +done + +echo "Dumping data from ${SOURCE_DB}..." +pg_dump \ + --data-only \ + --inserts \ + --no-owner \ + --no-privileges \ + "${EXCLUDE_ARGS[@]}" \ + -h "${PGHOST}" \ + -p "${PGPORT}" \ + -U "${PGUSER}" \ + "${SOURCE_DB}" > "${DUMP_FILE}" + +echo "Restoring data into ${TARGET_DB}..." +psql \ + -h "${PGHOST}" \ + -p "${PGPORT}" \ + -U "${PGUSER}" \ + "${TARGET_DB}" < "${DUMP_FILE}" + +echo "Done. Data copied from ${SOURCE_DB} to ${TARGET_DB}." diff --git a/scripts/normalize-dump.py b/scripts/normalize-dump.py new file mode 100644 index 0000000..67e0ebe --- /dev/null +++ b/scripts/normalize-dump.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 +import sys + + +TABLE_NAME_MAP = { + "ModelType": "model_types", +} + + +def normalize_identifiers(sql: str) -> str: + out = [] + i = 0 + in_single = False + length = len(sql) + + while i < length: + ch = sql[i] + + if in_single: + if ch == "'": + if i + 1 < length and sql[i + 1] == "'": + out.append("''") + i += 2 + continue + in_single = False + out.append(ch) + i += 1 + continue + + if ch == "'": + in_single = True + out.append(ch) + i += 1 + continue + + if ch == '"': + i += 1 + ident = [] + while i < length: + if sql[i] == '"': + break + ident.append(sql[i]) + i += 1 + ident_str = ''.join(ident) + mapped = TABLE_NAME_MAP.get(ident_str) + if mapped is not None: + out.append(mapped) + else: + out.append(ident_str.lower()) + if i < length and sql[i] == '"': + i += 1 + continue + + out.append(ch) + i += 1 + + return ''.join(out) + + +def main() -> int: + if len(sys.argv) != 3: + print("Usage: scripts/normalize-dump.py ", file=sys.stderr) + return 1 + + src = sys.argv[1] + dst = sys.argv[2] + + with open(src, "r", encoding="utf-8") as f: + data = f.read() + + normalized = normalize_identifiers(data) + + with open(dst, "w", encoding="utf-8") as f: + f.write(normalized) + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/validate-migration.php b/scripts/validate-migration.php new file mode 100644 index 0000000..155377a --- /dev/null +++ b/scripts/validate-migration.php @@ -0,0 +1,139 @@ + sprintf('pgsql:host=%s;port=%d;dbname=%s', $host, $port, $db), + 'user' => $user, + 'pass' => $pass, + ]; +} + +function connect(string $url): PDO +{ + $config = parseDatabaseUrl($url); + $pdo = new PDO($config['dsn'], $config['user'], $config['pass'], [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + ]); + + return $pdo; +} + +$sourceUrl = getenv('SOURCE_DATABASE_URL') ?: ''; +$targetUrl = getenv('TARGET_DATABASE_URL') ?: ''; + +if ($sourceUrl === '' || $targetUrl === '') { + fwrite(STDERR, "Usage: SOURCE_DATABASE_URL=... TARGET_DATABASE_URL=... php scripts/validate-migration.php\n"); + exit(1); +} + +$tables = [ + 'sites', + 'type_machines', + 'machines', + 'model_types', + 'composants', + 'pieces', + 'products', + 'constructeurs', + 'documents', + 'custom_fields', + 'custom_field_values', + 'machine_component_links', + 'machine_piece_links', + 'machine_product_links', + 'type_machine_component_requirements', + 'type_machine_piece_requirements', + 'type_machine_product_requirements', + '_machineconstructeurs', + '_composantconstructeurs', + '_piececonstructeurs', + '_productconstructeurs', + 'profiles', +]; + +$skipTables = array_filter(array_map('trim', explode(',', getenv('SKIP_TABLES') ?: 'profiles'))); + +$sourceTableMap = [ + 'model_types' => ['ModelType', 'model_types'], + '_machineconstructeurs' => ['_MachineConstructeurs', '_machineconstructeurs'], + '_composantconstructeurs' => ['_ComposantConstructeurs', '_composantconstructeurs'], + '_piececonstructeurs' => ['_PieceConstructeurs', '_piececonstructeurs'], + '_productconstructeurs' => ['_ProductConstructeurs', '_productconstructeurs'], +]; + +function resolveTable(PDO $db, array $candidates): ?string +{ + foreach ($candidates as $candidate) { + $exists = (bool) $db + ->query(sprintf("SELECT to_regclass('public.%s')", $candidate)) + ->fetchColumn(); + if ($exists) { + return $candidate; + } + + $quoted = (bool) $db + ->query(sprintf("SELECT to_regclass('public.\"%s\"')", $candidate)) + ->fetchColumn(); + if ($quoted) { + return sprintf('"%s"', $candidate); + } + } + + return null; +} + +$source = connect($sourceUrl); +$target = connect($targetUrl); + +$hasDifferences = false; + +foreach ($tables as $table) { + if (in_array($table, $skipTables, true)) { + continue; + } + $sourceCandidates = $sourceTableMap[$table] ?? [$table]; + $sourceTable = resolveTable($source, $sourceCandidates); + $sourceExists = $sourceTable !== null; + $targetExists = (bool) $target + ->query(sprintf("SELECT to_regclass('public.%s')", $table)) + ->fetchColumn(); + + if (!$sourceExists || !$targetExists) { + $hasDifferences = true; + printf( + "%s: source=%s target=%s\n", + $table, + $sourceExists ? 'exists' : 'missing', + $targetExists ? 'exists' : 'missing' + ); + continue; + } + + $sourceCount = (int) $source->query(sprintf('SELECT COUNT(*) FROM public.%s', $sourceTable))->fetchColumn(); + $targetCount = (int) $target->query(sprintf('SELECT COUNT(*) FROM public.%s', $table))->fetchColumn(); + + if ($sourceCount !== $targetCount) { + $hasDifferences = true; + printf("%s: source=%d target=%d\n", $table, $sourceCount, $targetCount); + } +} + +if ($hasDifferences) { + exit(2); +} + +echo "Counts match for all tables.\n";