diff --git a/src/Controller/Dashboard/CustomerController.php b/src/Controller/Dashboard/CustomerController.php index c30b11d..532c772 100644 --- a/src/Controller/Dashboard/CustomerController.php +++ b/src/Controller/Dashboard/CustomerController.php @@ -3,8 +3,12 @@ namespace App\Controller\Dashboard; use App\Entity\Customer; +use App\Entity\CustomerAddress; +use App\Form\CustomerAddAddressType; +use App\Form\CustomerAddType; use App\Form\CustomerType; use App\Logger\AppLogger; +use App\Repository\CustomerAddressRepository; use App\Repository\CustomerRepository; use App\Service\Search\Client; use Doctrine\ORM\EntityManagerInterface; @@ -50,11 +54,23 @@ class CustomerController extends AbstractController $this->appLogger->record('VIEW', 'Consultation de la page de création client'); $customer = new Customer(); - $form = $this->createForm(CustomerType::class, $customer); + $form = $this->createForm(CustomerAddType::class, $customer); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { + + $data= $request->request->all()['customer_add']; + + $userAddresse = new CustomerAddress(); + $userAddresse->setCustomer($customer); + $userAddresse->setAddress($data['adresse']); + $userAddresse->setCity($data['city']); + $userAddresse->setZipcode($data['zipcode']); + $userAddresse->setCountry($data['country']); + $userAddresse->setAddress2($data['adresse2']); + $userAddresse->setAddress3($data['adresse3']); + $entityManager->persist($userAddresse); // 1. Sauvegarde en base de données $entityManager->persist($customer); $entityManager->flush(); @@ -84,6 +100,7 @@ class CustomerController extends AbstractController public function edit( int $id, CustomerRepository $customerRepository, + CustomerAddressRepository $addressRepository, // Injecté pour charger l'adresse Request $request, EntityManagerInterface $entityManager, \App\Service\Stripe\Client $stripeClient, @@ -95,40 +112,75 @@ class CustomerController extends AbstractController throw $this->createNotFoundException('Client introuvable'); } + // --- LOGIQUE ADRESSE (ADD OU EDIT) --- + $idAddr = $request->query->get('idAddr'); + + if ($idAddr) { + // Mode ÉDITION d'adresse : on cherche l'adresse existante + $address = $addressRepository->findOneBy([ + 'id' => $idAddr, + 'customer' => $customer // Sécurité : on vérifie que l'adresse appartient bien au client + ]); + + if (!$address) { + $this->addFlash('error', 'Adresse introuvable ou non associée à ce client.'); + return $this->redirectToRoute('app_crm_customer_edit', ['id' => $customer->getId()]); + } + } else { + // Mode AJOUT : nouvelle instance + $address = new CustomerAddress(); + $address->setCustomer($customer); + } + + $formAddress = $this->createForm(CustomerAddAddressType::class, $address); + $formAddress->handleRequest($request); + + if ($formAddress->isSubmitted() && $formAddress->isValid()) { + // Si c'est une nouvelle adresse, on doit faire persist + if (!$address->getId()) { + $entityManager->persist($address); + $logAction = 'Ajout'; + } else { + $logAction = 'Modification'; + } + + $entityManager->flush(); + + $appLogger->record($idAddr ? 'EDIT' : 'CREATE', sprintf('%s adresse pour le client : %s', $logAction, $customer->getName())); + $this->addFlash('success', sprintf('L\'adresse a été %s avec succès.', $idAddr ? 'modifiée' : 'ajoutée')); + + // On redirige vers la fiche sans le paramètre idAddr pour nettoyer l'URL + return $this->redirectToRoute('app_crm_customer_edit', ['id' => $customer->getId()]); + } + + // --- LOGIQUE FORMULAIRE CLIENT (Reste identique) --- $form = $this->createForm(CustomerType::class, $customer); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - // 1. Log de l'action - $appLogger->record('EDIT', sprintf('Modification du client : %s %s', $customer->getSurname(), $customer->getName())); - - // 2. Mise à jour sur Stripe (si le client possède un CustomerId) if ($customer->getCustomerId()) { - // Tu peux créer une méthode updateCustomer dans ton service Stripe - // ou simplement utiliser le client natif ici pour l'exemple : try { $stripeClient->updateCustomer($customer); } catch (\Exception $e) { - $this->addFlash('warning', 'Modifié localement, mais erreur de synchro Stripe : ' . $e->getMessage()); + $this->addFlash('warning', 'Erreur synchro Stripe : ' . $e->getMessage()); } } - - // 3. Sauvegarde en base de données $entityManager->flush(); - + $appLogger->record('EDIT', sprintf('Modification du client : %s %s', $customer->getSurname(), $customer->getName())); $this->addFlash('success', 'Les informations du client ont été mises à jour.'); return $this->redirectToRoute('app_crm_customer_edit', ['id' => $customer->getId()]); } - // Si c'est juste une consultation (GET), on log la vue - if (!$form->isSubmitted()) { + if ($request->isMethod('GET')) { $appLogger->record('VIEW', sprintf('Consultation de la fiche client : %s', $customer->getName())); } return $this->render('dashboard/customer/show.twig', [ 'customer' => $customer, + 'formAddress' => $formAddress->createView(), 'form' => $form->createView(), + 'editingAddress' => (bool)$idAddr // Pour changer le texte du bouton dans le Twig ]); } #[Route(path: '/crm/customer/delete/{id}', name: 'app_crm_customer_delete', methods: ['GET', 'POST'])] diff --git a/src/Form/CustomerAddAddressType.php b/src/Form/CustomerAddAddressType.php new file mode 100644 index 0000000..0ee5264 --- /dev/null +++ b/src/Form/CustomerAddAddressType.php @@ -0,0 +1,59 @@ +add('address', TextType::class, [ + 'label' => 'Adresse', + 'required' => true, + ]) + ->add('address2', TextType::class, [ + 'label' => 'Adresse 2', + 'required' => false, + ]) + ->add('address3', TextType::class, [ + 'label' => 'Adresse 3', + 'required' => false, + ]) + ->add('zipcode', TextType::class, [ + 'label' => 'Code postale', + 'required' => true, + ]) + ->add('city', TextType::class, [ + 'label' => 'Ville', + 'required' => true, + ]) + ->add('country', ChoiceType::class, [ + 'label' => 'Pays', + 'required' => true, + 'choices' => [ + 'France' => 'fr', + + ] + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => CustomerAddress::class, + ]); + } +} diff --git a/src/Form/CustomerAddType.php b/src/Form/CustomerAddType.php new file mode 100644 index 0000000..f7f2169 --- /dev/null +++ b/src/Form/CustomerAddType.php @@ -0,0 +1,108 @@ +add('civ', ChoiceType::class, [ + 'label' => 'Civilité', + 'choices' => [ + 'Monsieur' => 'M.', + 'Madame' => 'Mme', + ], + 'expanded' => false, + 'multiple' => false, + ]) + ->add('surname', TextType::class, [ + 'label' => 'Prénom', + 'attr' => ['placeholder' => 'ex: Jean'], + 'required' => true, + ]) + ->add('name', TextType::class, [ + 'label' => 'Nom', + 'attr' => ['placeholder' => 'ex: DUPONT'], + 'required' => true, + ]) + ->add('type', ChoiceType::class, [ + 'label' => 'Type de client', + 'choices' => [ + 'Particulier' => 'personal', + 'Entreprise' => 'company', + 'Association' => 'association', + 'Mairie / Collectivité' => 'mairie', + ], + ]) + ->add('email', EmailType::class, [ + 'label' => 'Adresse Email', + 'attr' => ['placeholder' => 'contact@exemple.fr'], + 'required' => true, + ]) + ->add('phone', TelType::class, [ // TelType est plus adapté pour mobile + 'label' => 'Téléphone', + 'attr' => ['placeholder' => '06 .. .. .. ..'], + 'required' => true, + ]) + ->add('siret', TextType::class, [ + 'label' => 'Numéro SIRET', + 'required' => false, + 'attr' => ['placeholder' => '14 chiffres'], + 'help' => 'Obligatoire pour les entreprises et mairies', + ]) + + ->add('adresse', TextType::class, [ + 'label' => 'Adresse', + 'required' => true, + 'mapped' => false, + ]) + ->add('adresse2', TextType::class, [ + 'label' => 'Adresse 2', + 'required' => false, + 'mapped' => false, + ]) + ->add('adresse3', TextType::class, [ + 'label' => 'Adresse 3', + 'required' => false, + 'mapped' => false, + ]) + ->add('zipcode', TextType::class, [ + 'label' => 'Code postale', + 'required' => true, + 'mapped' => false, + ]) + ->add('city', TextType::class, [ + 'label' => 'Ville', + 'required' => true, + 'mapped' => false, + ]) + ->add('country', ChoiceType::class, [ + 'label' => 'Pays', + 'required' => true, + 'mapped' => false, + 'choices' => [ + 'France' => 'fr', + + ] + ]) + ; + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => Customer::class, + ]); + } +} diff --git a/src/Form/CustomerType.php b/src/Form/CustomerType.php index c23d2f2..fbf0f93 100644 --- a/src/Form/CustomerType.php +++ b/src/Form/CustomerType.php @@ -5,6 +5,7 @@ namespace App\Form; use App\Entity\Customer; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Form\Extension\Core\Type\CountryType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\TelType; use Symfony\Component\Form\Extension\Core\Type\TextType; diff --git a/templates/dashboard/customer/add.twig b/templates/dashboard/customer/add.twig index 158ab06..2eaa375 100644 --- a/templates/dashboard/customer/add.twig +++ b/templates/dashboard/customer/add.twig @@ -80,6 +80,32 @@ {{ form_widget(form.phone) }} +
- La suppression d'un client entraînera la suppression immédiate de ses informations sur l'Intranet et sur son compte Stripe. +
+ La suppression est définitive sur l'intranet et Stripe.
- - Supprimer le compte + data-turbo-confirm="Confirmer la suppression définitive ?" + class="flex items-center justify-center w-full py-3 border border-rose-500/20 hover:bg-rose-600 text-rose-500 hover:text-white text-[9px] font-black uppercase tracking-widest rounded-xl transition-all shadow-lg shadow-rose-500/5"> + Désactiver le client{{ address.address }}
+ {% if address.address2 %}{{ address.address2 }}
{% endif %} ++ {{ address.zipcode }} {{ address.city }} — {{ address.country }} +
+Aucune adresse enregistrée
+