package nc.noumea.mairie.organigramme.dto; /* * #%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.util.ArrayList; import java.util.Date; import java.util.List; import javax.persistence.Column; import javax.xml.bind.annotation.XmlRootElement; import nc.noumea.mairie.organigramme.core.dto.AbstractEntityDto; import nc.noumea.mairie.organigramme.core.utility.JsonDateDeserializer; import nc.noumea.mairie.organigramme.core.utility.JsonDateSerializer; import nc.noumea.mairie.organigramme.core.utility.MessageErreur; import nc.noumea.mairie.organigramme.enums.Statut; import nc.noumea.mairie.organigramme.enums.Transition; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.WordUtils; import org.codehaus.jackson.map.annotate.JsonDeserialize; import org.codehaus.jackson.map.annotate.JsonSerialize; import org.springframework.util.CollectionUtils; import flexjson.JSON; @XmlRootElement public class EntiteDto extends AbstractEntityDto { private Integer idEntite; @Column(length = 8) private String sigle; private String label; @Column(length = 60) private String labelCourt; @Column(length = 4000) private String commentaire; private TypeEntiteDto typeEntite; private String codeServi; private List<EntiteDto> enfants; private EntiteDto entiteParent; private EntiteDto entiteRemplacee; private EntiteDto entiteDirection; private Integer idStatut; private Integer idAgentCreation; @JsonSerialize(using = JsonDateSerializer.class) @JsonDeserialize(using = JsonDateDeserializer.class) private Date dateCreation; private Integer idAgentModification; @JsonSerialize(using = JsonDateSerializer.class) @JsonDeserialize(using = JsonDateDeserializer.class) private Date dateModification; private String refDeliberationActif; @JsonSerialize(using = JsonDateSerializer.class) @JsonDeserialize(using = JsonDateDeserializer.class) private Date dateDeliberationActif; private String refDeliberationInactif; @JsonSerialize(using = JsonDateSerializer.class) @JsonDeserialize(using = JsonDateDeserializer.class) private Date dateDeliberationInactif; @Column(length = 10) private String nfa; private boolean entiteAs400; private Integer idAgentSuppression; private boolean dirty = false; public EntiteDto() { enfants = new ArrayList<>(); } public EntiteDto(EntiteDto entite) { mapEntite(entite); for (EntiteDto n : entite.getEnfants()) { this.enfants.add(new EntiteDto(n)); } } public EntiteDto mapEntite(EntiteDto entite) { this.idEntite = entite.getIdEntite(); this.sigle = entite.getSigle(); this.label = entite.getLabel(); this.labelCourt = entite.getLabelCourt(); this.typeEntite = entite.getTypeEntite(); this.codeServi = entite.getCodeServi(); this.enfants = new ArrayList<>(); this.entiteParent = null == entite.getEntiteParent() ? null : new EntiteDto(entite.getEntiteParent()); this.entiteRemplacee = null == entite.getEntiteRemplacee() ? null : new EntiteDto(entite.getEntiteRemplacee()); this.idStatut = entite.getIdStatut(); this.idAgentCreation = entite.getIdAgentCreation(); this.dateCreation = entite.getDateCreation(); this.idAgentModification = entite.getIdAgentModification(); this.dateModification = entite.getDateModification(); this.refDeliberationActif = entite.getRefDeliberationActif(); this.dateDeliberationActif = entite.getDateDeliberationActif(); this.refDeliberationInactif = entite.getRefDeliberationInactif(); this.dateDeliberationInactif = entite.getDateDeliberationInactif(); this.commentaire = entite.getCommentaire(); this.nfa = entite.getNfa(); this.entiteAs400 = entite.isEntiteAs400(); return this; } public boolean isEntiteAs400() { return entiteAs400; } public void setEntiteAs400(boolean entiteAs400) { this.entiteAs400 = entiteAs400; } public Integer getIdEntite() { return idEntite; } public void setIdEntite(Integer idEntite) { this.idEntite = idEntite; } public String getSigle() { return sigle; } public void setSigle(String sigle) { this.sigle = sigle; } public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @JSON(include = false) public String getLabelAffichageExportYed() { return WordUtils.wrap(label, 25); } public String getLabelCourt() { return labelCourt; } public void setLabelCourt(String labelCourt) { this.labelCourt = labelCourt; } public TypeEntiteDto getTypeEntite() { return typeEntite; } public void setTypeEntite(TypeEntiteDto typeEntite) { this.typeEntite = typeEntite; } public EntiteDto getEntiteParent() { return entiteParent; } public void setEntiteParent(EntiteDto entiteParent) { this.entiteParent = entiteParent; } public EntiteDto getEntiteRemplacee() { return entiteRemplacee; } public void setEntiteRemplacee(EntiteDto entiteRemplacee) { this.entiteRemplacee = entiteRemplacee; } public Integer getIdStatut() { return idStatut; } public void setIdStatut(Integer idStatut) { this.idStatut = idStatut; } public String getCodeServi() { return codeServi; } public void setCodeServi(String codeServi) { this.codeServi = codeServi; } public List<EntiteDto> getEnfants() { return enfants; } public void setEnfants(List<EntiteDto> enfants) { this.enfants = enfants; } public Integer getIdAgentCreation() { return idAgentCreation; } public void setIdAgentCreation(Integer idAgentCreation) { this.idAgentCreation = idAgentCreation; } public Date getDateCreation() { return dateCreation; } public void setDateCreation(Date dateCreation) { this.dateCreation = dateCreation; } public Integer getIdAgentModification() { return idAgentModification; } public void setIdAgentModification(Integer idAgentModification) { this.idAgentModification = idAgentModification; } public Date getDateModification() { return dateModification; } public void setDateModification(Date dateModification) { this.dateModification = dateModification; } public String getRefDeliberationActif() { return refDeliberationActif; } public void setRefDeliberationActif(String refDeliberationActif) { this.refDeliberationActif = refDeliberationActif; } public Date getDateDeliberationActif() { return dateDeliberationActif; } public void setDateDeliberationActif(Date dateDeliberationActif) { this.dateDeliberationActif = dateDeliberationActif; } public String getRefDeliberationInactif() { return refDeliberationInactif; } public void setRefDeliberationInactif(String refDeliberationInactif) { this.refDeliberationInactif = refDeliberationInactif; } public Date getDateDeliberationInactif() { return dateDeliberationInactif; } public void setDateDeliberationInactif(Date dateDeliberationInactif) { this.dateDeliberationInactif = dateDeliberationInactif; } public String getNfa() { return nfa; } public void setNfa(String nfa) { this.nfa = nfa; } @JSON(include = false) public String getIdLi() { if (this.getId() == null) { return null; } return "entite-id-" + this.getId().toString(); } @JSON(include = false) public Integer getIdAgentSuppression() { return idAgentSuppression; } public void setIdAgentSuppression(Integer idAgentSuppression) { this.idAgentSuppression = idAgentSuppression; } @JSON(include = false) public Statut getStatut() { if (this.getIdStatut() == null) { return null; } return Statut.getStatutById(this.getIdStatut()); } public String getCommentaire() { return commentaire; } public void setCommentaire(String commentaire) { this.commentaire = commentaire; } @JSON(include = false) public EntiteDto getEntiteDirection() { return entiteDirection; } public void setEntiteDirection(EntiteDto entiteDirection) { this.entiteDirection = entiteDirection; } @Override @JSON(include = false) public String getLibelleCourt() { return getSigleWithLibelleStatutAndDirection(); } @Override @JSON(include = false) public Long getId() { if (this.getIdEntite() == null) { return null; } return new Long(this.getIdEntite().toString()); } @Override @JSON(include = false) public Integer getVersion() { return null; } @JSON(include = false) public boolean isDirty() { return dirty; } public void setDirty(boolean dirty) { this.dirty = dirty; } @Override public List<MessageErreur> construitListeMessageErreur() { List<MessageErreur> result = super.construitListeMessageErreur(); if (StringUtils.isBlank(this.getSigle())) { result.add(new MessageErreur("Le sigle est obligatoire")); } if (StringUtils.isBlank(this.getLabel())) { result.add(new MessageErreur("Le libellé est obligatoire")); } if (StringUtils.isBlank(this.getLabelCourt())) { result.add(new MessageErreur("Le libellé court est obligatoire")); } if (this.getTypeEntite() == null) { result.add(new MessageErreur("Le type est obligatoire")); } return result; } public boolean hasChildren() { return !CollectionUtils.isEmpty(this.getEnfants()); } /** * @return la liste des transitions autorisées pour cette entité, en tenant * compte du statut courant de l'entité et de règles de gestion, ne * retourne jamais null. */ @JSON(include = false) public List<Transition> getListeTransitionAutorise() { // construit la liste de toutes les transitions possibles depuis le // statut source List<Transition> listeTransition = new ArrayList<>(); if (this.getStatut() == null) { return listeTransition; } for (Transition transition : Transition.values()) { boolean transitionDepuisStatutCourant = this.getStatut().equals(transition.getStatutSource()); if (transitionDepuisStatutCourant) { boolean statutParentNotPrevisionOrInactif = this.getEntiteParent() != null && this.getEntiteParent().getStatut() != Statut.PREVISION && this.getEntiteParent().getStatut() != Statut.INACTIF; if (statutParentNotPrevisionOrInactif) { if (transition.getStatut() == Statut.ACTIF) { listeTransition.add(transition); } else if (transition.getStatut() == Statut.INACTIF) { // tous les noeuds descendants doivent être inactifs List<Statut> listeStatut = new ArrayList<Statut>(); listeStatut.add(Statut.INACTIF); if (tousEnfantEnStatut(listeStatut, this.getEnfants())) { listeTransition.add(transition); } } else if (transition.getStatut() == Statut.TRANSITOIRE) { // tous les noeuds descendants doivent être transitoire // ou inactifs List<Statut> listeStatut = new ArrayList<Statut>(); listeStatut.add(Statut.TRANSITOIRE); listeStatut.add(Statut.INACTIF); if (tousEnfantEnStatut(listeStatut, this.getEnfants())) { listeTransition.add(transition); } } } } } return listeTransition; } /** * Teste si tous les enfants sont obligatoirement dans les statuts passés en * paramètre * * @param listeStatut * : la liste des statuts qu'on souhaite tester * @param listeEnfant * : la liste des enfants pour le recursif * @return true si tous les enfants sont dans ces statuts, false sinon */ public boolean tousEnfantEnStatut(List<Statut> listeStatut, List<EntiteDto> listeEnfant) { return tousEnfantEnStatutRecursive(listeStatut, listeEnfant, true); } private boolean tousEnfantEnStatutRecursive(List<Statut> listeStatut, List<EntiteDto> listeEnfant, boolean result) { if (!result) { return false; } else { for (EntiteDto entiteDto : listeEnfant) { if (!listeStatut.contains(entiteDto.getStatut())) { result = false; } } for (EntiteDto entiteDto : listeEnfant) { return tousEnfantEnStatutRecursive(listeStatut, entiteDto.getEnfants(), result); } return true; } } /** * @param nouveauStatut * nouveau statut du projet * @return true si le statut a vraiment changé */ public boolean updateStatut(Statut nouveauStatut) { if (nouveauStatut == null) { return false; // ne devrait pas arriver } if (!this.getStatut().equals(nouveauStatut)) { this.idStatut = nouveauStatut.getIdStatut(); return true; } return false; } @JSON(include = false) public boolean isActif() { return this.getStatut() != null && this.getStatut() == Statut.ACTIF; } @JSON(include = false) public boolean isTransitoire() { return this.getStatut() != null && this.getStatut() == Statut.TRANSITOIRE; } @JSON(include = false) public boolean isPrevision() { return this.getStatut() != null && this.getStatut() == Statut.PREVISION; } @JSON(include = false) public boolean isTransitoireOuInactif() { return this.getStatut() != null && (this.getStatut() == Statut.TRANSITOIRE || this.getStatut() == Statut.INACTIF); } @JSON(include = false) public boolean isInactif() { return this.getStatut() != null && this.getStatut() == Statut.INACTIF; } @JSON(include = false) public boolean isFeuille() { return CollectionUtils.isEmpty(this.getEnfants()); } @JSON(include = false) public String getSigleWithLibelleStatutAndDirection() { boolean sigleEtDirectionEgaux = entiteDirection != null && entiteDirection.getSigle().equals(this.sigle); String directionEtSigle = ""; if (sigleEtDirectionEgaux) { directionEtSigle = this.sigle; } else { directionEtSigle = (entiteDirection != null ? entiteDirection.getSigle() + " > " : "") + this.sigle; } if (this.getStatut() != null && this.getStatut() != Statut.ACTIF) { return directionEtSigle + " (" + this.getStatut().getLibelle() + ")"; } return directionEtSigle; } @JSON(include = false) public String getSigleEntiteRemplace() { return this.entiteRemplacee != null ? this.entiteRemplacee.getSigle() : ""; } @JSON(include = false) public String getLibelleTypeEntite() { return this.typeEntite != null ? this.typeEntite.getLabel() : ""; } @Override public String toString() { return this.getSigle(); } }