fr.amapj.service.services.meslivraisons.MesLivraisonsService.java Source code

Java tutorial

Introduction

Here is the source code for fr.amapj.service.services.meslivraisons.MesLivraisonsService.java

Source

/*
 *  Copyright 2013-2016 Emmanuel BRUN (contact@amapj.fr)
 * 
 *  This file is part of AmapJ.
 *  
 *  AmapJ is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU Affero General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
    
 *  AmapJ is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with AmapJ.  If not, see <http://www.gnu.org/licenses/>.
 * 
 * 
 */
package fr.amapj.service.services.meslivraisons;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TemporalType;

import org.apache.commons.lang.time.DateUtils;

import fr.amapj.common.LongUtils;
import fr.amapj.model.engine.transaction.DbRead;
import fr.amapj.model.engine.transaction.TransactionHelper;
import fr.amapj.model.models.acces.RoleList;
import fr.amapj.model.models.contrat.modele.ModeleContrat;
import fr.amapj.model.models.contrat.modele.ModeleContratDate;
import fr.amapj.model.models.contrat.reel.ContratCell;
import fr.amapj.model.models.distribution.DatePermanence;
import fr.amapj.model.models.editionspe.AbstractEditionSpeJson;
import fr.amapj.model.models.editionspe.EditionSpecifique;
import fr.amapj.model.models.editionspe.TypEditionSpecifique;
import fr.amapj.model.models.editionspe.planningmensuel.PlanningMensuelJson;
import fr.amapj.model.models.editionspe.planningmensuel.TypPlanning;
import fr.amapj.model.models.fichierbase.Producteur;
import fr.amapj.model.models.fichierbase.Utilisateur;
import fr.amapj.service.services.access.AccessManagementService;
import fr.amapj.service.services.editionspe.EditionSpeService;
import fr.amapj.service.services.excelgenerator.EGPlanningMensuel;
import fr.amapj.service.services.saisiepermanence.PermanenceService;

/**
 * Permet la gestion des modeles de contrat
 * 
 *  
 *
 */
public class MesLivraisonsService {
    private final static Logger logger = LogManager.getLogger();

    public MesLivraisonsService() {

    }

    // PARTIE REQUETAGE POUR AVOIR LA LISTE DES LIVRAISONS POUR UN UTILISATEUR

    /**
     * Permet de charger la liste de tous les livraisons
     * dans une transaction en lecture
     */
    @DbRead
    public MesLivraisonsDTO getMesLivraisons(Date d, List<RoleList> roles, Long idUtilisateur) {
        EntityManager em = TransactionHelper.getEm();

        MesLivraisonsDTO res = new MesLivraisonsDTO();

        Utilisateur user = em.find(Utilisateur.class, idUtilisateur);

        res.dateDebut = fr.amapj.common.DateUtils.firstMonday(d);
        res.dateFin = DateUtils.addDays(res.dateDebut, 6);

        // On rcupre ensuite la liste de tous les cellules de contrats de cet utilisateur dans cet intervalle
        List<ContratCell> cells = getAllQte(em, res.dateDebut, res.dateFin, user);

        //
        for (ContratCell cell : cells) {
            addCell(cell, res);
        }

        // On rcupre ensuite la liste de toutes les permanences de cet utilisateur dans cet intervalle
        List<DatePermanence> dds = getAllDistributionsForUtilisateur(em, res.dateDebut, res.dateFin, user);
        for (DatePermanence dd : dds) {
            addDistribution(em, dd, res);
        }

        // On rcupre ensuite le planning mensuel si il y en a un
        res.planningMensuel = computePlanningMensuel(em, res.dateDebut, res.dateFin, roles);

        return res;

    }

    private List<DatePermanence> getAllDistributionsForUtilisateur(EntityManager em, Date dateDebut, Date dateFin,
            Utilisateur utilisateur) {
        Query q = em.createQuery("select distinct(du.datePermanence) from DatePermanenceUtilisateur du WHERE "
                + "du.datePermanence.datePermanence>=:deb and " + "du.datePermanence.datePermanence<=:fin and "
                + "du.utilisateur=:user " + "order by du.datePermanence.datePermanence");
        q.setParameter("deb", dateDebut, TemporalType.DATE);
        q.setParameter("fin", dateFin, TemporalType.DATE);
        q.setParameter("user", utilisateur);

        List<DatePermanence> dds = q.getResultList();

        return dds;
    }

    private void addDistribution(EntityManager em, DatePermanence dd, MesLivraisonsDTO res) {
        JourLivraisonsDTO jour = findJour(dd.getDatePermanence(), res);
        jour.distribution = new PermanenceService().createDistributionDTO(em, dd);
    }

    private void addCell(ContratCell cell, MesLivraisonsDTO res) {
        JourLivraisonsDTO jour = findJour(cell.getModeleContratDate().getDateLiv(), res);
        ProducteurLivraisonsDTO producteurs = findProducteurLivraison(cell.getModeleContratDate(),
                cell.getModeleContratDate().getModeleContrat(), jour);

        QteProdDTO qteProdDTO = findQteProdDTO(producteurs.produits, cell);
        qteProdDTO.qte = qteProdDTO.qte + cell.getQte();
    }

    private QteProdDTO findQteProdDTO(List<QteProdDTO> produits, ContratCell cell) {
        for (QteProdDTO qteProdDTO : produits) {
            if (qteProdDTO.idProduit.equals(cell.getModeleContratProduit().getProduit().getId())) {
                return qteProdDTO;
            }
        }
        QteProdDTO qteProdDTO = new QteProdDTO();
        qteProdDTO.conditionnementProduit = cell.getModeleContratProduit().getProduit().getConditionnement();
        qteProdDTO.nomProduit = cell.getModeleContratProduit().getProduit().getNom();
        qteProdDTO.idProduit = cell.getModeleContratProduit().getProduit().getId();

        produits.add(qteProdDTO);

        return qteProdDTO;
    }

    private JourLivraisonsDTO findJour(Date dateLiv, MesLivraisonsDTO res) {
        for (JourLivraisonsDTO jour : res.jours) {
            if (jour.date.equals(dateLiv)) {
                return jour;
            }
        }

        JourLivraisonsDTO jour = new JourLivraisonsDTO();
        jour.date = dateLiv;
        res.jours.add(jour);

        return jour;

    }

    private ProducteurLivraisonsDTO findProducteurLivraison(ModeleContratDate modeleContratDate,
            ModeleContrat modeleContrat, JourLivraisonsDTO jour) {
        for (ProducteurLivraisonsDTO producteur : jour.producteurs) {
            if (producteur.idModeleContrat.equals(modeleContrat.getId())) {
                return producteur;
            }
        }
        ProducteurLivraisonsDTO producteur = new ProducteurLivraisonsDTO();
        producteur.producteur = modeleContrat.getProducteur().getNom();
        producteur.modeleContrat = modeleContrat.getNom();
        producteur.idModeleContrat = modeleContrat.getId();
        producteur.idModeleContratDate = modeleContratDate.getId();
        jour.producteurs.add(producteur);

        return producteur;
    }

    /**
     * 
     */
    private List<ContratCell> getAllQte(EntityManager em, Date dateDebut, Date dateFin, Utilisateur user) {
        Query q = em.createQuery("select c from ContratCell c WHERE " + "c.modeleContratDate.dateLiv>=:deb AND "
                + "c.modeleContratDate.dateLiv<=:fin and " + "c.contrat.utilisateur =:user "
                + "order by c.modeleContratDate.dateLiv, c.contrat.modeleContrat.producteur.id, c.contrat.modeleContrat.id , c.modeleContratProduit.indx");
        q.setParameter("deb", dateDebut, TemporalType.DATE);
        q.setParameter("fin", dateFin, TemporalType.DATE);
        q.setParameter("user", user);

        List<ContratCell> prods = q.getResultList();
        return prods;
    }

    private List<EGPlanningMensuel> computePlanningMensuel(EntityManager em, Date dateDebut, Date dateFin,
            List<RoleList> roles) {
        List<EGPlanningMensuel> res = new ArrayList<EGPlanningMensuel>();

        if (new EditionSpeService().needPlanningMensuel() == false) {
            return res;
        }

        // Rcupration de la liste des mois
        List<Date> months = getMonth(em, dateDebut, dateFin);

        boolean hasLivraison = hasLivraison(em, dateDebut, dateFin);

        // Rcupration de la liste des editions
        List<EditionSpecifique> editions = new EditionSpeService()
                .getEtiquetteByType(TypEditionSpecifique.PLANNING_MENSUEL);

        for (EditionSpecifique editionSpecifique : editions) {
            if (canAccess(roles, editionSpecifique)) {
                // Le nom de l'edition est mis en suffixe uniquement si il y en a plusieurs 
                String suffix = "";
                if (editions.size() != 1) {
                    suffix = editionSpecifique.getNom();
                }

                PlanningMensuelJson planningJson = (PlanningMensuelJson) AbstractEditionSpeJson
                        .load(editionSpecifique);

                if (planningJson.getTypPlanning() == TypPlanning.MENSUEL) {
                    for (Date month : months) {
                        EGPlanningMensuel planningMensuel = new EGPlanningMensuel(editionSpecifique.getId(), month,
                                suffix);
                        res.add(planningMensuel);
                    }
                } else {
                    if (hasLivraison) {
                        EGPlanningMensuel planningMensuel = new EGPlanningMensuel(editionSpecifique.getId(),
                                dateDebut, suffix);
                        res.add(planningMensuel);
                    }
                }
            }
        }

        return res;
    }

    /**
     * Indique si cet utilisateur a le droit d'accder  cette dition spcifique
     * @param u
     * @param editionSpecifique
     * @return
     */
    private boolean canAccess(List<RoleList> roles, EditionSpecifique editionSpecifique) {
        PlanningMensuelJson planningJson = (PlanningMensuelJson) AbstractEditionSpeJson.load(editionSpecifique);
        return roles.contains(planningJson.getAccessibleBy());
    }

    /**
     * Retourne la liste des mois de cette pages mes livraisons
     * @param dto
     * @return
     */
    private List<Date> getMonth(EntityManager em, Date dateDebut, Date dateFin) {
        // On extrait toutes les livraisons sur l'intervalle et on en dduit la liste de mois
        Query q = em.createQuery("select distinct(mcd.dateLiv) from ModeleContratDate mcd WHERE "
                + "mcd.dateLiv>=:deb AND " + "mcd.dateLiv<=:fin " + "order by mcd.dateLiv");
        q.setParameter("deb", dateDebut, TemporalType.DATE);
        q.setParameter("fin", dateFin, TemporalType.DATE);

        List<Date> mcds = q.getResultList();

        List<Date> res = new ArrayList<Date>();

        for (Date mcd : mcds) {
            Date month = fr.amapj.common.DateUtils.firstDayInMonth(mcd);
            if (res.contains(month) == false) {
                res.add(month);
            }
        }
        return res;
    }

    /**
     * Indique si il y a au moins une livraison cette semaine
     * @param dto
     * @return
     */
    private boolean hasLivraison(EntityManager em, Date dateDebut, Date dateFin) {
        // On extrait toutes les livraisons sur l'intervalle 
        Query q = em.createQuery("select count(mcd.dateLiv) from ModeleContratDate mcd WHERE "
                + "mcd.dateLiv>=:deb AND " + "mcd.dateLiv<=:fin ");
        q.setParameter("deb", dateDebut, TemporalType.DATE);
        q.setParameter("fin", dateFin, TemporalType.DATE);

        return LongUtils.toInt(q.getSingleResult()) > 0;
    }

    // PARTIE REQUETAGE POUR AVOIR LA LISTE DES LIVRAISONS POUR UN PRODUCTEUR

    /**
     * Retourne la liste des livraisons pour le producteur spcifi 
     */
    @DbRead
    public MesLivraisonsDTO getLivraisonProducteur(Date d, Long idProducteur) {
        EntityManager em = TransactionHelper.getEm();

        MesLivraisonsDTO res = new MesLivraisonsDTO();

        Producteur producteur = em.find(Producteur.class, idProducteur);

        res.dateDebut = fr.amapj.common.DateUtils.firstMonday(d);
        res.dateFin = DateUtils.addDays(res.dateDebut, 6);

        // On rcupre ensuite la liste de tous les cellules de contrats de cet utilisateur dans cet intervalle
        List<ContratCell> cells = getAllQte(em, res.dateDebut, res.dateFin, producteur);

        //
        for (ContratCell cell : cells) {
            addCell(cell, res);
        }

        return res;

    }

    /**
     * 
     */
    private List<ContratCell> getAllQte(EntityManager em, Date dateDebut, Date dateFin, Producteur producteur) {
        Query q = em.createQuery("select c from ContratCell c " + "WHERE c.modeleContratDate.dateLiv>=:deb AND "
                + "c.modeleContratDate.dateLiv<=:fin and " + "c.contrat.modeleContrat.producteur =:prod "
                + "order by c.modeleContratDate.dateLiv, c.contrat.modeleContrat.producteur.id, c.contrat.modeleContrat.id , c.modeleContratProduit.indx");
        q.setParameter("deb", dateDebut, TemporalType.DATE);
        q.setParameter("fin", dateFin, TemporalType.DATE);
        q.setParameter("prod", producteur);

        List<ContratCell> prods = q.getResultList();
        return prods;
    }

}