Java tutorial
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(); } }