<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Lot 2 : panier persistant, devis et commandes.
*
* Voir LOT2.md pour les choix de conception. Les tables Orders/OrdersDetails du
* tutoriel d'origine ne sont pas touchées : elles restent inutilisées.
*/
final class Version20260729210000 extends AbstractMigration
{
public function getDescription(): string
{
return 'Lot 2 : cart, cart_item, quote, quote_item, sales_order';
}
public function up(Schema $schema): void
{
$this->addSql('
CREATE TABLE cart (
id INT AUTO_INCREMENT NOT NULL,
user_id INT NOT NULL,
entreprise_id INT DEFAULT NULL,
delivery_agence_id INT DEFAULT NULL,
status VARCHAR(20) NOT NULL,
label VARCHAR(255) DEFAULT NULL,
created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
INDEX IDX_CART_USER (user_id),
INDEX IDX_CART_ENTREPRISE (entreprise_id),
INDEX IDX_CART_AGENCE (delivery_agence_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE cart_item (
id INT AUTO_INCREMENT NOT NULL,
cart_id INT NOT NULL,
tarif_id INT DEFAULT NULL,
reference VARCHAR(100) NOT NULL,
designation VARCHAR(255) NOT NULL,
product_slug VARCHAR(255) DEFAULT NULL,
quantity INT NOT NULL,
unit_price DOUBLE PRECISION NOT NULL,
discount_rate DOUBLE PRECISION NOT NULL,
discount_source VARCHAR(20) DEFAULT NULL,
added_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
INDEX IDX_CART_ITEM_CART (cart_id),
INDEX IDX_CART_ITEM_TARIF (tarif_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE quote (
id INT AUTO_INCREMENT NOT NULL,
user_id INT NOT NULL,
entreprise_id INT DEFAULT NULL,
delivery_agence_id INT DEFAULT NULL,
parent_quote_id INT DEFAULT NULL,
reference VARCHAR(30) NOT NULL,
status VARCHAR(30) NOT NULL,
total_ht DOUBLE PRECISION NOT NULL,
vat_rate DOUBLE PRECISION NOT NULL,
minimum_order_fee DOUBLE PRECISION NOT NULL,
created_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
sent_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
validated_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
expires_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
sage_reference VARCHAR(50) DEFAULT NULL,
sage_exported_at DATETIME DEFAULT NULL COMMENT \'(DC2Type:datetime_immutable)\',
sage_status VARCHAR(30) DEFAULT NULL,
UNIQUE INDEX UNIQ_QUOTE_REFERENCE (reference),
INDEX idx_quote_status (status),
INDEX idx_quote_created (created_at),
INDEX IDX_QUOTE_USER (user_id),
INDEX IDX_QUOTE_ENTREPRISE (entreprise_id),
INDEX IDX_QUOTE_AGENCE (delivery_agence_id),
INDEX IDX_QUOTE_PARENT (parent_quote_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE quote_item (
id INT AUTO_INCREMENT NOT NULL,
quote_id INT NOT NULL,
reference VARCHAR(100) NOT NULL,
designation VARCHAR(255) NOT NULL,
product_slug VARCHAR(255) DEFAULT NULL,
quantity INT NOT NULL,
unit_price DOUBLE PRECISION NOT NULL,
discount_rate DOUBLE PRECISION NOT NULL,
discount_source VARCHAR(20) DEFAULT NULL,
INDEX IDX_QUOTE_ITEM_QUOTE (quote_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE sales_order (
id INT AUTO_INCREMENT NOT NULL,
quote_id INT DEFAULT NULL,
entreprise_id INT DEFAULT NULL,
sage_reference VARCHAR(50) NOT NULL,
status VARCHAR(30) NOT NULL,
total_ttc DOUBLE PRECISION NOT NULL,
ordered_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
sage_updated_at DATETIME NOT NULL COMMENT \'(DC2Type:datetime_immutable)\',
UNIQUE INDEX UNIQ_SALES_ORDER_SAGE (sage_reference),
INDEX idx_sales_order_sage (sage_reference),
INDEX IDX_SALES_ORDER_QUOTE (quote_id),
INDEX IDX_SALES_ORDER_ENTREPRISE (entreprise_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB
');
$this->addSql('ALTER TABLE cart ADD CONSTRAINT FK_CART_USER FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE cart ADD CONSTRAINT FK_CART_ENTREPRISE FOREIGN KEY (entreprise_id) REFERENCES entreprise (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE cart ADD CONSTRAINT FK_CART_AGENCE FOREIGN KEY (delivery_agence_id) REFERENCES agence (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE cart_item ADD CONSTRAINT FK_CART_ITEM_CART FOREIGN KEY (cart_id) REFERENCES cart (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE cart_item ADD CONSTRAINT FK_CART_ITEM_TARIF FOREIGN KEY (tarif_id) REFERENCES tarifs (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE quote ADD CONSTRAINT FK_QUOTE_USER FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE quote ADD CONSTRAINT FK_QUOTE_ENTREPRISE FOREIGN KEY (entreprise_id) REFERENCES entreprise (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE quote ADD CONSTRAINT FK_QUOTE_AGENCE FOREIGN KEY (delivery_agence_id) REFERENCES agence (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE quote ADD CONSTRAINT FK_QUOTE_PARENT FOREIGN KEY (parent_quote_id) REFERENCES quote (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE quote_item ADD CONSTRAINT FK_QUOTE_ITEM_QUOTE FOREIGN KEY (quote_id) REFERENCES quote (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE sales_order ADD CONSTRAINT FK_SALES_ORDER_QUOTE FOREIGN KEY (quote_id) REFERENCES quote (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE sales_order ADD CONSTRAINT FK_SALES_ORDER_ENTREPRISE FOREIGN KEY (entreprise_id) REFERENCES entreprise (id) ON DELETE SET NULL');
}
public function down(Schema $schema): void
{
$this->addSql('ALTER TABLE sales_order DROP FOREIGN KEY FK_SALES_ORDER_ENTREPRISE');
$this->addSql('ALTER TABLE sales_order DROP FOREIGN KEY FK_SALES_ORDER_QUOTE');
$this->addSql('ALTER TABLE quote_item DROP FOREIGN KEY FK_QUOTE_ITEM_QUOTE');
$this->addSql('ALTER TABLE quote DROP FOREIGN KEY FK_QUOTE_PARENT');
$this->addSql('ALTER TABLE quote DROP FOREIGN KEY FK_QUOTE_AGENCE');
$this->addSql('ALTER TABLE quote DROP FOREIGN KEY FK_QUOTE_ENTREPRISE');
$this->addSql('ALTER TABLE quote DROP FOREIGN KEY FK_QUOTE_USER');
$this->addSql('ALTER TABLE cart_item DROP FOREIGN KEY FK_CART_ITEM_TARIF');
$this->addSql('ALTER TABLE cart_item DROP FOREIGN KEY FK_CART_ITEM_CART');
$this->addSql('ALTER TABLE cart DROP FOREIGN KEY FK_CART_AGENCE');
$this->addSql('ALTER TABLE cart DROP FOREIGN KEY FK_CART_ENTREPRISE');
$this->addSql('ALTER TABLE cart DROP FOREIGN KEY FK_CART_USER');
$this->addSql('DROP TABLE sales_order');
$this->addSql('DROP TABLE quote_item');
$this->addSql('DROP TABLE quote');
$this->addSql('DROP TABLE cart_item');
$this->addSql('DROP TABLE cart');
}
}