nc.noumea.mairie.appock.viewmodel.EditStockViewModel.java Source code

Java tutorial

Introduction

Here is the source code for nc.noumea.mairie.appock.viewmodel.EditStockViewModel.java

Source

package nc.noumea.mairie.appock.viewmodel;

/*-
 * #%L
 * Logiciel de Gestion des approvisionnements et des stocks des fournitures administratives de la Mairie de Nouma
 * %%
 * Copyright (C) 2017 Mairie de Nouma, Nouvelle-Caldonie
 * %%
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public
 * License along with this program.  If not, see
 * <http://www.gnu.org/licenses/gpl-3.0.html>.
 * #L%
 */

import nc.noumea.mairie.appock.comparator.ArticleStockComparator;
import nc.noumea.mairie.appock.core.utility.AppockUtil;
import nc.noumea.mairie.appock.core.utility.DateUtil;
import nc.noumea.mairie.appock.core.viewmodel.AbstractEditViewModel;
import nc.noumea.mairie.appock.dto.EntreeSortieStock;
import nc.noumea.mairie.appock.entity.*;
import nc.noumea.mairie.appock.enums.TypeMouvementStock;
import nc.noumea.mairie.appock.services.*;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zkplus.spring.DelegatingVariableResolver;
import org.zkoss.zul.Messagebox;

import java.io.Serializable;
import java.util.*;

@VariableResolver(DelegatingVariableResolver.class)
public class EditStockViewModel extends AbstractEditViewModel<Stock> implements Serializable {
    private static final long serialVersionUID = 1L;

    @WireVariable
    ServiceService serviceService;

    @WireVariable
    CatalogueService catalogueService;

    @WireVariable
    ArticleCatalogueService articleCatalogueService;

    @WireVariable
    StockService stockService;

    @WireVariable
    MailService mailService;

    private Service selectedService;

    private List<Service> listeService;

    private List<ArticleStock> listeArticleStock;

    private List<ArticleStock> selectedListeArticleStock;

    private String texteRecherche;

    private String texteRechercheHistorique;

    private String observationRecherche;

    private List<MouvementStock> listeMouvementStock;

    public Service getSelectedService() {
        return selectedService;
    }

    public void setSelectedService(Service selectedService) {
        this.selectedService = selectedService;
    }

    public List<ArticleStock> getListeArticleStock() {
        return listeArticleStock;
    }

    public void setListeArticleStock(List<ArticleStock> listeArticleStock) {
        this.listeArticleStock = listeArticleStock;
    }

    public List<ArticleStock> getSelectedListeArticleStock() {
        return selectedListeArticleStock;
    }

    public void setSelectedListeArticleStock(List<ArticleStock> selectedListeArticleStock) {
        this.selectedListeArticleStock = selectedListeArticleStock;
    }

    public String getTexteRechercheHistorique() {
        return texteRechercheHistorique;
    }

    public void setTexteRechercheHistorique(String texteRechercheHistorique) {
        this.texteRechercheHistorique = AppockUtil.majusculeSansAccentTrim(texteRechercheHistorique);
    }

    public List<MouvementStock> getListeMouvementStock() {
        return listeMouvementStock;
    }

    public void setListeMouvementStock(List<MouvementStock> listeMouvementStock) {
        this.listeMouvementStock = listeMouvementStock;
    }

    public List<Service> getListeService() {
        return listeService;
    }

    public void setListeService(List<Service> listeService) {
        this.listeService = listeService;
    }

    public String getObservationRecherche() {
        return observationRecherche;
    }

    public void setObservationRecherche(String observationRecherche) {
        this.observationRecherche = AppockUtil.majusculeSansAccentTrim(observationRecherche);
    }

    public String getTexteRecherche() {
        return texteRecherche;
    }

    public void setTexteRecherche(String texteRecherche) {
        this.texteRecherche = AppockUtil.majusculeSansAccentTrim(texteRecherche);
    }

    @Init
    public void init() {
        setListeService(serviceService.findAllWithActifInactifOrderByLibelle(true));
    }

    @Command
    @NotifyChange("*")
    public void refreshListeArticleStock() {
        if (selectedService == null) {
            return;
        }

        selectedListeArticleStock = null;
        selectedService = serviceService.findOne(selectedService.getId());

        if (selectedService.getStock() == null) {
            selectedService.setStock(new Stock());
            selectedService = serviceService.save(selectedService);
        }

        entity = stockService.findOne(selectedService.getStock().getId());
        listeArticleStock = entity.getListeArticleStock();
        Collections.sort(listeArticleStock, new ArticleStockComparator());

        Catalogue catalogueActif = catalogueService.findActif();

        List<ArticleStock> resultListeArticleStock = new ArrayList<>();
        for (ArticleStock articleStock : listeArticleStock) {
            // Pour les stocks a t dcid de ne pas faire de lien "fort" par id sur un articleCatalogue le catalogue changeant tous les ans
            // Tous les ans un mme article va donc avoir un nouvel ID au sein d'un nouveau catalogue (pas gnant du tout pour les catalogues).
            // Hors pour les stocks il s'agit bien du mme article anne aprs anne, donc on fait le lien par rfrence
            ArticleCatalogue articleCatalogue = articleCatalogueService.findArticleCataloguePlusRecentParReference(
                    articleStock.getReferenceArticleStock(), catalogueActif);
            if (articleCatalogue == null || (StringUtils.isNotBlank(texteRecherche)
                    && !articleCatalogue.getLibelle().contains(texteRecherche)
                    && !articleCatalogue.getReference().contains(texteRecherche)
                    && !articleCatalogue.getSousFamille().getLibelle().contains(texteRecherche))) {
                continue;
            } else {
                articleStock.setArticleCatalogue(articleCatalogue);
                resultListeArticleStock.add(articleStock);
            }

            catalogueService.initPhotoSrc(articleStock.getArticleCatalogue());
        }

        setListeArticleStock(resultListeArticleStock);
        Collections.sort(listeArticleStock, new ArticleStockComparator());

        List<MouvementStock> result = new ArrayList<>();
        result.addAll(entity.getListeMouvementStock());
        if (StringUtils.isNotBlank(texteRechercheHistorique) || StringUtils.isNotBlank(observationRecherche)) {
            for (MouvementStock mouvementStock : entity.getListeMouvementStock()) {

                if (StringUtils.isNotBlank(texteRechercheHistorique)) {
                    if (!mouvementStock.getReference().contains(texteRechercheHistorique)) {
                        result.remove(mouvementStock);
                    }
                }

                if (StringUtils.isNotBlank(observationRecherche)) {
                    if (mouvementStock.getObservation() == null
                            || !AppockUtil.majusculeSansAccentTrim(mouvementStock.getObservation())
                                    .contains(observationRecherche)) {
                        result.remove(mouvementStock);
                    }
                }
            }
        }

        setListeMouvementStock(result);
    }

    protected void creeSortieStock(String referentAchatOuService) {
        if (CollectionUtils.isEmpty(selectedListeArticleStock)) {
            Messagebox.show(
                    "Vous devez slectionner un article dans la liste avant de pouvoir effectuer une sortie de stock",
                    "Erreur", Messagebox.OK, Messagebox.ERROR);
            return;
        }

        Map<String, Object> args = new HashMap<>();
        args.put("selectedListeArticleStock", selectedListeArticleStock);
        args.put("referentAchatOuService", referentAchatOuService);
        Executions.createComponents("/layout/createSortieStockPopup.zul", null, args);
    }

    protected void creeMultipleNouvelleSortieStock(List<EntreeSortieStock> listeSortieStock) {
        listeSortieStock.forEach(sortieStock -> {
            // On rcupre la dernire version de ArticleStock mis  jour par les itrations prcdentes
            Stock stock = stockService.findOne(sortieStock.getArticleStock().getStock().getId());
            Optional<ArticleStock> optionalArticleStock = stock.getListeArticleStock().stream()
                    .filter(a -> a.getId().equals(sortieStock.getArticleStock().getId())).findFirst();

            optionalArticleStock.ifPresent(articleStock -> creeNouvelleSortieStock(articleStock,
                    sortieStock.getQuantiteASortir(), sortieStock.getObservation()));
        });
    }

    protected void creeNouvelleSortieStock(ArticleStock articleStock, Integer quantiteRenseigne,
            String observation) {

        if (articleStock.getQuantiteStock() - quantiteRenseigne < 0) {
            Messagebox.show( //
                    "Vous ne pouvez pas sortir du stock une quantit suprieure  celle que vous avez en stock", //
                    articleStock.getLibelleCourt() + " : Sortie refuse", //
                    Messagebox.OK, Messagebox.ERROR);
            return;
        }

        if (articleStock.getQuantiteStock() - quantiteRenseigne == 0) {
            Messagebox.show( //
                    "Confirmez-vous que vous n'avez plus l'article (" + articleStock.getLibelleCourt()
                            + ") en stock ?", //
                    "Confirmation", //
                    new Messagebox.Button[] { Messagebox.Button.YES, Messagebox.Button.NO }, //
                    Messagebox.QUESTION, evt -> {
                        if (evt.getName().equals("onYes")) {
                            creeEntreeSortieGeneric(articleStock, quantiteRenseigne, observation,
                                    TypeMouvementStock.SORTIE);
                        }
                    });
        } else {
            creeEntreeSortieGeneric(articleStock, quantiteRenseigne, observation, TypeMouvementStock.SORTIE);
        }
    }

    protected void creeEntreeSortieGeneric(List<EntreeSortieStock> listeEntreeStock,
            TypeMouvementStock typeMouvementStock) {
        listeEntreeStock.forEach(entreeStock -> {
            // On rcupre la dernire version de ArticleStock mis  jour par les itrations prcdentes
            Stock stock = stockService.findOne(entreeStock.getArticleStock().getStock().getId());
            Optional<ArticleStock> optionalArticleStock = stock.getListeArticleStock().stream()
                    .filter(a -> a.getId().equals(entreeStock.getArticleStock().getId())).findFirst();

            optionalArticleStock.ifPresent(articleStock -> creeEntreeSortieGeneric(articleStock,
                    entreeStock.getQuantiteASortir(), entreeStock.getObservation(), typeMouvementStock));
        });
    }

    protected void creeEntreeSortieGeneric(ArticleStock articleStock, Integer quantiteRenseigne, String observation,
            TypeMouvementStock typeMouvementStock) {
        if (articleStock == null || quantiteRenseigne == null) {
            return;
        }

        stockService.creeEntreeSortieEtMouvement(articleStock, quantiteRenseigne, typeMouvementStock, observation);
        refreshListeArticleStock();
        // #45172 : Pas d'appel  rechargeOngletMonStock() pour ne pas perdre le texte de la recherche
        BindUtils.postNotifyChange(null, null, this, "*");
    }

    @Command
    @NotifyChange("*")
    public void rechercheHistorique() {
        refreshListeArticleStock();
    }

    @Command
    @NotifyChange("*")
    public void videRechercheHistorique() {
        setTexteRechercheHistorique(null);
        setObservationRecherche(null);
        refreshListeArticleStock();
    }

    public String getDateDernierInventaireAsString() {
        if (entity == null) {
            return null;
        }

        return DateUtil.formatDateTime(entity.getDateDernierInventaire());
    }

    public String getDateDerniereDemandeInventaireAsString() {
        if (entity == null) {
            return null;
        }

        return DateUtil.formatDateTime(entity.getDateDerniereDemandeInventaire());
    }

    public String getInventaireUser() {
        if (entity == null) {
            return null;
        }

        return entity.getInventaireUser();
    }

    public String getInventaireDemandeUser() {
        if (entity == null) {
            return null;
        }

        return entity.getInventaireDemandeUser();
    }
}