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

Java tutorial

Introduction

Here is the source code for nc.noumea.mairie.appock.viewmodel.EditDemandeATraiterViewModel.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 java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import org.apache.commons.collections4.CollectionUtils;
import org.zkoss.bind.annotation.*;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.EventQueues;
import org.zkoss.zk.ui.select.Selectors;
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.ListModelList;
import org.zkoss.zul.Messagebox;

import nc.noumea.mairie.appock.core.viewmodel.AbstractEditViewModel;
import nc.noumea.mairie.appock.entity.ArticleCatalogue;
import nc.noumea.mairie.appock.entity.ArticleDemande;
import nc.noumea.mairie.appock.entity.Demande;
import nc.noumea.mairie.appock.enums.EtatArticleDemande;
import nc.noumea.mairie.appock.event.OuvreOngletAbstractEntityEvent;
import nc.noumea.mairie.appock.repositories.ArticleDemandeRepository;
import nc.noumea.mairie.appock.repositories.DemandeRepository;
import nc.noumea.mairie.appock.services.CatalogueService;
import nc.noumea.mairie.appock.services.DemandeService;
import nc.noumea.mairie.appock.services.StockService;

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

    @WireVariable
    CatalogueService catalogueService;

    @WireVariable
    DemandeRepository demandeRepository;

    @WireVariable
    DemandeService demandeService;

    @WireVariable
    ArticleDemandeRepository articleDemandeRepository;

    @WireVariable
    StockService stockService;

    private ListModelList<ArticleDemande> selectedListeArticleDemande;

    private ListModelList<ArticleDemande> listeArticleDemande;

    public ListModelList<ArticleDemande> getListeArticleDemande() {
        return listeArticleDemande;
    }

    public void setListeArticleDemande(ListModelList<ArticleDemande> listeArticleDemande) {
        this.listeArticleDemande = listeArticleDemande;
    }

    public ListModelList<ArticleDemande> getSelectedListeArticleDemande() {
        return selectedListeArticleDemande;
    }

    public void setSelectedListeArticleDemande(ListModelList<ArticleDemande> selectedListeArticleDemande) {
        this.selectedListeArticleDemande = selectedListeArticleDemande;
    }

    @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        Selectors.wireComponents(view, this, false);
        listeArticleDemande.setMultiple(true);
    }

    @Init(superclass = true)
    public void init() {
        List<ArticleDemande> listeArticleDemande = entity.getListeArticleDemande();
        for (ArticleDemande articleDemande : listeArticleDemande) {
            catalogueService.initPhotoSrc(articleDemande.getArticleCatalogue());
            stockService.initArticleQuantiteStockPourService(articleDemande,
                    articleDemande.getDemande().getService());
        }
        setListeArticleDemande(new ListModelList<>(listeArticleDemande));
    }

    @Command
    @NotifyChange("entity")
    public void updateQuantiteCommande(@BindingParam("articleDemande") ArticleDemande articleDemande,
            @BindingParam("quantite") Integer quantite) {
        articleDemande.setQuantiteCommande(quantite);

        int i = 0;
        for (ArticleDemande articleDemandeARemplacer : listeArticleDemande) {
            if (articleDemandeARemplacer.equals(articleDemande)) {
                articleDemande = articleDemandeRepository.save(articleDemande);
                catalogueService.initPhotoSrc(articleDemande.getArticleCatalogue());
                listeArticleDemande.set(i, articleDemande);
                showNotificationStandard("Quantit mise  jour");
                break;
            }
            i++;
        }

        entity = demandeService.findOne(entity.getId());
    }

    @Command
    public void reinitialiseArticleDemande() {
        changeEtatArticleSelected("rinitialiser", null);
    }

    @Command
    public void valideArticleDemande() {
        changeEtatArticleSelected("valider", EtatArticleDemande.VALIDE);
    }

    @Command
    public void rejeteArticleDemande() {
        changeEtatArticleSelected("rejeter", EtatArticleDemande.REJETE);
    }

    private void changeEtatArticleSelected(String action, EtatArticleDemande etatArticleDemande) {
        if (CollectionUtils.isEmpty(selectedListeArticleDemande)) {
            Messagebox.show("Vous devez slectionner au moins un article pour pouvoir le " + action,
                    "Erreur changement d'tat", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }

        for (ArticleDemande articleDemande : selectedListeArticleDemande) {
            articleDemande.setEtatArticleDemande(etatArticleDemande);
            articleDemandeRepository.save(articleDemande);
        }

        rechargeOnglet(entity, "/layout/editDemandeATraiter.zul", null);
        rechargeOngletListeReferentAchat();
        showNotificationStandard("tat mise  jour");
    }

    @Command
    public void traiteDemande() {
        for (ArticleDemande articleDemande : listeArticleDemande) {
            if (articleDemande.getEtatArticleDemande() == null) {
                Messagebox.show(
                        "Vous devez valider ou rejeter chacun des articles de cette demande avant de pouvoir la marquer 'Traite'",
                        "Erreur de changement d'tat", Messagebox.OK, Messagebox.INFORMATION);
                return;
            }
        }

        Messagebox.show("Voulez-vous marquer cette demande 'Traite' ?", "Confirmation",
                new Messagebox.Button[] { Messagebox.Button.YES, Messagebox.Button.NO }, Messagebox.QUESTION,
                evt -> {
                    if (evt.getName().equals("onYes")) {
                        demandeService.traiteDemande(entity);
                        rechargeOngletListeReferentAchat();
                        fermeOnglet(entity);
                        ouvreOngletDemandeACommander();
                        showNotificationStandard("Demande passe  l'tat 'Traite'");
                    }
                });
    }

    @Command
    public void annuleDemande() {
        Messagebox.show("Voulez-vous annuler cette demande ?", "Confirmation",
                new Messagebox.Button[] { Messagebox.Button.YES, Messagebox.Button.NO }, Messagebox.QUESTION,
                evt -> {
                    if (evt.getName().equals("onYes")) {
                        demandeService.annuleDemande(entity);
                        rechargeOngletListeReferentAchat();
                        fermeOnglet(entity);
                        showNotificationStandard("Demande annule");
                    }
                });
    }

    private void ouvreOngletDemandeACommander() {
        EventQueues.lookup("appockQueue", EventQueues.DESKTOP, true)
                .publish(new OuvreOngletAbstractEntityEvent(entity, "layout/editDemandeACommander.zul"));
    }

    @Command
    public void ajouteArticleDemande() throws InterruptedException {
        // HACK : On met une tempo car il y a un bug (idem dans DPMMC) qui pose soucis quand une notification est affiche (qu'elle n'a pas encore
        // disparue) et qu'on ouvre une popup  ce moment la. Avec ce hack au moins la notification est sre d'tre masque
        // Ce bouton sera trs peu utilis donc on peux se permettre
        TimeUnit.SECONDS.sleep(4);
        Map<String, Object> args = new HashMap<>();
        args.put("demande", entity);
        Executions.createComponents("/layout/editDemandeATraiterAjoutArticlePopup.zul", null, args);
    }

    @GlobalCommand
    public void ajouteArticleADemande(@BindingParam("selectedArticleCatalogue") ArticleCatalogue articleCatalogue,
            @BindingParam("demande") Demande demande) {

        if (articleCatalogue == null || demande == null) {
            return;
        }

        for (ArticleDemande articleDemande : demande.getListeArticleDemande()) {
            if (articleDemande.getArticleCatalogue().equals(articleCatalogue)) {
                return;
            }
        }

        ArticleDemande articleDemande = new ArticleDemande();
        articleDemande.setArticleCatalogue(articleCatalogue);
        articleDemande.setQuantite(1);
        articleDemande.setQuantiteCommande(1);
        articleDemande.setDemande(demande);
        articleDemande.setAjoutReferentAchat(true);
        demande.getListeArticleDemande().add(articleDemande);
        entity = demandeRepository.save(demande);
        rechargeOnglet(entity, "/layout/editDemandeATraiter.zul", null);
        rechargeOngletListeReferentAchat();
    }
}