/**
  * @name recherche( $pTypeRecherche, $pTypeCritere, $pCritereRecherche, $pTypeTri, $pCritereTri )
  * @param string nom de la table
  * @param string Le type de critère de recherche
  * @param array(string) champs à récupérer dans la table
  * @param array(array(string, object)) Dictionnaire(champ, valeur)) contenant les champs à filtrer ainsi que la valeur du filtre
  * @param array(array(string, string)) Dictionnaire(champ, sens) contenant les tris à appliquer
  * @return array(GestionCommandeReservationProducteurViewVO)
  * @desc Récupères les lignes de la table selon le critère de recherche puis trie et renvoie la liste de résultat sous forme d'une collection de GestionCommandeReservationProducteurViewVO
  */
 public static function recherche($pTypeRecherche, $pTypeCritere, $pCritereRecherche, $pTypeTri, $pCritereTri)
 {
     // Initialisation du Logger
     $lLogger =& Log::singleton('file', CHEMIN_FICHIER_LOGS);
     $lLogger->setMask(Log::MAX(LOG_LEVEL));
     // Préparation de la requète
     $lChamps = array(ProduitManager::CHAMP_PRODUIT_ID_COMMANDE . "," . ProduitManager::CHAMP_PRODUIT_ID_COMPTE_FERME . "," . ProduitManager::CHAMP_PRODUIT_ID . "," . StockManager::CHAMP_STOCK_ID);
     // Préparation de la requète de recherche
     $lRequete = DbUtils::prepareRequeteRecherche(GestionCommandeReservationProducteurViewManager::VUE_GESTIONCOMMANDERESERVATIONPRODUCTEUR, $lChamps, $pTypeRecherche, $pTypeCritere, $pCritereRecherche, $pTypeTri, $pCritereTri);
     $lListeGestionCommandeReservationProducteur = array();
     if ($lRequete !== false) {
         $lLogger->log("Execution de la requete : " . $lRequete, PEAR_LOG_DEBUG);
         // Maj des logs
         $lSql = Dbutils::executerRequete($lRequete);
         if (mysql_num_rows($lSql) > 0) {
             while ($lLigne = mysql_fetch_assoc($lSql)) {
                 array_push($lListeGestionCommandeReservationProducteur, GestionCommandeReservationProducteurViewManager::remplir($lLigne[ProduitManager::CHAMP_PRODUIT_ID_COMMANDE], $lLigne[ProduitManager::CHAMP_PRODUIT_ID_COMPTE_FERME], $lLigne[ProduitManager::CHAMP_PRODUIT_ID], $lLigne[StockManager::CHAMP_STOCK_ID]));
             }
         } else {
             $lListeGestionCommandeReservationProducteur[0] = new GestionCommandeReservationProducteurViewVO();
         }
         return $lListeGestionCommandeReservationProducteur;
     }
     $lListeGestionCommandeReservationProducteur[0] = new GestionCommandeReservationProducteurViewVO();
     return $lListeGestionCommandeReservationProducteur;
 }
 /**
  * @name updateProduit($pProduit)
  * @param ProduitVO
  * @desc Met à jour le produit du marché
  */
 public function updateProduit($pProduit, $pLotRemplacement = array())
 {
     $lProduitActuel = $this->selectProduit($pProduit->getId());
     //Les lots
     $lLotModif = array();
     $lLotSupp = array();
     foreach ($lProduitActuel->getLots() as $lLotActuel) {
         $lMajLot = true;
         foreach ($pProduit->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());
                 array_push($lLotModif, $lDetailCommande);
             }
         }
         // Supprimer Lot
         if ($lMajLot) {
             array_push($lLotSupp, $lLotActuel->getId());
         }
     }
     // Nouveau Lot
     $lLotAdd = array();
     foreach ($pProduit->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);
             $lLotAdd[$lLotNv->getId()] = $lDcomId;
             // Si supression d'un lot et positionnement de ce nouveau lot permet de récupérer l'ID
         }
     }
     $lStockService = new StockService();
     $lResaActuel = GestionCommandeReservationProducteurViewManager::getStockReservationProducteur($lProduitActuel->getIdCompteFerme(), $lProduitActuel->getId());
     $lStockActuel = $lStockService->get($lResaActuel[0]->getStoId());
     // Maj du stock
     $lStockActuel->setQuantite($pProduit->getQteRestante());
     $lStockActuel->setIdDetailCommande($lDcomId);
     $lStockService->updateStockProduit($lStockActuel);
     $lProduit = ProduitManager::select($lProduitActuel->getId());
     $lProduit->setUniteMesure($pProduit->getUnite());
     if ($pProduit->getQteMaxCommande() == "" || $pProduit->getQteMaxCommande() == -1) {
         $lProduit->setMaxProduitCommande(-1);
     } else {
         $lProduit->setMaxProduitCommande($pProduit->getQteMaxCommande());
     }
     $lProduit->setType($pProduit->getType());
     ProduitManager::update($lProduit);
     // Modif des réservations
     $lReservationService = new ReservationService();
     $lIdMarche = $lProduitActuel->getIdMarche();
     foreach ($lLotSupp as $lIdLot) {
         // Chaque lot supprimé => La réservation est positionnée sur un autre lot
         if (isset($pLotRemplacement[$lIdLot])) {
             $lIdLotRemplacement = $pLotRemplacement[$lIdLot];
             if ($lIdLotRemplacement < 0) {
                 $lIdLotRemplacement = $lLotAdd[$lIdLotRemplacement];
             }
             $lListeDetailReservation = $lReservationService->getReservationSurLot($lIdLot);
             if (!is_null($lListeDetailReservation[0]->getDopeIdCompte())) {
                 // Si il y a des réservations
                 foreach ($lListeDetailReservation as $lDetailReservation) {
                     // Chaque réservation de lot modifié
                     $lIdReservationVO = new IdReservationVO();
                     $lIdReservationVO->setIdCompte($lDetailReservation->getDopeIdCompte());
                     $lIdReservationVO->setIdCommande($lIdMarche);
                     $lReservationVO = $lReservationService->get($lIdReservationVO);
                     $lNvDetailReservation = array();
                     foreach ($lReservationVO->getDetailReservation() as $lDetailReservationActuelle) {
                         if ($lDetailReservationActuelle->getIdDetailCommande() == $lIdLot) {
                             // Maj de la reservation pour ce produit
                             $lDetailCommande = DetailCommandeManager::select($lIdLotRemplacement);
                             $lPrix = $lDetailReservation->getStoQuantite() / $lDetailCommande->getTaille() * $lDetailCommande->getPrix();
                             $lDetailReservationVO = new DetailReservationVO();
                             $lDetailReservationVO->setIdDetailCommande($lIdLotRemplacement);
                             $lDetailReservationVO->setQuantite($lDetailReservation->getStoQuantite());
                             $lDetailReservationVO->setMontant($lPrix);
                             array_push($lNvDetailReservation, $lDetailReservationVO);
                         } else {
                             // Ajout des autres produits
                             array_push($lNvDetailReservation, $lDetailReservationActuelle);
                         }
                     }
                     $lReservationVO->setDetailReservation($lNvDetailReservation);
                     $lReservationService->set($lReservationVO);
                     // Maj de la reservation
                 }
             }
         }
         $lDeleteLot = DetailCommandeManager::select($lIdLot);
         $lDeleteLot->setEtat(1);
         DetailCommandeManager::update($lDeleteLot);
     }
 }