app/DoctrineMigrations/Version20261012000001.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.  * 修理・メンテナンス受付機能のテーブル・カラム追加と、基本パックの初期データ登録.
  8.  *
  9.  * 先に doctrine:schema:update --force でテーブルが作成されている環境でも実行できるよう、
  10.  * 既に存在するテーブル・カラムはスキップする.
  11.  */
  12. final class Version20261012000001 extends AbstractMigration
  13. {
  14.     private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
  15.     public function getDescription(): string
  16.     {
  17.         return 'Add repair / maintenance tables, columns and the default basic pack';
  18.     }
  19.     public function up(Schema $schema): void
  20.     {
  21.         // 商品: 修理・メンテナンス対応可否 / 修理に関する詳細・備考
  22.         $product = $schema->getTable('dtb_product');
  23.         if (!$product->hasColumn('repair_available')) {
  24.             $this->addSql('ALTER TABLE dtb_product ADD repair_available TINYINT(1) DEFAULT 0 NOT NULL');
  25.         }
  26.         if (!$product->hasColumn('repair_note')) {
  27.             $this->addSql('ALTER TABLE dtb_product ADD repair_note LONGTEXT DEFAULT NULL');
  28.         }
  29.         // オークション: 修理の回答期限日時
  30.         if (!$schema->getTable('dtb_auction')->hasColumn('repair_deadline_date')) {
  31.             $this->addSql("ALTER TABLE dtb_auction ADD repair_deadline_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)'");
  32.         }
  33.         // 受注: 修理・メンテナンス費用合計(税込)
  34.         if (!$schema->getTable('dtb_order')->hasColumn('repair_total')) {
  35.             $this->addSql('ALTER TABLE dtb_order ADD repair_total INT DEFAULT NULL');
  36.         }
  37.         // 修理メニューマスタ
  38.         if (!$schema->hasTable('dtb_repair_menu')) {
  39.             $this->addSql("CREATE TABLE dtb_repair_menu (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', type SMALLINT UNSIGNED DEFAULT 1 NOT NULL, name VARCHAR(255) NOT NULL, description LONGTEXT DEFAULT NULL, price INT UNSIGNED DEFAULT 0 NOT NULL, sort_no SMALLINT UNSIGNED NOT NULL, discriminator_type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) " . self::TABLE_OPTIONS);
  40.         }
  41.         // 商品ごとの修理メニュー設定
  42.         if (!$schema->hasTable('dtb_product_repair_menu')) {
  43.             $this->addSql("CREATE TABLE dtb_product_repair_menu (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', product_id INT UNSIGNED NOT NULL, repair_menu_id INT UNSIGNED NOT NULL COMMENT 'ID', price INT UNSIGNED DEFAULT 0 NOT NULL, discriminator_type VARCHAR(255) NOT NULL, INDEX IDX_321C537F4584665A (product_id), INDEX IDX_321C537F526CBC81 (repair_menu_id), PRIMARY KEY(id)) " . self::TABLE_OPTIONS);
  44.             $this->addSql('ALTER TABLE dtb_product_repair_menu ADD CONSTRAINT FK_321C537F4584665A FOREIGN KEY (product_id) REFERENCES dtb_product (id) ON DELETE CASCADE');
  45.             $this->addSql('ALTER TABLE dtb_product_repair_menu ADD CONSTRAINT FK_321C537F526CBC81 FOREIGN KEY (repair_menu_id) REFERENCES dtb_repair_menu (id)');
  46.         }
  47.         // 修理依頼
  48.         if (!$schema->hasTable('dtb_product_repair')) {
  49.             $this->addSql("CREATE TABLE dtb_product_repair (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', product_id INT UNSIGNED NOT NULL, customer_id INT UNSIGNED DEFAULT NULL, status SMALLINT UNSIGNED DEFAULT 1 NOT NULL, declined_by SMALLINT UNSIGNED DEFAULT NULL, note LONGTEXT DEFAULT NULL, decline_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)', confirm_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)', create_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)', update_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)', discriminator_type VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_C517BAAE4584665A (product_id), INDEX IDX_C517BAAE9395C3F3 (customer_id), PRIMARY KEY(id)) " . self::TABLE_OPTIONS);
  50.             $this->addSql('ALTER TABLE dtb_product_repair ADD CONSTRAINT FK_C517BAAE4584665A FOREIGN KEY (product_id) REFERENCES dtb_product (id) ON DELETE CASCADE');
  51.             $this->addSql('ALTER TABLE dtb_product_repair ADD CONSTRAINT FK_C517BAAE9395C3F3 FOREIGN KEY (customer_id) REFERENCES dtb_customer (id) ON DELETE SET NULL');
  52.         }
  53.         // 修理依頼明細
  54.         if (!$schema->hasTable('dtb_product_repair_item')) {
  55.             $this->addSql("CREATE TABLE dtb_product_repair_item (id INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT 'ID', product_repair_id INT UNSIGNED NOT NULL COMMENT 'ID', type SMALLINT UNSIGNED DEFAULT 3 NOT NULL, name VARCHAR(255) NOT NULL, description LONGTEXT DEFAULT NULL, price INT DEFAULT 0 NOT NULL, sort_no SMALLINT UNSIGNED DEFAULT 0 NOT NULL, discriminator_type VARCHAR(255) NOT NULL, INDEX IDX_50024CF22D238A72 (product_repair_id), PRIMARY KEY(id)) " . self::TABLE_OPTIONS);
  56.             $this->addSql('ALTER TABLE dtb_product_repair_item ADD CONSTRAINT FK_50024CF22D238A72 FOREIGN KEY (product_repair_id) REFERENCES dtb_product_repair (id) ON DELETE CASCADE');
  57.         }
  58.         // 基本パックの初期データ(修理メニューが1件も無い場合のみ登録)
  59.         $this->addSql("INSERT INTO dtb_repair_menu (type, name, description, price, sort_no, discriminator_type)
  60.             SELECT 1, '基本パック', '弦交換・清掃・ロッド/ナット/オクターブ調整・接点クリーニング等', 5500, 1, 'repairmenu'
  61.             FROM DUAL
  62.             WHERE NOT EXISTS (SELECT 1 FROM dtb_repair_menu)");
  63.     }
  64.     public function down(Schema $schema): void
  65.     {
  66.         if ($schema->hasTable('dtb_product_repair_item')) {
  67.             $this->addSql('DROP TABLE dtb_product_repair_item');
  68.         }
  69.         if ($schema->hasTable('dtb_product_repair')) {
  70.             $this->addSql('DROP TABLE dtb_product_repair');
  71.         }
  72.         if ($schema->hasTable('dtb_product_repair_menu')) {
  73.             $this->addSql('DROP TABLE dtb_product_repair_menu');
  74.         }
  75.         if ($schema->hasTable('dtb_repair_menu')) {
  76.             $this->addSql('DROP TABLE dtb_repair_menu');
  77.         }
  78.         if ($schema->getTable('dtb_order')->hasColumn('repair_total')) {
  79.             $this->addSql('ALTER TABLE dtb_order DROP COLUMN repair_total');
  80.         }
  81.         if ($schema->getTable('dtb_auction')->hasColumn('repair_deadline_date')) {
  82.             $this->addSql('ALTER TABLE dtb_auction DROP COLUMN repair_deadline_date');
  83.         }
  84.         $product = $schema->getTable('dtb_product');
  85.         if ($product->hasColumn('repair_note')) {
  86.             $this->addSql('ALTER TABLE dtb_product DROP COLUMN repair_note');
  87.         }
  88.         if ($product->hasColumn('repair_available')) {
  89.             $this->addSql('ALTER TABLE dtb_product DROP COLUMN repair_available');
  90.         }
  91.     }
  92. }