/**
  * @name updateAbonnement($pCompteAbonnement)
  * @param CompteAbonnementVO
  * @return integer
  * @desc Met à jour un Abonnement
  */
 private function updateAbonnement($pCompteAbonnement)
 {
     // Récupère le produitAbonnement
     $lProduitAbonnement = $this->getProduit($pCompteAbonnement->getIdProduitAbonnement());
     // La liste des Produit identique en abonnement sur des marche en cours
     $lProduitsMarche = DetailMarcheViewManager::selectProduitAbonnementMarcheActifByIdNomProduit($lProduitAbonnement->getIdNomProduit());
     $lListeProduitsMarche = array();
     foreach ($lProduitsMarche as $lProduit) {
         if (isset($lListeProduitsMarche[$lProduit->getProId()])) {
             array_push($lListeProduitsMarche[$lProduit->getProId()]["lots"], $lProduit);
         } else {
             $lListeProduitsMarche[$lProduit->getProId()]["produit"] = $lProduit;
             $lListeProduitsMarche[$lProduit->getProId()]["lots"] = array();
             array_push($lListeProduitsMarche[$lProduit->getProId()]["lots"], $lProduit);
         }
     }
     $lReservationService = new ReservationService();
     $lStockService = new StockService();
     foreach ($lListeProduitsMarche as $lProduitMarche) {
         $lSuspendu = false;
         // Si il n'y a pas de suspension à la date du marché
         if (TestFonction::dateTimeEstPLusGrandeEgale($lProduitMarche["produit"]->getComDateMarcheDebut(), $pCompteAbonnement->getDateDebutSuspension(), 'db') && TestFonction::dateTimeEstPLusGrandeEgale($pCompteAbonnement->getDateFinSuspension(), $lProduitMarche["produit"]->getComDateMarcheFin(), 'db')) {
             $lSuspendu = true;
         }
         $lPoursuivre = true;
         // Si le marché n'est pas encore passé
         if (!TestFonction::dateTimeEstPLusGrandeEgale($lProduitMarche["produit"]->getComDateMarcheDebut(), StringUtils::dateTimeAujourdhuiDb(), 'db')) {
             $lPoursuivre = false;
         }
         if ($lPoursuivre) {
             // Recherche de l'Id du lot dans le marché pour le produit correspondant.
             $lIdLot = 0;
             foreach ($lProduitMarche["lots"] as $lLot) {
                 if (fmod($pCompteAbonnement->getQuantite(), $lLot->getDcomTaille()) == 0) {
                     $lIdLot = $lLot->getDcomId();
                     $lTailleLot = $lLot->getDcomTaille();
                     $lPrixLot = $lLot->getDcomPrix();
                 }
             }
             // Si un lot correspond
             $lPoursuivre = $lIdLot != 0;
             if ($lPoursuivre) {
                 $lReservation = new ReservationVO();
                 $lReservation->getId()->setIdCompte($pCompteAbonnement->getIdCompte());
                 $lReservation->getId()->setIdCommande($lProduitMarche["produit"]->getComId());
                 $lReservationsActuelle = $lReservationService->get($lReservation->getId());
                 $lTestDetailReservation = $lReservationsActuelle->getDetailReservation();
                 if (empty($lTestDetailReservation) && !$lSuspendu && $pCompteAbonnement->getEtat() == 0) {
                     // Ajoute une réservation
                     $lQuantite = $pCompteAbonnement->getQuantite();
                     if ($lProduitMarche["produit"]->getProStockInitial() != -1) {
                         $lStockProduit = $lStockService->selectByIdProduitStockProduitReservation($lProduitMarche["produit"]->getProId());
                         $lStockDispo = $lProduitMarche["produit"]->getProStockInitial() - $lStockProduit[0]->getStoQuantite();
                         if ($lStockDispo > 0) {
                             if ($lStockDispo < $lQuantite) {
                                 $lQuantite = $lStockDispo;
                             }
                         } else {
                             // Plus de stock
                             $lPoursuivre = false;
                         }
                     }
                     if ($lPoursuivre) {
                         if ($lProduitMarche["produit"]->getProMaxProduitCommande() != -1 && $lProduitMarche["produit"]->getProMaxProduitCommande() < $lQuantite) {
                             $lQuantite = $lProduitMarche["produit"]->getProMaxProduitCommande();
                         }
                         $lDetailReservation = new DetailReservationVO();
                         $lDetailReservation->setIdDetailCommande($lIdLot);
                         $lDetailReservation->setQuantite(-1 * $lQuantite);
                         $lDetailReservation->setMontant(-1 * $lQuantite / $lTailleLot * $lPrixLot);
                         $lReservationsActuelle->addDetailReservation($lDetailReservation);
                         $lReservationsActuelle->setId($lReservation->getId());
                         $lReservationService->set($lReservationsActuelle);
                     }
                 } else {
                     // Si il y a une réservation déjà sur ce produit on la met à jour
                     $lMaj = false;
                     $lQuantiteActuelle = 0;
                     foreach ($lReservationsActuelle->getDetailReservation() as $lDetailReservationActuelle) {
                         if ($lDetailReservationActuelle->getIdProduit() == $lProduitMarche["produit"]->getProId()) {
                             $lQuantiteActuelle = $lDetailReservationActuelle->getQuantite();
                             $lMaj = true;
                         } else {
                             $lReservation->addDetailReservation($lDetailReservationActuelle);
                         }
                     }
                     if ($lMaj || !$lMaj && !$lSuspendu && $pCompteAbonnement->getEtat() == 0) {
                         $lQuantite = $pCompteAbonnement->getQuantite();
                         if ($lProduitMarche["produit"]->getProStockInitial() != -1) {
                             $lStockProduit = $lStockService->selectByIdProduitStockProduitReservation($lProduitMarche["produit"]->getProId());
                             $lStockDispo = $lProduitMarche["produit"]->getProStockInitial() - $lStockProduit[0]->getStoQuantite() - $lQuantiteActuelle;
                             if ($lStockDispo > 0) {
                                 if ($lStockDispo < $lQuantite) {
                                     $lQuantite = $lStockDispo;
                                 }
                             } else {
                                 // Plus de stock
                                 $lPoursuivre = false;
                             }
                         }
                         if ($lPoursuivre) {
                             if ($lProduitMarche["produit"]->getProMaxProduitCommande() != -1 && $lProduitMarche["produit"]->getProMaxProduitCommande() < $lQuantite) {
                                 $lQuantite = $lProduitMarche["produit"]->getProMaxProduitCommande();
                             }
                             $lDetailReservation = new DetailReservationVO();
                             $lDetailReservation->setIdDetailCommande($lIdLot);
                             $lDetailReservation->setQuantite(-1 * $lQuantite);
                             $lDetailReservation->setMontant(-1 * $lQuantite / $lTailleLot * $lPrixLot);
                             if ($pCompteAbonnement->getEtat() == 0 && !$lSuspendu) {
                                 // Si l'abonnement est toujours actif et qu'il n'y a pas de suspension
                                 $lReservation->addDetailReservation($lDetailReservation);
                             }
                         }
                         $lReservationService->set($lReservation);
                     }
                 }
             }
         }
     }
     return CompteAbonnementManager::update($pCompteAbonnement);
 }