feat: ajout des services DevisService, AdvertService et FactureService

src/Service/DevisService.php (nouveau):
- create(): genere un OrderNumber via OrderNumberService::generateAndUse(),
  cree le Devis, persiste et flush. Retourne le Devis.

src/Service/AdvertService.php (nouveau):
- create(?Devis): si un devis est passe, reutilise son OrderNumber
  (meme numero pour devis et advert) et lie l'advert au devis.
  Si pas de devis, genere un nouveau OrderNumber.
- createFromDevis(Devis): raccourci qui appelle create() avec le devis.

src/Service/FactureService.php (nouveau):
- create(?Advert): si un advert est passe, appelle createFromAdvert().
  Si pas d'advert, genere un nouveau OrderNumber (facture seule).
- createFromAdvert(Advert): reutilise le OrderNumber de l'advert
  (meme numero). Gere le splitIndex automatiquement:
  - 1ere facture sur un advert: splitIndex=0 (pas de suffixe)
  - 2eme facture: la 1ere passe a splitIndex=1, la nouvelle a splitIndex=2
    (ex: 04/2026-00001-1 et 04/2026-00001-2)
  - 3eme facture: splitIndex=3 (04/2026-00001-3)

Exemples d'utilisation:
- Facture seule: $factureService->create()
- Devis seul: $devisService->create()
- Advert seul: $advertService->create()
- Devis → Advert: $advertService->createFromDevis($devis)
- Advert → Facture: $factureService->createFromAdvert($advert)
- Advert → 3 Factures: 3x createFromAdvert() → -1, -2, -3

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-04-02 22:29:54 +02:00
parent da7f46f7e9
commit 5b0e4707f7
3 changed files with 134 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
<?php
namespace App\Service;
use App\Entity\Advert;
use App\Entity\Devis;
use Doctrine\ORM\EntityManagerInterface;
class AdvertService
{
public function __construct(
private OrderNumberService $orderNumberService,
private EntityManagerInterface $em,
) {
}
/**
* Cree un advert avec un nouveau numero de commande.
*/
public function create(?Devis $devis = null): Advert
{
$orderNumber = null !== $devis
? $devis->getOrderNumber()
: $this->orderNumberService->generateAndUse();
$advert = new Advert($orderNumber);
if (null !== $devis) {
$advert->setDevis($devis);
}
$this->em->persist($advert);
$this->em->flush();
return $advert;
}
/**
* Cree un advert a partir d'un devis existant (meme numero).
*/
public function createFromDevis(Devis $devis): Advert
{
return $this->create($devis);
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace App\Service;
use App\Entity\Devis;
use Doctrine\ORM\EntityManagerInterface;
class DevisService
{
public function __construct(
private OrderNumberService $orderNumberService,
private EntityManagerInterface $em,
) {
}
/**
* Cree un devis avec un nouveau numero de commande.
*/
public function create(): Devis
{
$orderNumber = $this->orderNumberService->generateAndUse();
$devis = new Devis($orderNumber);
$this->em->persist($devis);
$this->em->flush();
return $devis;
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Service;
use App\Entity\Advert;
use App\Entity\Facture;
use Doctrine\ORM\EntityManagerInterface;
class FactureService
{
public function __construct(
private OrderNumberService $orderNumberService,
private EntityManagerInterface $em,
) {
}
/**
* Cree une facture avec un nouveau numero de commande (facture seule).
*/
public function create(?Advert $advert = null): Facture
{
if (null !== $advert) {
return $this->createFromAdvert($advert);
}
$orderNumber = $this->orderNumberService->generateAndUse();
$facture = new Facture($orderNumber);
$this->em->persist($facture);
$this->em->flush();
return $facture;
}
/**
* Cree une facture a partir d'un advert (meme numero + splitIndex si plusieurs).
*/
public function createFromAdvert(Advert $advert): Facture
{
$existingCount = $advert->getFactures()->count();
$facture = new Facture($advert->getOrderNumber());
$facture->setAdvert($advert);
if ($existingCount > 0) {
$facture->setSplitIndex($existingCount + 1);
// La premiere facture existante doit aussi avoir un splitIndex si elle n'en a pas
$firstFacture = $advert->getFactures()->first();
if (false !== $firstFacture && 0 === $firstFacture->getSplitIndex()) {
$firstFacture->setSplitIndex(1);
}
}
$this->em->persist($facture);
$this->em->flush();
return $facture;
}
}