migrations/Version20260319110000.php line 1

  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. final class Version20260319110000 extends AbstractMigration
  7. {
  8.     public function getDescription(): string
  9.     {
  10.         return 'Add survey templates, survey campaigns and student survey invitations';
  11.     }
  12.     public function up(Schema $schema): void
  13.     {
  14.         $this->abortIf(
  15.             !$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\MySQL57Platform,
  16.             "Migration can only be executed safely on '\Doctrine\DBAL\Platforms\MySQL57Platform'."
  17.         );
  18.         $this->addSql('CREATE TABLE survey_template (
  19.             id INT AUTO_INCREMENT NOT NULL,
  20.             center_id INT NOT NULL,
  21.             modality_id INT DEFAULT NULL,
  22.             name VARCHAR(255) NOT NULL,
  23.             active TINYINT(1) DEFAULT 1 NOT NULL,
  24.             disabled_reason VARCHAR(255) DEFAULT NULL,
  25.             created_at DATETIME NOT NULL,
  26.             updated_at DATETIME NOT NULL,
  27.             INDEX IDX_SURVEY_TEMPLATE_CENTER (center_id),
  28.             INDEX IDX_SURVEY_TEMPLATE_MODALITY (modality_id),
  29.             PRIMARY KEY(id)
  30.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  31.         $this->addSql('CREATE TABLE survey_template_question (
  32.             id INT AUTO_INCREMENT NOT NULL,
  33.             template_id INT NOT NULL,
  34.             position INT NOT NULL,
  35.             label LONGTEXT NOT NULL,
  36.             type VARCHAR(255) NOT NULL,
  37.             options_text LONGTEXT DEFAULT NULL,
  38.             INDEX IDX_SURVEY_TEMPLATE_QUESTION_TEMPLATE (template_id),
  39.             PRIMARY KEY(id)
  40.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  41.         $this->addSql('CREATE TABLE survey_campaign (
  42.             id INT AUTO_INCREMENT NOT NULL,
  43.             center_id INT NOT NULL,
  44.             event_id INT NOT NULL,
  45.             template_id INT NOT NULL,
  46.             created_by_id INT DEFAULT NULL,
  47.             sent_by_id INT DEFAULT NULL,
  48.             state VARCHAR(255) NOT NULL,
  49.             close_date DATE DEFAULT NULL,
  50.             created_at DATETIME NOT NULL,
  51.             updated_at DATETIME NOT NULL,
  52.             sent_at DATETIME DEFAULT NULL,
  53.             UNIQUE INDEX UNIQ_SURVEY_CAMPAIGN_EVENT (event_id),
  54.             INDEX IDX_SURVEY_CAMPAIGN_CENTER (center_id),
  55.             INDEX IDX_SURVEY_CAMPAIGN_TEMPLATE (template_id),
  56.             INDEX IDX_SURVEY_CAMPAIGN_CREATED_BY (created_by_id),
  57.             INDEX IDX_SURVEY_CAMPAIGN_SENT_BY (sent_by_id),
  58.             PRIMARY KEY(id)
  59.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  60.         $this->addSql('CREATE TABLE survey_campaign_question (
  61.             id INT AUTO_INCREMENT NOT NULL,
  62.             campaign_id INT NOT NULL,
  63.             position INT NOT NULL,
  64.             label LONGTEXT NOT NULL,
  65.             type VARCHAR(255) NOT NULL,
  66.             options_text LONGTEXT DEFAULT NULL,
  67.             INDEX IDX_SURVEY_CAMPAIGN_QUESTION_CAMPAIGN (campaign_id),
  68.             PRIMARY KEY(id)
  69.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  70.         $this->addSql('CREATE TABLE survey_invitation (
  71.             id INT AUTO_INCREMENT NOT NULL,
  72.             campaign_id INT NOT NULL,
  73.             user_id INT NOT NULL,
  74.             token VARCHAR(64) NOT NULL,
  75.             created_at DATETIME NOT NULL,
  76.             sent_at DATETIME DEFAULT NULL,
  77.             opened_at DATETIME DEFAULT NULL,
  78.             responded_at DATETIME DEFAULT NULL,
  79.             UNIQUE INDEX UNIQ_SURVEY_INVITATION_TOKEN (token),
  80.             UNIQUE INDEX UNIQ_SURVEY_INVITATION_CAMPAIGN_USER (campaign_id, user_id),
  81.             INDEX IDX_SURVEY_INVITATION_USER (user_id),
  82.             PRIMARY KEY(id)
  83.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  84.         $this->addSql('CREATE TABLE survey_invitation_answer (
  85.             id INT AUTO_INCREMENT NOT NULL,
  86.             invitation_id INT NOT NULL,
  87.             question_id INT NOT NULL,
  88.             answer_text LONGTEXT NOT NULL,
  89.             UNIQUE INDEX UNIQ_SURVEY_INVITATION_ANSWER (invitation_id, question_id),
  90.             INDEX IDX_SURVEY_INVITATION_ANSWER_QUESTION (question_id),
  91.             PRIMARY KEY(id)
  92.         ) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB');
  93.         $this->addSql('ALTER TABLE survey_template ADD CONSTRAINT FK_SURVEY_TEMPLATE_CENTER FOREIGN KEY (center_id) REFERENCES centers (id)');
  94.         $this->addSql('ALTER TABLE survey_template ADD CONSTRAINT FK_SURVEY_TEMPLATE_MODALITY FOREIGN KEY (modality_id) REFERENCES taxonomy_value (id) ON DELETE SET NULL');
  95.         $this->addSql('ALTER TABLE survey_template_question ADD CONSTRAINT FK_SURVEY_TEMPLATE_QUESTION_TEMPLATE FOREIGN KEY (template_id) REFERENCES survey_template (id) ON DELETE CASCADE');
  96.         $this->addSql('ALTER TABLE survey_campaign ADD CONSTRAINT FK_SURVEY_CAMPAIGN_CENTER FOREIGN KEY (center_id) REFERENCES centers (id)');
  97.         $this->addSql('ALTER TABLE survey_campaign ADD CONSTRAINT FK_SURVEY_CAMPAIGN_EVENT FOREIGN KEY (event_id) REFERENCES events (id) ON DELETE CASCADE');
  98.         $this->addSql('ALTER TABLE survey_campaign ADD CONSTRAINT FK_SURVEY_CAMPAIGN_TEMPLATE FOREIGN KEY (template_id) REFERENCES survey_template (id)');
  99.         $this->addSql('ALTER TABLE survey_campaign ADD CONSTRAINT FK_SURVEY_CAMPAIGN_CREATED_BY FOREIGN KEY (created_by_id) REFERENCES user (id) ON DELETE SET NULL');
  100.         $this->addSql('ALTER TABLE survey_campaign ADD CONSTRAINT FK_SURVEY_CAMPAIGN_SENT_BY FOREIGN KEY (sent_by_id) REFERENCES user (id) ON DELETE SET NULL');
  101.         $this->addSql('ALTER TABLE survey_campaign_question ADD CONSTRAINT FK_SURVEY_CAMPAIGN_QUESTION_CAMPAIGN FOREIGN KEY (campaign_id) REFERENCES survey_campaign (id) ON DELETE CASCADE');
  102.         $this->addSql('ALTER TABLE survey_invitation ADD CONSTRAINT FK_SURVEY_INVITATION_CAMPAIGN FOREIGN KEY (campaign_id) REFERENCES survey_campaign (id) ON DELETE CASCADE');
  103.         $this->addSql('ALTER TABLE survey_invitation ADD CONSTRAINT FK_SURVEY_INVITATION_USER FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
  104.         $this->addSql('ALTER TABLE survey_invitation_answer ADD CONSTRAINT FK_SURVEY_INVITATION_ANSWER_INVITATION FOREIGN KEY (invitation_id) REFERENCES survey_invitation (id) ON DELETE CASCADE');
  105.         $this->addSql('ALTER TABLE survey_invitation_answer ADD CONSTRAINT FK_SURVEY_INVITATION_ANSWER_QUESTION FOREIGN KEY (question_id) REFERENCES survey_campaign_question (id) ON DELETE CASCADE');
  106.     }
  107.     public function down(Schema $schema): void
  108.     {
  109.         $this->abortIf(
  110.             !$this->connection->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\MySQL57Platform,
  111.             "Migration can only be executed safely on '\Doctrine\DBAL\Platforms\MySQL57Platform'."
  112.         );
  113.         $this->addSql('ALTER TABLE survey_invitation_answer DROP FOREIGN KEY FK_SURVEY_INVITATION_ANSWER_INVITATION');
  114.         $this->addSql('ALTER TABLE survey_invitation_answer DROP FOREIGN KEY FK_SURVEY_INVITATION_ANSWER_QUESTION');
  115.         $this->addSql('ALTER TABLE survey_invitation DROP FOREIGN KEY FK_SURVEY_INVITATION_CAMPAIGN');
  116.         $this->addSql('ALTER TABLE survey_invitation DROP FOREIGN KEY FK_SURVEY_INVITATION_USER');
  117.         $this->addSql('ALTER TABLE survey_campaign_question DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_QUESTION_CAMPAIGN');
  118.         $this->addSql('ALTER TABLE survey_campaign DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_CENTER');
  119.         $this->addSql('ALTER TABLE survey_campaign DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_EVENT');
  120.         $this->addSql('ALTER TABLE survey_campaign DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_TEMPLATE');
  121.         $this->addSql('ALTER TABLE survey_campaign DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_CREATED_BY');
  122.         $this->addSql('ALTER TABLE survey_campaign DROP FOREIGN KEY FK_SURVEY_CAMPAIGN_SENT_BY');
  123.         $this->addSql('ALTER TABLE survey_template_question DROP FOREIGN KEY FK_SURVEY_TEMPLATE_QUESTION_TEMPLATE');
  124.         $this->addSql('ALTER TABLE survey_template DROP FOREIGN KEY FK_SURVEY_TEMPLATE_CENTER');
  125.         $this->addSql('ALTER TABLE survey_template DROP FOREIGN KEY FK_SURVEY_TEMPLATE_MODALITY');
  126.         $this->addSql('DROP TABLE survey_invitation_answer');
  127.         $this->addSql('DROP TABLE survey_invitation');
  128.         $this->addSql('DROP TABLE survey_campaign_question');
  129.         $this->addSql('DROP TABLE survey_campaign');
  130.         $this->addSql('DROP TABLE survey_template_question');
  131.         $this->addSql('DROP TABLE survey_template');
  132.     }
  133. }