migrations/Version20260203100001.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * Create Service Checklist module tables.
  8.  */
  9. final class Version20260203100001 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return 'Create Service Checklist module tables: templates, checklists, sections, items, and defects';
  14.     }
  15.     public function up(Schema $schema): void
  16.     {
  17.         // Template tables
  18.         $this->addSql('
  19.             CREATE TABLE service_checklist_template (
  20.                 id INT AUTO_INCREMENT NOT NULL,
  21.                 name VARCHAR(255) NOT NULL,
  22.                 checklist_type VARCHAR(20) NOT NULL,
  23.                 asset_type VARCHAR(100) DEFAULT NULL,
  24.                 description LONGTEXT DEFAULT NULL,
  25.                 is_active TINYINT(1) NOT NULL DEFAULT 1,
  26.                 created_at DATETIME NOT NULL,
  27.                 updated_at DATETIME NOT NULL,
  28.                 deleted_at DATETIME DEFAULT NULL,
  29.                 UNIQUE INDEX UNIQ_template_type_asset (checklist_type, asset_type),
  30.                 PRIMARY KEY(id)
  31.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  32.         ');
  33.         $this->addSql('
  34.             CREATE TABLE service_checklist_template_section (
  35.                 id INT AUTO_INCREMENT NOT NULL,
  36.                 template_id INT DEFAULT NULL,
  37.                 name VARCHAR(255) NOT NULL,
  38.                 sort_order INT NOT NULL DEFAULT 0,
  39.                 INDEX IDX_template_section_template (template_id),
  40.                 PRIMARY KEY(id),
  41.                 CONSTRAINT FK_template_section_template FOREIGN KEY (template_id) 
  42.                     REFERENCES service_checklist_template (id) ON DELETE CASCADE
  43.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  44.         ');
  45.         $this->addSql('
  46.             CREATE TABLE service_checklist_template_item (
  47.                 id INT AUTO_INCREMENT NOT NULL,
  48.                 section_id INT DEFAULT NULL,
  49.                 name VARCHAR(500) NOT NULL,
  50.                 item_type VARCHAR(20) NOT NULL DEFAULT \'inspection\',
  51.                 service_level VARCHAR(10) NOT NULL DEFAULT \'both\',
  52.                 sort_order INT NOT NULL DEFAULT 0,
  53.                 is_mandatory TINYINT(1) NOT NULL DEFAULT 0,
  54.                 requires_photo TINYINT(1) NOT NULL DEFAULT 0,
  55.                 requires_note TINYINT(1) NOT NULL DEFAULT 0,
  56.                 min_value DECIMAL(10,2) DEFAULT NULL,
  57.                 max_value DECIMAL(10,2) DEFAULT NULL,
  58.                 unit VARCHAR(20) DEFAULT NULL,
  59.                 INDEX IDX_template_item_section (section_id),
  60.                 PRIMARY KEY(id),
  61.                 CONSTRAINT FK_template_item_section FOREIGN KEY (section_id) 
  62.                     REFERENCES service_checklist_template_section (id) ON DELETE CASCADE
  63.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  64.         ');
  65.         // Checklist instance tables
  66.         $this->addSql('
  67.             CREATE TABLE service_checklist (
  68.                 id INT AUTO_INCREMENT NOT NULL,
  69.                 uuid VARCHAR(36) NOT NULL,
  70.                 job_id INT NOT NULL,
  71.                 asset_lifecycle_period_id INT DEFAULT NULL,
  72.                 template_id INT DEFAULT NULL,
  73.                 checklist_type VARCHAR(20) NOT NULL,
  74.                 service_level VARCHAR(1) DEFAULT NULL,
  75.                 status VARCHAR(30) NOT NULL DEFAULT \'not_started\',
  76.                 engineer_id INT DEFAULT NULL,
  77.                 engineer_signed_at DATETIME DEFAULT NULL,
  78.                 engineer_signature_id INT DEFAULT NULL,
  79.                 customer_name VARCHAR(255) DEFAULT NULL,
  80.                 customer_signed_at DATETIME DEFAULT NULL,
  81.                 customer_signature_id INT DEFAULT NULL,
  82.                 signoff_token VARCHAR(64) DEFAULT NULL,
  83.                 signoff_token_expires_at DATETIME DEFAULT NULL,
  84.                 pdf_path VARCHAR(500) DEFAULT NULL,
  85.                 pdf_filename VARCHAR(255) DEFAULT NULL,
  86.                 created_at DATETIME NOT NULL,
  87.                 updated_at DATETIME NOT NULL,
  88.                 completed_at DATETIME DEFAULT NULL,
  89.                 synced_at DATETIME DEFAULT NULL,
  90.                 deleted_at DATETIME DEFAULT NULL,
  91.                 UNIQUE INDEX UNIQ_checklist_job (job_id),
  92.                 INDEX IDX_checklist_asset (asset_lifecycle_period_id),
  93.                 INDEX IDX_checklist_status (status),
  94.                 INDEX IDX_checklist_template (template_id),
  95.                 INDEX IDX_checklist_engineer (engineer_id),
  96.                 INDEX IDX_checklist_engineer_sig (engineer_signature_id),
  97.                 INDEX IDX_checklist_customer_sig (customer_signature_id),
  98.                 PRIMARY KEY(id),
  99.                 CONSTRAINT FK_checklist_job FOREIGN KEY (job_id) 
  100.                     REFERENCES job (id) ON DELETE CASCADE,
  101.                 CONSTRAINT FK_checklist_alp FOREIGN KEY (asset_lifecycle_period_id) 
  102.                     REFERENCES asset_lifecycle_period (id) ON DELETE SET NULL,
  103.                 CONSTRAINT FK_checklist_template FOREIGN KEY (template_id) 
  104.                     REFERENCES service_checklist_template (id) ON DELETE SET NULL,
  105.                 CONSTRAINT FK_checklist_engineer FOREIGN KEY (engineer_id) 
  106.                     REFERENCES user (id) ON DELETE SET NULL,
  107.                 CONSTRAINT FK_checklist_engineer_sig FOREIGN KEY (engineer_signature_id) 
  108.                     REFERENCES image (id) ON DELETE SET NULL,
  109.                 CONSTRAINT FK_checklist_customer_sig FOREIGN KEY (customer_signature_id) 
  110.                     REFERENCES image (id) ON DELETE SET NULL
  111.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  112.         ');
  113.         $this->addSql('
  114.             CREATE TABLE service_checklist_section (
  115.                 id INT AUTO_INCREMENT NOT NULL,
  116.                 checklist_id INT DEFAULT NULL,
  117.                 template_section_id INT DEFAULT NULL,
  118.                 name VARCHAR(255) NOT NULL,
  119.                 sort_order INT NOT NULL DEFAULT 0,
  120.                 INDEX IDX_section_checklist (checklist_id),
  121.                 INDEX IDX_section_template (template_section_id),
  122.                 PRIMARY KEY(id),
  123.                 CONSTRAINT FK_section_checklist FOREIGN KEY (checklist_id) 
  124.                     REFERENCES service_checklist (id) ON DELETE CASCADE,
  125.                 CONSTRAINT FK_section_template FOREIGN KEY (template_section_id) 
  126.                     REFERENCES service_checklist_template_section (id) ON DELETE SET NULL
  127.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  128.         ');
  129.         $this->addSql('
  130.             CREATE TABLE service_checklist_item (
  131.                 id INT AUTO_INCREMENT NOT NULL,
  132.                 section_id INT DEFAULT NULL,
  133.                 template_item_id INT DEFAULT NULL,
  134.                 name VARCHAR(500) NOT NULL,
  135.                 item_type VARCHAR(20) NOT NULL DEFAULT \'inspection\',
  136.                 sort_order INT NOT NULL DEFAULT 0,
  137.                 is_mandatory TINYINT(1) NOT NULL DEFAULT 0,
  138.                 requires_photo TINYINT(1) NOT NULL DEFAULT 0,
  139.                 requires_note TINYINT(1) NOT NULL DEFAULT 0,
  140.                 min_value DECIMAL(10,2) DEFAULT NULL,
  141.                 max_value DECIMAL(10,2) DEFAULT NULL,
  142.                 unit VARCHAR(20) DEFAULT NULL,
  143.                 outcome VARCHAR(20) DEFAULT NULL,
  144.                 measured_value DECIMAL(10,2) DEFAULT NULL,
  145.                 note LONGTEXT DEFAULT NULL,
  146.                 completed_at DATETIME DEFAULT NULL,
  147.                 INDEX IDX_item_section (section_id),
  148.                 INDEX IDX_item_template (template_item_id),
  149.                 INDEX IDX_item_outcome (outcome),
  150.                 PRIMARY KEY(id),
  151.                 CONSTRAINT FK_item_section FOREIGN KEY (section_id) 
  152.                     REFERENCES service_checklist_section (id) ON DELETE CASCADE,
  153.                 CONSTRAINT FK_item_template FOREIGN KEY (template_item_id) 
  154.                     REFERENCES service_checklist_template_item (id) ON DELETE SET NULL
  155.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  156.         ');
  157.         // Checklist item images (many-to-many)
  158.         $this->addSql('
  159.             CREATE TABLE service_checklist_item_images (
  160.                 checklist_item_id INT NOT NULL,
  161.                 image_id INT NOT NULL,
  162.                 INDEX IDX_item_images_item (checklist_item_id),
  163.                 INDEX IDX_item_images_image (image_id),
  164.                 PRIMARY KEY(checklist_item_id, image_id),
  165.                 CONSTRAINT FK_item_images_item FOREIGN KEY (checklist_item_id) 
  166.                     REFERENCES service_checklist_item (id) ON DELETE CASCADE,
  167.                 CONSTRAINT FK_item_images_image FOREIGN KEY (image_id) 
  168.                     REFERENCES image (id) ON DELETE CASCADE
  169.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  170.         ');
  171.         // Defects table
  172.         $this->addSql('
  173.             CREATE TABLE service_checklist_defect (
  174.                 id INT AUTO_INCREMENT NOT NULL,
  175.                 checklist_id INT DEFAULT NULL,
  176.                 checklist_item_id INT DEFAULT NULL,
  177.                 defect_type VARCHAR(20) NOT NULL,
  178.                 severity VARCHAR(20) DEFAULT NULL,
  179.                 status VARCHAR(20) NOT NULL DEFAULT \'open\',
  180.                 description LONGTEXT NOT NULL,
  181.                 office_notes LONGTEXT DEFAULT NULL,
  182.                 severity_set_by_id INT DEFAULT NULL,
  183.                 severity_set_at DATETIME DEFAULT NULL,
  184.                 created_at DATETIME NOT NULL,
  185.                 updated_at DATETIME NOT NULL,
  186.                 resolved_at DATETIME DEFAULT NULL,
  187.                 INDEX IDX_defect_checklist (checklist_id),
  188.                 INDEX IDX_defect_item (checklist_item_id),
  189.                 INDEX IDX_defect_severity (severity),
  190.                 INDEX IDX_defect_status (status),
  191.                 INDEX IDX_defect_set_by (severity_set_by_id),
  192.                 PRIMARY KEY(id),
  193.                 CONSTRAINT FK_defect_checklist FOREIGN KEY (checklist_id) 
  194.                     REFERENCES service_checklist (id) ON DELETE CASCADE,
  195.                 CONSTRAINT FK_defect_item FOREIGN KEY (checklist_item_id) 
  196.                     REFERENCES service_checklist_item (id) ON DELETE CASCADE,
  197.                 CONSTRAINT FK_defect_set_by FOREIGN KEY (severity_set_by_id) 
  198.                     REFERENCES user (id) ON DELETE SET NULL
  199.             ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
  200.         ');
  201.     }
  202.     public function down(Schema $schema): void
  203.     {
  204.         $this->addSql('DROP TABLE IF EXISTS service_checklist_defect');
  205.         $this->addSql('DROP TABLE IF EXISTS service_checklist_item_images');
  206.         $this->addSql('DROP TABLE IF EXISTS service_checklist_item');
  207.         $this->addSql('DROP TABLE IF EXISTS service_checklist_section');
  208.         $this->addSql('DROP TABLE IF EXISTS service_checklist');
  209.         $this->addSql('DROP TABLE IF EXISTS service_checklist_template_item');
  210.         $this->addSql('DROP TABLE IF EXISTS service_checklist_template_section');
  211.         $this->addSql('DROP TABLE IF EXISTS service_checklist_template');
  212.     }
  213. }