From da7f46f7e9fcca40ea0bd7eaede306ef3d9f3dab Mon Sep 17 00:00:00 2001 From: Serreau Jovann Date: Thu, 2 Apr 2026 22:28:30 +0200 Subject: [PATCH] refactor: renommer Order en Facture + meme OrderNumber partage entre Devis/Advert/Facture Changement de modele: - Le meme OrderNumber est partage entre Devis, Advert et Facture (ex: 04/2026-00001 pour les 3) - Les relations OrderNumber passent de OneToOne a ManyToOne pour permettre le partage du meme numero src/Entity/Order.php supprime, remplace par: src/Entity/Facture.php (nouveau): - orderNumber: ManyToOne vers OrderNumber (meme numero que l'Advert parent) - advert: ManyToOne vers Advert (nullable) - splitIndex: smallint, suffixe pour factures multiples sur un meme advert (0 = pas de suffixe, 1 = -1, 2 = -2, etc.) - getInvoiceNumber(): retourne le numero complet avec suffixe si splitIndex > 0 (ex: 04/2026-00001 ou 04/2026-00001-2) src/Entity/Devis.php: - orderNumber: OneToOne remplace par ManyToOne vers OrderNumber - adverts: OneToMany vers Advert (inchange) src/Entity/Advert.php: - orderNumber: OneToOne remplace par ManyToOne vers OrderNumber - orders: renomme en factures, OneToMany vers Facture src/Repository/OrderRepository.php supprime, remplace par: src/Repository/FactureRepository.php (nouveau) migrations/Version20260402202809.php: - Suppression table `order`, creation table facture - Modification des contraintes unique sur devis et advert (unique index supprime car ManyToOne) Co-Authored-By: Claude Opus 4.6 (1M context) --- migrations/Version20260402202809.php | 53 +++++++++++++++++++ src/Entity/Advert.php | 16 +++--- src/Entity/Devis.php | 2 +- src/Entity/{Order.php => Facture.php} | 11 ++-- ...erRepository.php => FactureRepository.php} | 8 +-- 5 files changed, 71 insertions(+), 19 deletions(-) create mode 100644 migrations/Version20260402202809.php rename src/Entity/{Order.php => Facture.php} (86%) rename src/Repository/{OrderRepository.php => FactureRepository.php} (56%) diff --git a/migrations/Version20260402202809.php b/migrations/Version20260402202809.php new file mode 100644 index 0000000..2082fd7 --- /dev/null +++ b/migrations/Version20260402202809.php @@ -0,0 +1,53 @@ +addSql('CREATE TABLE facture (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, split_index SMALLINT DEFAULT 0 NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, order_number_id INT NOT NULL, advert_id INT DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_FE8664108C26A5E8 ON facture (order_number_id)'); + $this->addSql('CREATE INDEX IDX_FE866410D07ECCB6 ON facture (advert_id)'); + $this->addSql('ALTER TABLE facture ADD CONSTRAINT FK_FE8664108C26A5E8 FOREIGN KEY (order_number_id) REFERENCES order_number (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE facture ADD CONSTRAINT FK_FE866410D07ECCB6 FOREIGN KEY (advert_id) REFERENCES advert (id) NOT DEFERRABLE'); + $this->addSql('ALTER TABLE "order" DROP CONSTRAINT fk_f5299398d07eccb6'); + $this->addSql('ALTER TABLE "order" DROP CONSTRAINT fk_f52993988c26a5e8'); + $this->addSql('DROP TABLE "order"'); + $this->addSql('DROP INDEX uniq_54f1f40b8c26a5e8'); + $this->addSql('CREATE INDEX IDX_54F1F40B8C26A5E8 ON advert (order_number_id)'); + $this->addSql('DROP INDEX uniq_8b27c52b8c26a5e8'); + $this->addSql('CREATE INDEX IDX_8B27C52B8C26A5E8 ON devis (order_number_id)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE TABLE "order" (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, split_index SMALLINT DEFAULT 0 NOT NULL, created_at TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, order_number_id INT NOT NULL, advert_id INT DEFAULT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX idx_f5299398d07eccb6 ON "order" (advert_id)'); + $this->addSql('CREATE UNIQUE INDEX uniq_f52993988c26a5e8 ON "order" (order_number_id)'); + $this->addSql('ALTER TABLE "order" ADD CONSTRAINT fk_f5299398d07eccb6 FOREIGN KEY (advert_id) REFERENCES advert (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE "order" ADD CONSTRAINT fk_f52993988c26a5e8 FOREIGN KEY (order_number_id) REFERENCES order_number (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE facture DROP CONSTRAINT FK_FE8664108C26A5E8'); + $this->addSql('ALTER TABLE facture DROP CONSTRAINT FK_FE866410D07ECCB6'); + $this->addSql('DROP TABLE facture'); + $this->addSql('DROP INDEX IDX_54F1F40B8C26A5E8'); + $this->addSql('CREATE UNIQUE INDEX uniq_54f1f40b8c26a5e8 ON advert (order_number_id)'); + $this->addSql('DROP INDEX IDX_8B27C52B8C26A5E8'); + $this->addSql('CREATE UNIQUE INDEX uniq_8b27c52b8c26a5e8 ON devis (order_number_id)'); + } +} diff --git a/src/Entity/Advert.php b/src/Entity/Advert.php index 201a107..92db721 100644 --- a/src/Entity/Advert.php +++ b/src/Entity/Advert.php @@ -15,7 +15,7 @@ class Advert #[ORM\Column] private ?int $id = null; - #[ORM\OneToOne(targetEntity: OrderNumber::class)] + #[ORM\ManyToOne(targetEntity: OrderNumber::class)] #[ORM\JoinColumn(nullable: false)] private OrderNumber $orderNumber; @@ -26,15 +26,15 @@ class Advert #[ORM\Column] private \DateTimeImmutable $createdAt; - /** @var Collection */ - #[ORM\OneToMany(targetEntity: Order::class, mappedBy: 'advert')] - private Collection $orders; + /** @var Collection */ + #[ORM\OneToMany(targetEntity: Facture::class, mappedBy: 'advert')] + private Collection $factures; public function __construct(OrderNumber $orderNumber) { $this->orderNumber = $orderNumber; $this->createdAt = new \DateTimeImmutable(); - $this->orders = new ArrayCollection(); + $this->factures = new ArrayCollection(); } public function getId(): ?int @@ -62,9 +62,9 @@ class Advert return $this->createdAt; } - /** @return Collection */ - public function getOrders(): Collection + /** @return Collection */ + public function getFactures(): Collection { - return $this->orders; + return $this->factures; } } diff --git a/src/Entity/Devis.php b/src/Entity/Devis.php index e53b003..bc94960 100644 --- a/src/Entity/Devis.php +++ b/src/Entity/Devis.php @@ -15,7 +15,7 @@ class Devis #[ORM\Column] private ?int $id = null; - #[ORM\OneToOne(targetEntity: OrderNumber::class)] + #[ORM\ManyToOne(targetEntity: OrderNumber::class)] #[ORM\JoinColumn(nullable: false)] private OrderNumber $orderNumber; diff --git a/src/Entity/Order.php b/src/Entity/Facture.php similarity index 86% rename from src/Entity/Order.php rename to src/Entity/Facture.php index 96d0ef5..0ed4a56 100644 --- a/src/Entity/Order.php +++ b/src/Entity/Facture.php @@ -2,23 +2,22 @@ namespace App\Entity; -use App\Repository\OrderRepository; +use App\Repository\FactureRepository; use Doctrine\ORM\Mapping as ORM; -#[ORM\Entity(repositoryClass: OrderRepository::class)] -#[ORM\Table(name: '`order`')] -class Order +#[ORM\Entity(repositoryClass: FactureRepository::class)] +class Facture { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] private ?int $id = null; - #[ORM\OneToOne(targetEntity: OrderNumber::class)] + #[ORM\ManyToOne(targetEntity: OrderNumber::class)] #[ORM\JoinColumn(nullable: false)] private OrderNumber $orderNumber; - #[ORM\ManyToOne(targetEntity: Advert::class, inversedBy: 'orders')] + #[ORM\ManyToOne(targetEntity: Advert::class, inversedBy: 'factures')] #[ORM\JoinColumn(nullable: true)] private ?Advert $advert = null; diff --git a/src/Repository/OrderRepository.php b/src/Repository/FactureRepository.php similarity index 56% rename from src/Repository/OrderRepository.php rename to src/Repository/FactureRepository.php index 22af896..abcd24f 100644 --- a/src/Repository/OrderRepository.php +++ b/src/Repository/FactureRepository.php @@ -2,17 +2,17 @@ namespace App\Repository; -use App\Entity\Order; +use App\Entity\Facture; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; /** - * @extends ServiceEntityRepository + * @extends ServiceEntityRepository */ -class OrderRepository extends ServiceEntityRepository +class FactureRepository extends ServiceEntityRepository { public function __construct(ManagerRegistry $registry) { - parent::__construct($registry, Order::class); + parent::__construct($registry, Facture::class); } }