From 8d91795250e92f0d0e036b0b9ec89c490a953af6 Mon Sep 17 00:00:00 2001 From: Serreau Jovann Date: Wed, 8 Apr 2026 19:42:53 +0200 Subject: [PATCH] fix: paiement manuel partiel - un avis peut avoir plusieurs paiements - Ne passe en 'accepted' que quand totalPaid >= totalTtc - Facture generee uniquement quand totalement paye - Message flash avec reste a payer si paiement partiel - Modal affiche "Deja paye / Reste" si paiements existants - Bouton visible sur avis send + tout state non cancel/accepted Co-Authored-By: Claude Opus 4.6 (1M context) --- src/Controller/Admin/AdvertController.php | 42 +++++++++++++++++------ templates/admin/clients/show.html.twig | 15 ++++++-- 2 files changed, 45 insertions(+), 12 deletions(-) diff --git a/src/Controller/Admin/AdvertController.php b/src/Controller/Admin/AdvertController.php index a7f1bba..80c5677 100644 --- a/src/Controller/Admin/AdvertController.php +++ b/src/Controller/Admin/AdvertController.php @@ -308,27 +308,49 @@ class AdvertController extends AbstractController } // Creer l'AdvertPayment - $payment = new \App\Entity\AdvertPayment($advert, \App\Entity\AdvertPayment::TYPE_SUCCESS, number_format((float) $amount, 2, '.', '')); + $amountFormatted = number_format((float) $amount, 2, '.', ''); + $payment = new \App\Entity\AdvertPayment($advert, \App\Entity\AdvertPayment::TYPE_SUCCESS, $amountFormatted); $payment->setMethod($method); $this->em->persist($payment); - // Mettre a jour l'etat de l'avis - $advert->setState(Advert::STATE_ACCEPTED); - // Tracker l'evenement $this->em->persist(new \App\Entity\AdvertEvent($advert, \App\Entity\AdvertEvent::TYPE_PAY, 'Paiement manuel : '.$methodLabel.' - '.$amount.' EUR')); + + // Calculer le total des paiements reussis + $totalPaid = 0.0; + foreach ($advert->getPayments() as $p) { + if (\App\Entity\AdvertPayment::TYPE_SUCCESS === $p->getType()) { + $totalPaid += (float) $p->getAmount(); + } + } + $totalPaid += (float) $amountFormatted; + + $advertTotal = (float) $advert->getTotalTtc(); + $isFullyPaid = $totalPaid >= ($advertTotal - 0.01); + + if ($isFullyPaid) { + $advert->setState(Advert::STATE_ACCEPTED); + } + $this->em->flush(); - // Generer la facture - try { - $factureService->createPaidFactureFromAdvert($advert, number_format((float) $amount, 2, '.', ''), $methodLabel); - } catch (\Throwable $e) { - $this->addFlash('warning', 'Paiement enregistre mais erreur generation facture : '.$e->getMessage()); + // Generer la facture uniquement si totalement paye + if ($isFullyPaid) { + try { + $factureService->createPaidFactureFromAdvert($advert, number_format($advertTotal, 2, '.', ''), $methodLabel); + } catch (\Throwable $e) { + $this->addFlash('warning', 'Paiement enregistre mais erreur generation facture : '.$e->getMessage()); + } } $this->meilisearch->indexAdvert($advert); - $this->addFlash('success', 'Paiement de '.$amount.' EUR enregistre ('.$methodLabel.') pour l\'avis '.$advert->getOrderNumber()->getNumOrder().'.'); + $remaining = $advertTotal - $totalPaid; + if ($isFullyPaid) { + $this->addFlash('success', 'Paiement complet de '.$amount.' EUR enregistre ('.$methodLabel.'). Avis '.$advert->getOrderNumber()->getNumOrder().' marque paye.'); + } else { + $this->addFlash('success', 'Paiement partiel de '.$amount.' EUR enregistre ('.$methodLabel.'). Reste a payer : '.number_format($remaining, 2, ',', ' ').' EUR.'); + } return $this->redirectToRoute('app_admin_clients_show', [ 'id' => $advert->getCustomer()?->getId() ?? 0, diff --git a/templates/admin/clients/show.html.twig b/templates/admin/clients/show.html.twig index 81f45e2..b21475f 100644 --- a/templates/admin/clients/show.html.twig +++ b/templates/admin/clients/show.html.twig @@ -641,6 +641,8 @@
+ {% endif %} + {% if a.state == 'send' or (a.state != 'cancel' and a.state != 'accepted') %}