/** * @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); }