From e03233d9225cea294b47e92ba05a4d717903f960 Mon Sep 17 00:00:00 2001 From: Serreau Jovann Date: Sat, 4 Apr 2026 21:39:26 +0200 Subject: [PATCH] feat: relation revendeur sur Customer/Website + WebsiteConfiguration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Customer : - Ajout revendeurCode (VARCHAR 10, nullable) : stocke le code du revendeur apporteur d'affaire (pas de FK, suppression revendeur sans impact) - Select revendeur dans le formulaire de création client - Champ revendeur dans la fiche client (info + section système) Website : - Ajout revendeurCode (VARCHAR 10, nullable) : même logique que Customer WebsiteConfiguration (nouvelle entité) : - website (ManyToOne CASCADE) : site parent - type (VARCHAR 25) : clé de configuration - value (TEXT) : valeur - Contrainte unique (website_id, type) Formulaire création client : - Select "Revendeur (apporteur d'affaire)" avec liste des revendeurs actifs Fiche client : - Onglet Info : champ code revendeur éditable - Section système : affiche le code revendeur Migrations : ALTER TABLE customer/website ADD revendeur_code, CREATE TABLE website_configuration Co-Authored-By: Claude Opus 4.6 (1M context) --- migrations/Version20260404193257.php | 31 +++++++++ migrations/Version20260404193605.php | 37 +++++++++++ src/Controller/Admin/ClientsController.php | 7 +- src/Entity/Customer.php | 15 +++++ src/Entity/Website.php | 15 +++++ src/Entity/WebsiteConfiguration.php | 66 +++++++++++++++++++ templates/admin/clients/create.html.twig | 9 +++ templates/admin/clients/show.html.twig | 8 +++ .../Admin/ClientsControllerTest.php | 9 ++- 9 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 migrations/Version20260404193257.php create mode 100644 migrations/Version20260404193605.php create mode 100644 src/Entity/WebsiteConfiguration.php diff --git a/migrations/Version20260404193257.php b/migrations/Version20260404193257.php new file mode 100644 index 0000000..b3ff459 --- /dev/null +++ b/migrations/Version20260404193257.php @@ -0,0 +1,31 @@ +addSql('ALTER TABLE customer ADD revendeur_code VARCHAR(10) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE customer DROP revendeur_code'); + } +} diff --git a/migrations/Version20260404193605.php b/migrations/Version20260404193605.php new file mode 100644 index 0000000..c6a8221 --- /dev/null +++ b/migrations/Version20260404193605.php @@ -0,0 +1,37 @@ +addSql('CREATE TABLE website_configuration (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, type VARCHAR(25) NOT NULL, value TEXT NOT NULL, website_id INT NOT NULL, PRIMARY KEY (id))'); + $this->addSql('CREATE INDEX IDX_8BC287E818F45C82 ON website_configuration (website_id)'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8BC287E818F45C828CDE5729 ON website_configuration (website_id, type)'); + $this->addSql('ALTER TABLE website_configuration ADD CONSTRAINT FK_8BC287E818F45C82 FOREIGN KEY (website_id) REFERENCES website (id) ON DELETE CASCADE NOT DEFERRABLE'); + $this->addSql('ALTER TABLE website ADD revendeur_code VARCHAR(10) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE website_configuration DROP CONSTRAINT FK_8BC287E818F45C82'); + $this->addSql('DROP TABLE website_configuration'); + $this->addSql('ALTER TABLE website DROP revendeur_code'); + } +} diff --git a/src/Controller/Admin/ClientsController.php b/src/Controller/Admin/ClientsController.php index 22fcd8f..c700283 100644 --- a/src/Controller/Admin/ClientsController.php +++ b/src/Controller/Admin/ClientsController.php @@ -13,6 +13,7 @@ use App\Service\MailerService; use App\Service\MeilisearchService; use App\Service\OvhService; use App\Service\UserManagementService; +use App\Repository\RevendeurRepository; use Doctrine\ORM\EntityManagerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; @@ -47,6 +48,7 @@ class ClientsController extends AbstractController public function create( Request $request, CustomerRepository $customerRepository, + RevendeurRepository $revendeurRepository, EntityManagerInterface $em, MeilisearchService $meilisearch, UserManagementService $userService, @@ -57,7 +59,9 @@ class ClientsController extends AbstractController #[Autowire(env: 'STRIPE_SK')] string $stripeSecretKey, ): Response { if ('POST' !== $request->getMethod()) { - return $this->render('admin/clients/create.html.twig'); + return $this->render('admin/clients/create.html.twig', [ + 'revendeurs' => $revendeurRepository->findBy(['isActive' => true], ['codeRevendeur' => 'ASC']), + ]); } try { @@ -223,6 +227,7 @@ class ClientsController extends AbstractController $customer->setZipCode(trim($request->request->getString('zipCode')) ?: null); $customer->setCity(trim($request->request->getString('city')) ?: null); $customer->setTypeCompany(trim($request->request->getString('typeCompany')) ?: null); + $customer->setRevendeurCode(trim($request->request->getString('revendeurCode')) ?: null); $customer->setGeoLat(trim($request->request->getString('geoLat')) ?: null); $customer->setGeoLong(trim($request->request->getString('geoLong')) ?: null); } diff --git a/src/Entity/Customer.php b/src/Entity/Customer.php index 56a8976..cddf5bc 100644 --- a/src/Entity/Customer.php +++ b/src/Entity/Customer.php @@ -112,6 +112,9 @@ class Customer #[ORM\Column(length: 50, unique: true, nullable: true)] private ?string $codeComptable = null; + #[ORM\Column(length: 10, nullable: true)] + private ?string $revendeurCode = null; + #[ORM\Column(nullable: true)] private ?\DateTimeImmutable $updatedAt = null; @@ -133,6 +136,18 @@ class Customer return $this; } + public function getRevendeurCode(): ?string + { + return $this->revendeurCode; + } + + public function setRevendeurCode(?string $revendeurCode): static + { + $this->revendeurCode = $revendeurCode; + + return $this; + } + public function generateCodeComptable(): string { $prefix = '411'; diff --git a/src/Entity/Website.php b/src/Entity/Website.php index 525a979..fcfa1b4 100644 --- a/src/Entity/Website.php +++ b/src/Entity/Website.php @@ -38,6 +38,9 @@ class Website #[ORM\Column(length: 20)] private string $state = self::STATE_CREATED; + #[ORM\Column(length: 10, nullable: true)] + private ?string $revendeurCode = null; + #[ORM\Column] private \DateTimeImmutable $createdAt; @@ -110,6 +113,18 @@ class Website return self::STATE_OPEN === $this->state; } + public function getRevendeurCode(): ?string + { + return $this->revendeurCode; + } + + public function setRevendeurCode(?string $revendeurCode): static + { + $this->revendeurCode = $revendeurCode; + + return $this; + } + public function getCreatedAt(): \DateTimeImmutable { return $this->createdAt; diff --git a/src/Entity/WebsiteConfiguration.php b/src/Entity/WebsiteConfiguration.php new file mode 100644 index 0000000..6d60730 --- /dev/null +++ b/src/Entity/WebsiteConfiguration.php @@ -0,0 +1,66 @@ +website = $website; + $this->type = $type; + $this->value = $value; + } + + public function getId(): ?int + { + return $this->id; + } + + public function getWebsite(): Website + { + return $this->website; + } + + public function getType(): string + { + return $this->type; + } + + public function setType(string $type): static + { + $this->type = $type; + + return $this; + } + + public function getValue(): string + { + return $this->value; + } + + public function setValue(string $value): static + { + $this->value = $value; + + return $this; + } +} diff --git a/templates/admin/clients/create.html.twig b/templates/admin/clients/create.html.twig index 5253849..bdbe511 100644 --- a/templates/admin/clients/create.html.twig +++ b/templates/admin/clients/create.html.twig @@ -68,6 +68,15 @@ +
+ + +
diff --git a/templates/admin/clients/show.html.twig b/templates/admin/clients/show.html.twig index dcea4d7..b422745 100644 --- a/templates/admin/clients/show.html.twig +++ b/templates/admin/clients/show.html.twig @@ -120,6 +120,10 @@ +
+ + +
@@ -168,6 +172,10 @@ Modifie le {{ customer.updatedAt ? customer.updatedAt|date('d/m/Y H:i') : '—' }} +
+ Revendeur + {{ customer.revendeurCode ?? '—' }} +
{% if customer.user.hasTempPassword %} diff --git a/tests/Controller/Admin/ClientsControllerTest.php b/tests/Controller/Admin/ClientsControllerTest.php index 9a76b9b..48a2a0d 100644 --- a/tests/Controller/Admin/ClientsControllerTest.php +++ b/tests/Controller/Admin/ClientsControllerTest.php @@ -78,7 +78,7 @@ class ClientsControllerTest extends TestCase $userService = $this->createStub(UserManagementService::class); $logger = $this->createStub(LoggerInterface::class); - $response = $controller->create($request, $repo, $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); + $response = $controller->create($request, $repo, $this->createStub(\App\Repository\RevendeurRepository::class), $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); $this->assertInstanceOf(Response::class, $response); } @@ -98,7 +98,7 @@ class ClientsControllerTest extends TestCase $userService->method('createBaseUser')->willThrowException(new \InvalidArgumentException('Champs requis')); $logger = $this->createStub(LoggerInterface::class); - $response = $controller->create($request, $repo, $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); + $response = $controller->create($request, $repo, $this->createStub(\App\Repository\RevendeurRepository::class), $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); $this->assertInstanceOf(Response::class, $response); } @@ -118,7 +118,7 @@ class ClientsControllerTest extends TestCase $userService->method('createBaseUser')->willThrowException(new \RuntimeException('DB error')); $logger = $this->createStub(LoggerInterface::class); - $response = $controller->create($request, $repo, $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); + $response = $controller->create($request, $repo, $this->createStub(\App\Repository\RevendeurRepository::class), $em, $meilisearch, $userService, $logger, $this->createStub(HttpClientInterface::class), $this->createStub(MailerService::class), $this->createStub(Environment::class), 'sk_test_***'); $this->assertInstanceOf(Response::class, $response); } @@ -286,6 +286,7 @@ class ClientsControllerTest extends TestCase $response = $controller->create( $request, $repo, + $this->createStub(\App\Repository\RevendeurRepository::class), $this->createStub(EntityManagerInterface::class), $this->createStub(MeilisearchService::class), $userService, @@ -326,6 +327,7 @@ class ClientsControllerTest extends TestCase $response = $controller->create( $request, $repo, + $this->createStub(\App\Repository\RevendeurRepository::class), $this->createStub(EntityManagerInterface::class), $this->createStub(MeilisearchService::class), $userService, @@ -369,6 +371,7 @@ class ClientsControllerTest extends TestCase $response = $controller->create( $request, $repo, + $this->createStub(\App\Repository\RevendeurRepository::class), $this->createStub(EntityManagerInterface::class), $meilisearch, $userService,