/**
   * Méthode en charge d'initialiser les lignes de stock à partir des mouvements de stock de type
   * Entree.
   *
   * @param essai Essai.
   * @param pharmacie Pharmacie.
   * @param produit Produit.
   * @param conditionnement Conditionnement.
   * @param mapLines Map des lignes de stock à construire.
   */
  private void buildFromMvtTypeEntree(
      final MvtStockSearchCriteria critEntree, final Map<String, LigneStock> mapLines) {
    // Récupération des mouvements de type Entree qui concernent l'essai, la
    // pharmacie, le produit et le conditionnement
    critEntree.setTypesMouvement(TypeMvtStock.ENTREES);
    critEntree.setActiveOrder("datePeremption");

    final List<MvtStock> appros = this.mvtStockService.getAll(critEntree);

    for (final MvtStock mouvementStock : appros) {
      final Approvisionnement appro = (Approvisionnement) mouvementStock;
      final LigneStock ligneStock = this.createLigneStock(mouvementStock);

      if (appro.getApproApprouve()) {
        final Produit prod = this.produitService.reattach(appro.getProduit());
        final Stockage stockage =
            this.produitService.getStockageProduitPharma(prod, appro.getPharmacie());
        ligneStock.setStockage(stockage.getNomComplet());
      } else {
        ligneStock.setStockage(LigneStock.EN_QUARANTAINE);
      }

      final String key = this.getKeyMvtStock(mouvementStock, false);

      // Une entrée existe déjà => cumul des quantités saisies
      if (mapLines.get(key) != null) {
        final LigneStock l = mapLines.get(key);
        l.setQteGlobalStock(l.getQteGlobalStock() + ligneStock.getQteGlobalStock());
      } else {
        mapLines.put(key, ligneStock);
      }
      this.log.debug(
          "Entrée key: " + key + " object: " + ligneStock + "Mvt Id: " + mouvementStock.getId());
    }
  }
  /**
   * Mise à jour d'un mouvement d'approvisionnement.
   *
   * @param appro Approvisionnement à mettre à jour.
   * @param stockage Lieu de stockage.
   */
  private LigneStock updateAppro(final Approvisionnement appro) {

    // Récupération de la ligne de stock associée au mouvement
    final LigneStock ligneStock = this.getLigneStock(appro);

    // Valorisation du lieu de stockage
    if (Boolean.FALSE.equals(appro.getApproApprouve())) {
      ligneStock.setStockage(LigneStock.EN_QUARANTAINE);
    } else {
      // Récupération du lieu de stockage pour le produit et la
      // pharmacie
      final Produit produit = this.produitService.get(appro.getProduit().getId());
      final Stockage stockage =
          this.produitService.getStockageProduitPharma(produit, appro.getPharmacie());
      ligneStock.setStockage(stockage.getNomComplet());
    }
    ligneStock.setQteGlobalStock(ligneStock.getQteGlobalStock() + appro.getQuantite());

    return ligneStock;
  }
  @Override
  public void addQuarantaineToStock(final EtatStock etat, final EtatLigneStock ligne) {

    // Récupération des mouvements associés à la ligne
    final MvtStockSearchCriteria criteria = new MvtStockSearchCriteria();
    criteria.setEssai(etat.getEssai());
    criteria.setPharmacie(etat.getPharmacie());
    criteria.setProduit(etat.getProduit());
    criteria.setConditionnement(etat.getConditionnement());
    criteria.setNumLot(ligne.getNumLot());
    criteria.setNumTraitement(ligne.getNumTraitement());

    for (final MvtStock mvt : this.mvtStockService.getAll(criteria)) {
      mvt.setApproApprouve(true);
      this.mvtStockService.save(mvt);
    }

    // Récupération des lignes de stock pour mettre à jour le lieu de
    // stockage ainsi que l'info de quarantaine
    final StockSearchCriteria stockCriteria = new StockSearchCriteria();
    stockCriteria.setEssai(etat.getEssai());
    stockCriteria.setPharmacie(etat.getPharmacie());
    stockCriteria.setProduit(etat.getProduit());
    stockCriteria.setConditionnement(etat.getConditionnement());
    stockCriteria.setNumLotStrict(ligne.getNumLot());
    stockCriteria.setNumTraitement(ligne.getNumTraitement());

    final List<LigneStock> ligneStocks = this.getAll(stockCriteria);
    for (final LigneStock ligneStock : ligneStocks) {
      final Produit prod = this.produitService.reattach(etat.getProduit());
      ligneStock.setStockage(
          this.produitService.getStockageProduitPharma(prod, etat.getPharmacie()).getNomComplet());
      ligneStock.setApproApprouve(true);
    }
    this.saveAll(ligneStocks);
  }