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:
45
src/Service/AdvertService.php
Normal file
45
src/Service/AdvertService.php
Normal 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);
|
||||
}
|
||||
}
|
||||
29
src/Service/DevisService.php
Normal file
29
src/Service/DevisService.php
Normal 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;
|
||||
}
|
||||
}
|
||||
60
src/Service/FactureService.php
Normal file
60
src/Service/FactureService.php
Normal 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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user