<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* 在庫・発注管理機能の追加
*/
final class Version20251215000000 extends AbstractMigration
{
public function getDescription(): string
{
return '在庫・発注管理機能: 発注登録テーブル、商品規格拡張を追加';
}
public function up(Schema $schema): void
{
$sm = $this->connection->createSchemaManager();
// 1. 商品規格テーブルにカラム追加
if ($sm->tablesExist(['dtb_product_class'])) {
$columns = $sm->listTableColumns('dtb_product_class');
if (!isset($columns['safety_stock'])) {
$this->addSql('ALTER TABLE dtb_product_class ADD safety_stock DECIMAL(10, 0) UNSIGNED DEFAULT NULL COMMENT \'安全在庫数\' AFTER sale_limit');
}
if (!isset($columns['last_stock_in_date'])) {
$this->addSql('ALTER TABLE dtb_product_class ADD last_stock_in_date DATE DEFAULT NULL COMMENT \'最終入庫日\' AFTER safety_stock');
}
}
// 2. 発注登録ヘッダーテーブル
if (!$sm->tablesExist(['dtb_order_register'])) {
$this->addSql('
CREATE TABLE dtb_order_register (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
title VARCHAR(255) NOT NULL COMMENT \'発注登録名\',
note LONGTEXT DEFAULT NULL COMMENT \'備考\',
del_flg SMALLINT DEFAULT 0 NOT NULL COMMENT \'削除フラグ\',
delivery_status SMALLINT DEFAULT 0 NOT NULL COMMENT \'納品状況\',
create_date DATETIME NOT NULL,
update_date DATETIME NOT NULL,
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ENGINE = InnoDB
');
}
// 3. 発注登録アパレル別グループテーブル
if (!$sm->tablesExist(['dtb_order_register_apparel'])) {
$this->addSql('
CREATE TABLE dtb_order_register_apparel (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
order_register_id INT UNSIGNED NOT NULL COMMENT \'発注登録ID\',
apparel_id INT UNSIGNED DEFAULT NULL COMMENT \'アパレルID\',
output_flag TINYINT(1) DEFAULT 1 NOT NULL COMMENT \'出力フラグ\',
delivery_date DATE DEFAULT NULL COMMENT \'納入予定日\',
order_destination TEXT DEFAULT NULL COMMENT \'請求先\',
order_source TEXT DEFAULT NULL COMMENT \'発注元\',
delivery_destination TEXT DEFAULT NULL COMMENT \'納品先\',
notes TEXT DEFAULT NULL COMMENT \'備考\',
del_flg SMALLINT DEFAULT 0 NOT NULL COMMENT \'削除フラグ\',
create_date DATETIME NOT NULL COMMENT \'(DC2Type:datetimetz)\',
update_date DATETIME NOT NULL COMMENT \'(DC2Type:datetimetz)\',
PRIMARY KEY(id),
INDEX IDX_ORDER_REGISTER_APPAREL_ORDER_REGISTER_ID (order_register_id),
INDEX IDX_ORDER_REGISTER_APPAREL_APPAREL_ID (apparel_id),
CONSTRAINT FK_ORDER_REGISTER_APPAREL_ORDER_REGISTER
FOREIGN KEY (order_register_id)
REFERENCES dtb_order_register (id) ON DELETE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin ENGINE = InnoDB
');
}
// 4. 発注登録明細テーブル
if (!$sm->tablesExist(['dtb_order_register_item'])) {
$this->addSql('
CREATE TABLE dtb_order_register_item (
id INT UNSIGNED AUTO_INCREMENT NOT NULL,
order_register_id INT UNSIGNED NOT NULL COMMENT \'発注登録ID\',
order_register_apparel_id INT UNSIGNED DEFAULT NULL COMMENT \'発注登録アパレルID\',
product_id INT UNSIGNED NOT NULL COMMENT \'商品ID\',
product_class_id INT UNSIGNED NOT NULL COMMENT \'商品規格ID\',
product_code VARCHAR(255) DEFAULT NULL COMMENT \'商品コード\',
product_name VARCHAR(255) NOT NULL COMMENT \'商品名\',
class_name VARCHAR(255) DEFAULT NULL COMMENT \'規格名\',
quantity INT NOT NULL COMMENT \'発注数量\',
delivery_date DATE DEFAULT NULL COMMENT \'納入予定日\',
delivery_status SMALLINT DEFAULT 0 NOT NULL COMMENT \'納品状況: 0=未納品, 1=入庫登録済み, 2=納品済み\',
sort_no INT NOT NULL COMMENT \'並び順\',
create_date DATETIME NOT NULL,
update_date DATETIME NOT NULL,
PRIMARY KEY(id),
INDEX IDX_ORDER_REGISTER_ITEM_ORDER_REGISTER_ID (order_register_id),
INDEX IDX_ORDER_REGISTER_ITEM_APPAREL_ID (order_register_apparel_id),
INDEX IDX_ORDER_REGISTER_ITEM_PRODUCT_ID (product_id),
INDEX IDX_ORDER_REGISTER_ITEM_PRODUCT_CLASS_ID (product_class_id),
CONSTRAINT FK_ORDER_REGISTER_ITEM_ORDER_REGISTER_ID
FOREIGN KEY (order_register_id)
REFERENCES dtb_order_register (id) ON DELETE CASCADE,
CONSTRAINT FK_ORDER_REGISTER_ITEM_APPAREL
FOREIGN KEY (order_register_apparel_id)
REFERENCES dtb_order_register_apparel (id) ON DELETE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci ENGINE = InnoDB
');
}
}
public function down(Schema $schema): void
{
$sm = $this->connection->createSchemaManager();
// テーブル削除(外部キー制約の順序を考慮)
if ($sm->tablesExist(['dtb_order_register_item'])) {
$this->addSql('DROP TABLE dtb_order_register_item');
}
if ($sm->tablesExist(['dtb_order_register_apparel'])) {
$this->addSql('DROP TABLE dtb_order_register_apparel');
}
if ($sm->tablesExist(['dtb_order_register'])) {
$this->addSql('DROP TABLE dtb_order_register');
}
// 商品規格テーブルのカラム削除
if ($sm->tablesExist(['dtb_product_class'])) {
$columns = $sm->listTableColumns('dtb_product_class');
if (isset($columns['last_stock_in_date'])) {
$this->addSql('ALTER TABLE dtb_product_class DROP COLUMN last_stock_in_date');
}
if (isset($columns['safety_stock'])) {
$this->addSql('ALTER TABLE dtb_product_class DROP COLUMN safety_stock');
}
}
}
}