/**
  * @name update($pReservation)
  * @param ReservationVO
  * @return integer
  * @desc Met à jour une réservation
  */
 private function update($pReservation)
 {
     $lTestDetailReservation = $pReservation->getDetailReservation();
     if (!empty($lTestDetailReservation)) {
         // Si il y a encore des produits dans la réservation
         $lReservationsActuelle = $this->get($pReservation->getId());
         $lOpeReservations = $this->selectOperationReservation($pReservation->getId());
         $lIdOperation = $lOpeReservations[0]->getId();
         /*$lOperation = $lOperations[0];
         		$lIdOperation = $lOperation->getId();*/
         $lOperationService = new OperationService();
         $lOperation = $lOperationService->getDetail($lIdOperation);
         $lTotal = 0;
         $lStockService = new StockService();
         $lDetailOperationService = new DetailOperationService();
         $lListeIdDetailCommande = array();
         foreach ($pReservation->getDetailReservation() as $lProduit) {
             array_push($lListeIdDetailCommande, $lProduit->getIdDetailCommande());
         }
         $lDetailMarche = DetailMarcheViewManager::selectByIdDetailCommande($lListeIdDetailCommande);
         foreach ($lReservationsActuelle->getDetailReservation() as $lReservationActuelle) {
             $lTestUpdate = false;
             foreach ($pReservation->getDetailReservation() as $lReservationNouvelle) {
                 if ($lReservationActuelle->getIdDetailCommande() == $lReservationNouvelle->getIdDetailCommande()) {
                     $lTotal += $lReservationNouvelle->getMontant();
                     // Maj du stock
                     $lStock = new StockVO();
                     $lStock->setId($lReservationActuelle->getId()->getIdStock());
                     $lStock->setQuantite($lReservationNouvelle->getQuantite());
                     $lStock->setType(0);
                     $lStock->setIdCompte($pReservation->getId()->getIdCompte());
                     $lStock->setIdDetailCommande($lReservationActuelle->getIdDetailCommande());
                     $lStock->setIdOperation($lIdOperation);
                     $lStock->setIdNomProduit($lDetailMarche[$lReservationActuelle->getIdDetailCommande()]->getProIdNomProduit());
                     $lStock->setUnite($lDetailMarche[$lReservationActuelle->getIdDetailCommande()]->getProUniteMesure());
                     $lStockService->set($lStock);
                     // Maj du détail Opération
                     $lDetailOperation = new DetailOperationVO();
                     $lDetailOperation->setId($lReservationActuelle->getId()->getIdDetailOperation());
                     $lDetailOperation->setIdOperation($lIdOperation);
                     $lDetailOperation->setIdCompte($pReservation->getId()->getIdCompte());
                     $lDetailOperation->setMontant($lReservationNouvelle->getMontant());
                     $lDetailOperation->setLibelle("Marché N°" . $pReservation->getId()->getIdCommande());
                     $lDetailOperation->setTypePaiement(0);
                     $lDetailOperation->setIdDetailCommande($lReservationActuelle->getIdDetailCommande());
                     $lDetailOperation->setIdNomProduit($lDetailMarche[$lReservationActuelle->getIdDetailCommande()]->getProIdNomProduit());
                     $lDetailOperationService->set($lDetailOperation);
                     $lTestUpdate = true;
                 }
             }
             if (!$lTestUpdate) {
                 // Suppression du stock et du detail operation
                 $lStockService->delete($lReservationActuelle->getId()->getIdStock());
                 $lDetailOperationService->delete($lReservationActuelle->getId()->getIdDetailOperation());
             }
         }
         foreach ($pReservation->getDetailReservation() as $lReservationNouvelle) {
             $lTestInsert = true;
             foreach ($lReservationsActuelle->getDetailReservation() as $lReservationActuelle) {
                 if ($lReservationActuelle->getIdDetailCommande() == $lReservationNouvelle->getIdDetailCommande()) {
                     $lTestInsert = false;
                 }
             }
             if ($lTestInsert) {
                 $lTotal += $lReservationNouvelle->getMontant();
                 // Ajout du stock
                 $lStock = new StockVO();
                 $lStock->setQuantite($lReservationNouvelle->getQuantite());
                 $lStock->setType(0);
                 $lStock->setIdCompte($pReservation->getId()->getIdCompte());
                 $lStock->setIdDetailCommande($lReservationNouvelle->getIdDetailCommande());
                 $lStock->setIdOperation($lIdOperation);
                 $lStock->setIdNomProduit($lDetailMarche[$lReservationNouvelle->getIdDetailCommande()]->getProIdNomProduit());
                 $lStock->setUnite($lDetailMarche[$lReservationNouvelle->getIdDetailCommande()]->getProUniteMesure());
                 $lStockService->set($lStock);
                 // Ajout du détail Opération
                 $lDetailOperation = new DetailOperationVO();
                 $lDetailOperation->setIdOperation($lIdOperation);
                 $lDetailOperation->setIdCompte($pReservation->getId()->getIdCompte());
                 $lDetailOperation->setMontant($lReservationNouvelle->getMontant());
                 $lDetailOperation->setLibelle("Marché N°" . $pReservation->getId()->getIdCommande());
                 $lDetailOperation->setTypePaiement(0);
                 $lDetailOperation->setIdDetailCommande($lReservationNouvelle->getIdDetailCommande());
                 $lDetailOperation->setIdNomProduit($lDetailMarche[$lReservationNouvelle->getIdDetailCommande()]->getProIdNomProduit());
                 $lDetailOperationService->set($lDetailOperation);
             }
         }
         // Maj de l'opération
         $lOperation->setMontant($lTotal);
         $lOperationService->set($lOperation);
     } else {
         // La réservation est vide on la supprime
         $this->delete($pReservation->getId());
     }
 }
 /**
  * @name update($pMarche)
  * @param MarcheVO
  * @return integer
  * @desc Insère une nouvelle ligne dans la table, à partir des informations de la CommandeVO en paramètre (l'id sera automatiquement calculé par la BDD)
  */
 public function update($pMarche)
 {
     $lIdMarche = $pMarche->getId();
     $lMarche = new CommandeVO();
     $lMarche->setId($lIdMarche);
     $lMarche->setNumero($pMarche->getNumero());
     $lMarche->setNom($pMarche->getNom());
     $lMarche->setDescription($pMarche->getDescription());
     $lMarche->setDateMarcheDebut($pMarche->getDateMarcheDebut());
     $lMarche->setDateMarcheFin($pMarche->getDateMarcheFin());
     $lMarche->setDateDebutReservation($pMarche->getDateDebutReservation());
     $lMarche->setDateFinReservation($pMarche->getDateFinReservation());
     $lMarche->setArchive($pMarche->getArchive());
     CommandeManager::update($lMarche);
     // Maj des infos de la commande
     $lMarcheActuel = $this->get($lIdMarche);
     if ($lIdMarche != null && $lMarcheActuel->getId() != null) {
         $lStockService = new StockService();
         foreach ($lMarcheActuel->getProduits() as $lProduitActuel) {
             $lMaj = true;
             // Produits Modifiés
             foreach ($pMarche->getProduits() as $lProduitNv) {
                 if ($lProduitActuel->getId() == $lProduitNv->getId()) {
                     $lMaj = false;
                     //Les lots
                     foreach ($lProduitActuel->getLots() as $lLotActuel) {
                         $lMajLot = true;
                         foreach ($lProduitNv->getLots() as $lLotNv) {
                             // Maj Lot
                             if ($lLotActuel->getId() == $lLotNv->getId()) {
                                 $lDcomId = $lLotActuel->getId();
                                 $lMajLot = false;
                                 $lDetailCommande = new DetailCommandeVO();
                                 $lDetailCommande->setId($lLotActuel->getId());
                                 $lDetailCommande->setIdProduit($lProduitActuel->getId());
                                 $lDetailCommande->setTaille($lLotNv->getTaille());
                                 $lDetailCommande->setPrix($lLotNv->getPrix());
                                 DetailCommandeManager::update($lDetailCommande);
                                 // Maj des réservations associées
                                 DetailOperationManager::majTotalReservation($lLotActuel->getId());
                             }
                         }
                         // Supprimer Lot
                         if ($lMajLot) {
                             $lDeleteLot = DetailCommandeManager::select($lLotActuel->getId());
                             $lDeleteLot->setEtat(1);
                             DetailCommandeManager::update($lDeleteLot);
                         }
                     }
                     // Nouveau Lot
                     foreach ($lProduitNv->getLots() as $lLotNv) {
                         $lAjout = true;
                         foreach ($lProduitActuel->getLots() as $lLotActuel) {
                             if ($lLotActuel->getId() == $lLotNv->getId()) {
                                 $lAjout = false;
                             }
                         }
                         if ($lAjout) {
                             $lDetailCommande = new DetailCommandeVO();
                             $lDetailCommande->setIdProduit($lProduitActuel->getId());
                             $lDetailCommande->setTaille($lLotNv->getTaille());
                             $lDetailCommande->setPrix($lLotNv->getPrix());
                             $lDcomId = DetailCommandeManager::insert($lDetailCommande);
                         }
                     }
                     $lResaActuel = GestionCommandeReservationProducteurViewManager::getStockReservationProducteur($lProduitActuel->getIdCompteProducteur(), $lProduitActuel->getId());
                     $lStockActuel = $lStockService->get($lResaActuel[0]->getStoId());
                     // Maj du stock
                     $lStockActuel->setQuantite($lProduitNv->getQteRestante());
                     $lStockActuel->setIdCompte($lProduitNv->getIdProducteur());
                     $lStockActuel->setIdDetailCommande($lDcomId);
                     $lStockService->set($lStockActuel);
                     $lProduit = ProduitManager::select($lProduitActuel->getId());
                     $lProduit->setIdCommande($lIdMarche);
                     $lProduit->setIdNomProduit($lProduitNv->getIdNom());
                     $lProduit->setUniteMesure($lProduitNv->getUnite());
                     $lProduit->setMaxProduitCommande($lProduitNv->getQteMaxCommande());
                     $lProduit->setIdCompteProducteur($lProduitNv->getIdProducteur());
                     // C'est bien le compte il faut changer le nom du champ
                     $lProduit->setType($lProduitNv->getType());
                     ProduitManager::update($lProduit);
                 }
             }
             // Produits supprimés
             if ($lMaj) {
                 // Suppression des lots
                 $lLots = DetailCommandeManager::selectByIdProduit($lProduitActuel->getId());
                 foreach ($lLots as $lLot) {
                     $lLot->setEtat(1);
                     DetailCommandeManager::update($lLot);
                 }
                 $lProduit = new ProduitVO();
                 $lProduit->setId($lProduitActuel->getId());
                 $lProduit->setIdCommande($lIdMarche);
                 $lProduit->setIdNomProduit($lProduitActuel->getIdNom());
                 $lProduit->setUniteMesure($lProduitActuel->getUnite());
                 $lProduit->setMaxProduitCommande($lProduitActuel->getQteMaxCommande());
                 $lProduit->setIdCompteProducteur($lProduitActuel->getIdCompteProducteur());
                 $lProduit->setType($lProduitActuel->getType());
                 $lProduit->setEtat(1);
                 ProduitManager::update($lProduit);
             }
         }
         // Les nouveaux produits
         foreach ($pMarche->getProduits() as $lProduitNv) {
             $lAjout = true;
             foreach ($lMarcheActuel->getProduits() as $lProduitActuel) {
                 if ($lProduitActuel->getId() == $lProduitNv->getId()) {
                     $lAjout = false;
                 }
             }
             if ($lAjout) {
                 // Insertion du produit
                 $lProduit = new ProduitVO();
                 $lProduit->setIdCommande($lIdMarche);
                 $lProduit->setIdNomProduit($lProduitNv->getIdNom());
                 $lProduit->setUniteMesure($lProduitNv->getUnite());
                 $lProduit->setMaxProduitCommande($lProduitNv->getQteMaxCommande());
                 $lProduit->setIdCompteProducteur($lProduitNv->getIdProducteur());
                 // C'est bien le compte il faut changer le nom du champ
                 $lProduit->setStockReservation($lProduitNv->getQteRestante());
                 $lProduit->setStockInitial($lProduitNv->getQteRestante());
                 $lProduit->setType($lProduitNv->getType());
                 $lIdProduit = ProduitManager::insert($lProduit);
                 //Insertion des lots
                 foreach ($lProduitNv->getLots() as $lNouveauLot) {
                     $lDetailCommande = new DetailCommandeVO();
                     $lDetailCommande->setIdProduit($lIdProduit);
                     $lDetailCommande->setTaille($lNouveauLot->getTaille());
                     $lDetailCommande->setPrix($lNouveauLot->getPrix());
                     $lDcomId = DetailCommandeManager::insert($lDetailCommande);
                 }
                 //Insertion du stock -> Met à jour le stock reservation dans le produit
                 $lStock = new StockVO();
                 $lStock->setQuantite($lProduitNv->getQteRestante());
                 $lStock->setType(0);
                 $lStock->setIdCompte($lProduitNv->getIdProducteur());
                 // C'est bien le compte il faut changer le nom du champ
                 $lStock->setIdDetailCommande($lDcomId);
                 $lStockService = new StockService();
                 $lStockService->set($lStock);
             }
         }
     }
     return $lIdMarche;
 }
 /**
  * @name remplirStock($pId, $pDate, $pQuantite, $pType, $pIdCompte, $pIdDetailCommande, $pIdModeleLot, $pIdOperation, $pIdNomProduit, $pUnite)
  * @param int(11)
  * @param datetime
  * @param decimal(10,2)
  * @param tinyint(1)
  * @param int(11)
  * @param int(11)
  * @param int(11)
  * @param int(11)
  * @param int(11)
  * @param varchar(20)
  * @return StockVO
  * @desc Retourne une StockVO remplie
  */
 private static function remplirStock($pId, $pDate, $pQuantite, $pType, $pIdCompte, $pIdDetailCommande, $pIdModeleLot, $pIdOperation, $pIdNomProduit, $pUnite)
 {
     $lStock = new StockVO();
     $lStock->setId($pId);
     $lStock->setDate($pDate);
     $lStock->setQuantite($pQuantite);
     $lStock->setType($pType);
     $lStock->setIdCompte($pIdCompte);
     $lStock->setIdDetailCommande($pIdDetailCommande);
     $lStock->setIdModeleLot($pIdModeleLot);
     $lStock->setIdOperation($pIdOperation);
     $lStock->setIdNomProduit($pIdNomProduit);
     $lStock->setUnite($pUnite);
     return $lStock;
 }
 /**
  * @name enregistrerBonDeCommande($pParam)
  * @return AfficheListeProduitBonDeCommandeResponse
  * @desc Enregistre le bon de commande.
  */
 public function enregistrerBonDeCommande($pParam)
 {
     $lVr = ProduitsBonDeCommandeValid::validAjout($pParam);
     if ($lVr->getValid()) {
         $lIdMarche = $pParam["id_commande"];
         $lIdCompteFerme = $pParam["id_compte_ferme"];
         $lProduits = $pParam["produits"];
         // On enregistre uniquement les produits avec à minima quantité (même si prix à 0)
         // Calcul du total
         $lTotal = 0;
         $lProduitsValide = array();
         foreach ($lProduits as $lProduit) {
             if ($lProduit["quantite"] > 0) {
                 array_push($lProduitsValide, $lProduit);
             }
             $lTotal += $lProduit["prix"];
         }
         // Récupère l'opération Bon de commande si elle existe
         $lOperationService = new OperationService();
         $lOperations = $lOperationService->getBonCommande($lIdMarche, $lIdCompteFerme);
         $lIdOperation = $lOperations[0]->getId();
         if (is_null($lIdOperation)) {
             // Si il n'y a pas d'opération de Bon de commande
             $lOperation = new OperationDetailVO();
             $lOperation->setIdCompte($lIdCompteFerme);
             $lOperation->setLibelle('Bon de Commande');
             $lOperation->setTypePaiement(5);
             $lOperationChampComplementaire = new OperationChampComplementaireVO();
             $lOperationChampComplementaire->setChcpId(1);
             $lOperationChampComplementaire->setValeur($lIdMarche);
             $lOperation->setChampComplementaire(array($lOperationChampComplementaire));
         } else {
             $lOperation = $lOperations[0];
         }
         $lOperation->setMontant($lTotal);
         $lIdOperation = $lOperationService->set($lOperation);
         // Ajout ou mise à jour de l'operation
         $lBonCommande = InfoBonCommandeViewManager::selectInfoBonCommande($lIdMarche, $lIdCompteFerme);
         $lDetailOperationService = new DetailOperationService();
         $lStockService = new StockService();
         foreach ($lProduitsValide as $lProduit) {
             $lMaj = false;
             foreach ($lBonCommande as $lBon) {
                 if ($lProduit["dcomId"] == $lBon->getDcomId()) {
                     $lMaj = true;
                     //$lDcom = DetailCommandeManager::selectByIdProduit($lProduit["id"]);
                     $lStock = new StockVO();
                     $lStock->setId($lBon->getStoId());
                     $lStock->setQuantite($lProduit["quantite"]);
                     $lStock->setType(3);
                     $lStock->setIdCompte($lIdCompteFerme);
                     $lStock->setIdDetailCommande($lProduit["dcomId"]);
                     $lStock->setIdOperation($lIdOperation);
                     $lStockService->set($lStock);
                     $lDetailOperation = $lDetailOperationService->get($lBon->getDopeId());
                     $lDetailOperation->setIdOperation($lIdOperation);
                     $lDetailOperation->setIdCompte($lIdCompteFerme);
                     $lDetailOperation->setMontant($lProduit["prix"]);
                     $lDetailOperation->setLibelle('Bon de Commande');
                     $lDetailOperation->setTypePaiement(5);
                     $lDetailOperationService->set($lDetailOperation);
                 }
             }
             if (!$lMaj) {
                 //$lDcom = DetailCommandeManager::selectByIdProduit($lProduit["id"]);
                 $lStock = new StockVO();
                 $lStock->setQuantite($lProduit["quantite"]);
                 $lStock->setType(3);
                 $lStock->setIdCompte($lIdCompteFerme);
                 $lStock->setIdDetailCommande($lProduit["dcomId"]);
                 $lStock->setIdOperation($lIdOperation);
                 $lStockService->set($lStock);
                 $lDetailOperation = new DetailOperationVO();
                 $lDetailOperation->setIdOperation($lIdOperation);
                 $lDetailOperation->setIdCompte($lIdCompteFerme);
                 $lDetailOperation->setMontant($lProduit["prix"]);
                 $lDetailOperation->setLibelle('Bon de Commande');
                 $lDetailOperation->setTypePaiement(5);
                 //$lDetailOperation->setTypePaiementChampComplementaire($lProduit["id"]);
                 $lDetailOperation->setIdDetailCommande($lProduit["dcomId"]);
                 $lDetailOperationService->set($lDetailOperation);
             }
         }
         foreach ($lBonCommande as $lBon) {
             $lDelete = true;
             foreach ($lProduitsValide as $lProduit) {
                 if ($lProduit["dcomId"] == $lBon->getDcomId()) {
                     $lDelete = false;
                 }
             }
             if ($lDelete) {
                 $lStockService->delete($lBon->getStoId());
                 $lDetailOperationService->delete($lBon->getDopeId());
             }
         }
     }
     return $lVr;
 }