feat(commercial) : types d'adresse Courtier et Distributeur (ERP-119)
Ajoute deux types d'adresse autonomes (exclusifs, comme la Prospection) : - back : colonnes is_broker / is_distributor sur client_address (migration modulaire, append + 2 CHECK miroir d'exclusivite + COMMENT ON COLUMN), proprietes ClientAddress (getters Groups + SerializedName), Callback validateExclusiveAddressTypes, validateAddressTypeRequired etendue, catalogue des commentaires SQL mis a jour. - front : type AddressType (+broker/distributor), drapeaux, mappers, option du select Type d'adresse, labels i18n, payloads create/edit et lecture. - tests back (acceptation + exclusivite + contrat de serialisation) et front.
This commit is contained in:
@@ -129,6 +129,18 @@ class ClientAddress implements TimestampableInterface, BlamableInterface
|
||||
#[Groups(['client_address:write'])]
|
||||
private bool $isBilling = false;
|
||||
|
||||
// Adresse Courtier / Distributeur : types autonomes (comme Prospection),
|
||||
// exclusifs de tout autre usage (validateExclusiveAddressTypes + CHECK BDD
|
||||
// chk_client_address_broker_exclusive / chk_client_address_distributor_exclusive).
|
||||
// Lecture portee par le getter + SerializedName (meme pattern que isProspect).
|
||||
#[ORM\Column(name: 'is_broker', options: ['default' => false])]
|
||||
#[Groups(['client_address:write'])]
|
||||
private bool $isBroker = false;
|
||||
|
||||
#[ORM\Column(name: 'is_distributor', options: ['default' => false])]
|
||||
#[Groups(['client_address:write'])]
|
||||
private bool $isDistributor = false;
|
||||
|
||||
#[ORM\Column(length: 80, options: ['default' => 'France'])]
|
||||
#[Assert\Length(max: 80, maxMessage: 'Le pays ne peut dépasser {{ limit }} caractères.', normalizer: 'trim')]
|
||||
#[Groups(['client_address:read', 'client_address:write'])]
|
||||
@@ -232,7 +244,7 @@ class ClientAddress implements TimestampableInterface, BlamableInterface
|
||||
#[Assert\Callback]
|
||||
public function validateAddressTypeRequired(ExecutionContextInterface $context): void
|
||||
{
|
||||
if (!$this->isProspect && !$this->isDelivery && !$this->isBilling) {
|
||||
if (!$this->isProspect && !$this->isDelivery && !$this->isBilling && !$this->isBroker && !$this->isDistributor) {
|
||||
$context->buildViolation('Le type d\'adresse est obligatoire.')
|
||||
->atPath('isProspect')
|
||||
->addViolation()
|
||||
@@ -240,6 +252,31 @@ class ClientAddress implements TimestampableInterface, BlamableInterface
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Courtier et Distributeur sont des types d'adresse AUTONOMES (comme la
|
||||
* Prospection) : exclusifs de tout autre usage (Livraison / Facturation /
|
||||
* Prospection / l'autre type autonome). Mirror applicatif (422) des CHECK
|
||||
* chk_client_address_broker_exclusive / chk_client_address_distributor_exclusive.
|
||||
* Violation portee sur `isProspect` (mappee sous le select « Type d'adresse »).
|
||||
*/
|
||||
#[Assert\Callback]
|
||||
public function validateExclusiveAddressTypes(ExecutionContextInterface $context): void
|
||||
{
|
||||
if ($this->isBroker && ($this->isProspect || $this->isDelivery || $this->isBilling || $this->isDistributor)) {
|
||||
$context->buildViolation('Une adresse Courtier ne peut pas avoir d\'autre type.')
|
||||
->atPath('isProspect')
|
||||
->addViolation()
|
||||
;
|
||||
}
|
||||
|
||||
if ($this->isDistributor && ($this->isProspect || $this->isDelivery || $this->isBilling || $this->isBroker)) {
|
||||
$context->buildViolation('Une adresse Distributeur ne peut pas avoir d\'autre type.')
|
||||
->atPath('isProspect')
|
||||
->addViolation()
|
||||
;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* RG-1.11 : l'email de facturation est obligatoire si l'adresse est de
|
||||
* facturation, et interdit sinon. Mirror applicatif (422) du CHECK
|
||||
@@ -360,6 +397,34 @@ class ClientAddress implements TimestampableInterface, BlamableInterface
|
||||
return $this;
|
||||
}
|
||||
|
||||
#[Groups(['client_address:read'])]
|
||||
#[SerializedName('isBroker')]
|
||||
public function isBroker(): bool
|
||||
{
|
||||
return $this->isBroker;
|
||||
}
|
||||
|
||||
public function setIsBroker(bool $isBroker): static
|
||||
{
|
||||
$this->isBroker = $isBroker;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
#[Groups(['client_address:read'])]
|
||||
#[SerializedName('isDistributor')]
|
||||
public function isDistributor(): bool
|
||||
{
|
||||
return $this->isDistributor;
|
||||
}
|
||||
|
||||
public function setIsDistributor(bool $isDistributor): static
|
||||
{
|
||||
$this->isDistributor = $isDistributor;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCountry(): string
|
||||
{
|
||||
return $this->country;
|
||||
|
||||
@@ -225,6 +225,8 @@ final class ColumnCommentsCatalog
|
||||
'is_prospect' => 'Adresse de prospection — exclusive de is_delivery/is_billing (RG-1.06/07/08, chk_client_address_prospect_exclusive). Faux par defaut.',
|
||||
'is_delivery' => 'Adresse de livraison. Exclusive de is_prospect. Faux par defaut.',
|
||||
'is_billing' => 'Adresse de facturation. Exclusive de is_prospect. Impose billing_email (RG-1.11). Faux par defaut.',
|
||||
'is_broker' => 'Adresse Courtier — type autonome exclusif de tout autre usage (chk_client_address_broker_exclusive). Faux par defaut.',
|
||||
'is_distributor' => 'Adresse Distributeur — type autonome exclusif de tout autre usage (chk_client_address_distributor_exclusive). Faux par defaut.',
|
||||
'country' => 'Pays de l adresse — defaut France.',
|
||||
'postal_code' => 'Code postal (4-5 chiffres attendus, RG-1.09).',
|
||||
'city' => 'Ville — preremplie depuis le code postal via API BAN cote front (RG-1.09).',
|
||||
|
||||
Reference in New Issue
Block a user