package nc.noumea.mairie.organigramme.viewmodel; /* * #%L * Logiciel de Gestion des Organigrammes de la Ville de Nouméa * $Id:$ * $HeadURL:$ * %% * Copyright (C) 2015 Mairie de Nouméa * %% * 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.Map; import nc.noumea.mairie.organigramme.core.viewmodel.AbstractEditViewModel; import nc.noumea.mairie.organigramme.core.viewmodel.AbstractViewModel; import nc.noumea.mairie.organigramme.dto.EntiteDto; import nc.noumea.mairie.organigramme.enums.FiltreStatut; import nc.noumea.mairie.organigramme.enums.Statut; import nc.noumea.mairie.organigramme.enums.Transition; import org.zkoss.bind.BindUtils; import org.zkoss.zk.ui.Executions; import org.zkoss.zul.Messagebox; /** * Classe de gestion du workflow, couplée à un OrganigrammeViewModel. * * @author AgileSoft.NC */ public class OrganigrammeWorkflowViewModel extends AbstractEditViewModel<EntiteDto> implements Serializable { private static final long serialVersionUID = 1L; private OrganigrammeViewModel organigrammeViewModel; public OrganigrammeWorkflowViewModel(OrganigrammeViewModel organigrammeViewModel) { this.organigrammeViewModel = organigrammeViewModel; } public void passerTransition(Transition transition, EntiteDto entiteDto) { if (transition == null) { return; } if (transition.getStatutSource() != entiteDto.getStatut()) { AbstractViewModel.showErrorPopup("Bug (de rafraîchissement des boutons de changement de statut) : le statut de l'entité est " + entiteDto.getStatut() + ", mais la transition demandée est " + transition); return; } // @formatter:off switch (transition) { case TRANSITOIRE: executerTransitionTransitoire(entiteDto); break; case ACTIF_APRES_PREVISION: executerTransitionActifApresPrevision(entiteDto); break; case INACTIF_APRES_TRANSITOIRE: executerTransitionInactifApresTransitoire(entiteDto); break; case INACTIF_APRES_ACTIF: executerTransitionInactifApresActif(entiteDto); break; default: break; } // @formatter:on } private void executerTransitionTransitoire(EntiteDto entiteDto) { executerTransitionWithRefAndDate(Transition.TRANSITOIRE, Statut.TRANSITOIRE, entiteDto); } private void executerTransitionActifApresPrevision(EntiteDto entiteDto) { executerTransitionWithRefAndDate(Transition.ACTIF_APRES_PREVISION, Statut.ACTIF, entiteDto); } private void executerTransitionInactifApresTransitoire(EntiteDto entiteDto) { executerTransitionWithRefAndDate(Transition.INACTIF_APRES_TRANSITOIRE, Statut.INACTIF, entiteDto); } private void executerTransitionInactifApresActif(EntiteDto entiteDto) { executerTransitionWithRefAndDate(Transition.INACTIF_APRES_ACTIF, Statut.INACTIF, entiteDto); } private void executerTransitionWithRefAndDate(Transition transition, Statut statut, EntiteDto entiteDto) { verifieTransitionPossible(transition, entiteDto); Map<String, Object> args = new HashMap<>(); args.put("entity", entiteDto); args.put("transition", transition); Map<String, Object> arguments = new HashMap<String, Object>(); arguments.put("entity", entity); Executions.createComponents("/layout/popupStatutWithRefAndDate.zul", null, arguments); BindUtils.postGlobalCommand(null, null, "ouvrirPopupStatutWithRefAndDate", args); } private void verifieTransitionPossible(Transition transition, EntiteDto entiteDto) { if (entiteDto.getStatut() != transition.getStatutSource()) { throw new IllegalArgumentException("le passage de transition " + transition + " n'est pas autorisé depuis le statut " + entiteDto.getStatut()); } } /** * Transition générique simple * * @param transition * transition à passer * @param majEntitesEnfant * doit-on appliquer ou non le changement de statut sur les * enfants * @param entiteDto * : l'entité à mettre à jour * @return true si la transition est bien passé */ public boolean executerTransitionGeneric(Transition transition, boolean majEntitesEnfant, EntiteDto entiteDto) { verifieTransitionPossible(transition, entiteDto); if (this.organigrammeViewModel.organigrammeService.updateStatut(entiteDto, transition.getStatut(), majEntitesEnfant)) { // On recharge l'arbre complet d'ADS et on rafraichi le client. // Ainsi on est sur d'avoir une version bien à jour this.organigrammeViewModel.entiteDtoRoot = this.organigrammeViewModel.adsWSConsumer.getCurrentTreeWithVDNRoot(); // On force l'affichage du statut pour pouvoir voir cette entité // dans son nouvel état forcerAffichageStatut(transition); // On refresh si l'onglet est ouvert pour qu'il se mette à jour final Map<String, Object> mapEntite = new HashMap<String, Object>(); mapEntite.put("entity", entiteDto); BindUtils.postGlobalCommand(null, null, "refreshEntiteGlobalCommand", mapEntite); this.organigrammeViewModel.creeArbreEtRafraichiClient(); return true; } return false; } /** * Force le filtre pour que l'entité soit visible dans son nouveau statut et * affiche un message d'information * * @param transition * : la transition a executer */ private void forcerAffichageStatut(Transition transition) { if (transition.getStatut().equals(Statut.TRANSITOIRE)) { boolean filtreStatutTransitoireVisible = this.organigrammeViewModel.getSelectedFiltreStatut() != null && (this.organigrammeViewModel.getSelectedFiltreStatut().equals(FiltreStatut.ACTIF_TRANSITOIRE) || this.organigrammeViewModel.getSelectedFiltreStatut().equals(FiltreStatut.ACTIF_TRANSITOIRE_INACTIF) || this.organigrammeViewModel.getSelectedFiltreStatut().equals( FiltreStatut.TOUS)); if (!filtreStatutTransitoireVisible) { this.organigrammeViewModel.setSelectedFiltreStatut(FiltreStatut.ACTIF_TRANSITOIRE); Messagebox.show("Le filtre d'affichage a été changé pour vous permettre de visualiser l'entité en statut transitoire", "Information", Messagebox.OK, Messagebox.INFORMATION); } } if (transition.getStatut().equals(Statut.INACTIF)) { boolean filtreStatutInactifVisible = this.organigrammeViewModel.getSelectedFiltreStatut() != null && (this.organigrammeViewModel.getSelectedFiltreStatut().equals(FiltreStatut.ACTIF_TRANSITOIRE_INACTIF) || this.organigrammeViewModel.getSelectedFiltreStatut().equals( FiltreStatut.TOUS)); if (!filtreStatutInactifVisible) { this.organigrammeViewModel.setSelectedFiltreStatut(FiltreStatut.ACTIF_TRANSITOIRE_INACTIF); Messagebox.show("Le filtre d'affichage a été changé pour vous permettre de visualiser l'entité en statut inactif", "Information", Messagebox.OK, Messagebox.INFORMATION); } } } }