<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* 修理・メンテナンス受付機能のテーブル・カラム追加と、基本パックの初期データ登録.
*
* 先に doctrine:schema:update --force でテーブルが作成されている環境でも実行できるよう、
* 既に存在するテーブル・カラムはスキップする.
*/
final class Version20261012000001 extends AbstractMigration
{
private const TABLE_OPTIONS = 'DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_bin` ENGINE = InnoDB';
public function getDescription(): string
{
return 'Add repair / maintenance tables, columns and the default basic pack';
}
public function up(Schema $schema): void
{
// 商品: 修理・メンテナンス対応可否 / 修理に関する詳細・備考
$product = $schema->getTable('dtb_product');
if (!$product->hasColumn('repair_available')) {
$this->addSql('ALTER TABLE dtb_product ADD repair_available TINYINT(1) DEFAULT 0 NOT NULL');
}
if (!$product->hasColumn('repair_note')) {
$this->addSql('ALTER TABLE dtb_product ADD repair_note LONGTEXT DEFAULT NULL');
}
// オークション: 修理の回答期限日時
if (!$schema->getTable('dtb_auction')->hasColumn('repair_deadline_date')) {
$this->addSql("ALTER TABLE dtb_auction ADD repair_deadline_date DATETIME DEFAULT NULL COMMENT '(DC2Type:datetimetz)'");
}
// 受注: 修理・メンテナンス費用合計(税込)
if (!$schema->getTable('dtb_order')->hasColumn('repair_total')) {
$this->addSql('ALTER TABLE dtb_order ADD repair_total INT DEFAULT NULL');
}
// 修理メニューマスタ
if (!$schema->hasTable('dtb_repair_menu')) {
$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);
}
// 商品ごとの修理メニュー設定
if (!$schema->hasTable('dtb_product_repair_menu')) {
$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);
$this->addSql('ALTER TABLE dtb_product_repair_menu ADD CONSTRAINT FK_321C537F4584665A FOREIGN KEY (product_id) REFERENCES dtb_product (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE dtb_product_repair_menu ADD CONSTRAINT FK_321C537F526CBC81 FOREIGN KEY (repair_menu_id) REFERENCES dtb_repair_menu (id)');
}
// 修理依頼
if (!$schema->hasTable('dtb_product_repair')) {
$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);
$this->addSql('ALTER TABLE dtb_product_repair ADD CONSTRAINT FK_C517BAAE4584665A FOREIGN KEY (product_id) REFERENCES dtb_product (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE dtb_product_repair ADD CONSTRAINT FK_C517BAAE9395C3F3 FOREIGN KEY (customer_id) REFERENCES dtb_customer (id) ON DELETE SET NULL');
}
// 修理依頼明細
if (!$schema->hasTable('dtb_product_repair_item')) {
$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);
$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');
}
// 基本パックの初期データ(修理メニューが1件も無い場合のみ登録)
$this->addSql("INSERT INTO dtb_repair_menu (type, name, description, price, sort_no, discriminator_type)
SELECT 1, '基本パック', '弦交換・清掃・ロッド/ナット/オクターブ調整・接点クリーニング等', 5500, 1, 'repairmenu'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM dtb_repair_menu)");
}
public function down(Schema $schema): void
{
if ($schema->hasTable('dtb_product_repair_item')) {
$this->addSql('DROP TABLE dtb_product_repair_item');
}
if ($schema->hasTable('dtb_product_repair')) {
$this->addSql('DROP TABLE dtb_product_repair');
}
if ($schema->hasTable('dtb_product_repair_menu')) {
$this->addSql('DROP TABLE dtb_product_repair_menu');
}
if ($schema->hasTable('dtb_repair_menu')) {
$this->addSql('DROP TABLE dtb_repair_menu');
}
if ($schema->getTable('dtb_order')->hasColumn('repair_total')) {
$this->addSql('ALTER TABLE dtb_order DROP COLUMN repair_total');
}
if ($schema->getTable('dtb_auction')->hasColumn('repair_deadline_date')) {
$this->addSql('ALTER TABLE dtb_auction DROP COLUMN repair_deadline_date');
}
$product = $schema->getTable('dtb_product');
if ($product->hasColumn('repair_note')) {
$this->addSql('ALTER TABLE dtb_product DROP COLUMN repair_note');
}
if ($product->hasColumn('repair_available')) {
$this->addSql('ALTER TABLE dtb_product DROP COLUMN repair_available');
}
}
}