/** * */ package net.conselldemallorca.helium.core.model.hibernate; import java.io.Serializable; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.Lob; import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import javax.persistence.OrderBy; import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; import org.apache.commons.lang.StringEscapeUtils; import org.hibernate.annotations.ForeignKey; import org.hibernate.annotations.Index; import org.springmodules.validation.bean.conf.loader.annotation.handler.MaxLength; import org.springmodules.validation.bean.conf.loader.annotation.handler.NotBlank; import org.springmodules.validation.bean.conf.loader.annotation.handler.NotNull; /** * Objecte de domini que representa un expedient. * * @author Limit Tecnologies <limit@limit.es> */ @Entity @Table(name="hel_expedient") @org.hibernate.annotations.Table( appliesTo = "hel_expedient", indexes = { @Index(name = "hel_expedient_estat_i", columnNames = {"estat_id"}), @Index(name = "hel_expedient_entorn_i", columnNames = {"entorn_id"}), @Index(name = "hel_expedient_tipus_i", columnNames = {"tipus_id"})}) public class Expedient implements Serializable, GenericEntity<Long> { private static final String SEPARADOR_SISTRA = "#"; public enum IniciadorTipus { INTERN, SISTRA} private Long id; @NotBlank @MaxLength(255) private String processInstanceId; @MaxLength(255) private String titol; @MaxLength(64) private String numero; @MaxLength(64) private String numeroDefault; @NotNull private Date dataInici = new Date(); private Date dataFi; @MaxLength(255) private String comentari; @MaxLength(1024) private String infoAturat; @NotNull private IniciadorTipus iniciadorTipus; @MaxLength(64) private String iniciadorCodi; @MaxLength(64) private String responsableCodi; private boolean anulat; private String grupCodi; private String comentariAnulat; private Double geoPosX; private Double geoPosY; @MaxLength(64) private String geoReferencia; @MaxLength(64) private String registreNumero; private Date registreData; private Long unitatAdministrativa; private String idioma; private boolean autenticat; @MaxLength(16) protected String tramitadorNif; @MaxLength(255) protected String tramitadorNom; @MaxLength(16) protected String interessatNif; @MaxLength(255) protected String interessatNom; @MaxLength(16) protected String representantNif; @MaxLength(255) protected String representantNom; private boolean avisosHabilitats = false; @MaxLength(255) private String avisosEmail; @MaxLength(255) private String avisosMobil; private boolean notificacioTelematicaHabilitada = false; @MaxLength(255) private String tramitExpedientIdentificador; @MaxLength(255) private String tramitExpedientClau; @MaxLength(255) private String errorDesc; private String errorFull; private boolean errorsIntegracions; private Estat estat; @NotNull private ExpedientTipus tipus; @NotNull private Entorn entorn; private Set<Expedient> relacionsOrigen = new HashSet<Expedient>(); private Set<Expedient> relacionsDesti = new HashSet<Expedient>(); private Set<Alerta> alertes = new HashSet<Alerta>(); private List<ExpedientLog> logs = new ArrayList<ExpedientLog>(); private List<Portasignatures> portasignatures = new ArrayList<Portasignatures>(); private boolean ambRetroaccio; private Date reindexarData; private boolean reindexarError; public Expedient() {} public Expedient(IniciadorTipus iniciadorTipus, String iniciadorCodi, ExpedientTipus tipus, Entorn entorn, String processInstanceId) { this.iniciadorTipus = iniciadorTipus; this.iniciadorCodi = iniciadorCodi; this.tipus = tipus; this.entorn = entorn; this.processInstanceId = processInstanceId; } @Id @GeneratedValue(strategy = GenerationType.TABLE, generator="gen_expedient") @TableGenerator(name="gen_expedient", table="hel_idgen", pkColumnName="taula", valueColumnName="valor") @Column(name="id") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="process_instance_id", length=255, nullable=false, unique=true) public String getProcessInstanceId() { return processInstanceId; } public void setProcessInstanceId(String processInstanceId) { this.processInstanceId = processInstanceId; } @Column(name="titol", length=255, nullable=true) public String getTitol() { return titol; } public void setTitol(String titol) { this.titol = titol; } @Column(name="numero", length=64, nullable=true) public String getNumero() { return numero; } public void setNumero(String numero) { this.numero = numero; } @Column(name="numero_default", length=64) public String getNumeroDefault() { return numeroDefault; } public void setNumeroDefault(String numeroDefault) { this.numeroDefault = numeroDefault; } @Column(name="data_inici", nullable=false) public Date getDataInici() { return dataInici; } public void setDataInici(Date dataInici) { this.dataInici = dataInici; } @Column(name="data_fi", nullable=true) public Date getDataFi() { return dataFi; } public void setDataFi(Date dataFi) { this.dataFi = dataFi; } @Column(name="comentari", length=255, nullable=true) public String getComentari() { return comentari; } public void setComentari(String comentari) { this.comentari = comentari; } @Column(name="info_aturat", length=1024, nullable=true) public String getInfoAturat() { return infoAturat; } public void setInfoAturat(String infoAturat) { this.infoAturat = infoAturat; } @Column(name="iniciador_tipus") public IniciadorTipus getIniciadorTipus() { return iniciadorTipus; } public void setIniciadorTipus(IniciadorTipus iniciadorTipus) { this.iniciadorTipus = iniciadorTipus; } @Column(name="iniciador_codi", length=64) public String getIniciadorCodi() { return iniciadorCodi; } public void setIniciadorCodi(String iniciadorCodi) { this.iniciadorCodi = iniciadorCodi; } @Column(name="responsable_codi", length=64) public String getResponsableCodi() { return responsableCodi; } public void setResponsableCodi(String responsableCodi) { this.responsableCodi = responsableCodi; } @Column(name="anulat") public boolean isAnulat() { return anulat; } public void setAnulat(boolean anulat) { this.anulat = anulat; } @Column(name="grup_codi", length=64) public String getGrupCodi() { return grupCodi; } public void setGrupCodi(String grupCodi) { this.grupCodi = grupCodi; } @Column(name="geo_posx") public Double getGeoPosX() { return geoPosX; } public void setGeoPosX(Double geoPosX) { this.geoPosX = geoPosX; } @Column(name="geo_posy") public Double getGeoPosY() { return geoPosY; } public void setGeoPosY(Double geoPosY) { this.geoPosY = geoPosY; } @Column(name="geo_referencia", length=64) public String getGeoReferencia() { return geoReferencia; } public void setGeoReferencia(String geoReferencia) { this.geoReferencia = geoReferencia; } @Column(name="registre_num", length=64) public String getRegistreNumero() { return registreNumero; } public void setRegistreNumero(String registreNumero) { this.registreNumero = registreNumero; } @Column(name="registre_data") @Temporal(TemporalType.TIMESTAMP) public Date getRegistreData() { return registreData; } public void setRegistreData(Date registreData) { this.registreData = registreData; } @Column(name="unitat_adm") public Long getUnitatAdministrativa() { return unitatAdministrativa; } public void setUnitatAdministrativa(Long unitatAdministrativa) { this.unitatAdministrativa = unitatAdministrativa; } @Column(name="idioma", length=8) public String getIdioma() { return idioma; } public void setIdioma(String idioma) { this.idioma = idioma; } @Column(name="autenticat") public boolean isAutenticat() { return autenticat; } public void setAutenticat(boolean autenticat) { this.autenticat = autenticat; } @Column(name="tramitador_nif", length=16) public String getTramitadorNif() { return tramitadorNif; } public void setTramitadorNif(String tramitadorNif) { this.tramitadorNif = tramitadorNif; } @Column(name="tramitador_nom", length=255) public String getTramitadorNom() { return tramitadorNom; } public void setTramitadorNom(String tramitadorNom) { this.tramitadorNom = tramitadorNom; } @Column(name="interessat_nif", length=16) public String getInteressatNif() { return interessatNif; } public void setInteressatNif(String interessatNif) { this.interessatNif = interessatNif; } @Column(name="interessat_nom", length=255) public String getInteressatNom() { return interessatNom; } public void setInteressatNom(String interessatNom) { this.interessatNom = interessatNom; } @Column(name="representant_nif", length=16) public String getRepresentantNif() { return representantNif; } public void setRepresentantNif(String representantNif) { this.representantNif = representantNif; } @Column(name="representant_nom", length=255) public String getRepresentantNom() { return representantNom; } public void setRepresentantNom(String representantNom) { this.representantNom = representantNom; } @Column(name="avisos_habilitat") public boolean isAvisosHabilitats() { return avisosHabilitats; } public void setAvisosHabilitats(boolean avisosHabilitats) { this.avisosHabilitats = avisosHabilitats; } @Column(name="avisos_email", length=255) public String getAvisosEmail() { return avisosEmail; } public void setAvisosEmail(String avisosEmail) { this.avisosEmail = avisosEmail; } @Column(name="avisos_mobil", length=255) public String getAvisosMobil() { return avisosMobil; } public void setAvisosMobil(String avisosMobil) { this.avisosMobil = avisosMobil; } @Column(name="nottel_habilitat") public boolean isNotificacioTelematicaHabilitada() { return notificacioTelematicaHabilitada; } public void setNotificacioTelematicaHabilitada( boolean notificacioTelematicaHabilitada) { this.notificacioTelematicaHabilitada = notificacioTelematicaHabilitada; } @Column(name="tramexp_id", length=255) public String getTramitExpedientIdentificador() { return tramitExpedientIdentificador; } public void setTramitExpedientIdentificador(String tramitExpedientIdentificador) { this.tramitExpedientIdentificador = tramitExpedientIdentificador; } @Column(name="tramexp_clau", length=255) public String getTramitExpedientClau() { return tramitExpedientClau; } public void setTramitExpedientClau(String tramitExpedientClau) { this.tramitExpedientClau = tramitExpedientClau; } @Column(name="errors_integs") public boolean isErrorsIntegracions() { return errorsIntegracions; } public void setErrorsIntegracions(boolean errorsIntegracions) { this.errorsIntegracions = errorsIntegracions; } @Column(name="error_desc") public String getErrorDesc() { return errorDesc; } public void setErrorDesc(String errorDesc) { this.errorDesc = errorDesc; } @Lob @Column(name="error_full") public String getErrorFull() { return errorFull; } public void setErrorFull(String errorFull) { this.errorFull = errorFull; } @ManyToOne(optional=true) @JoinColumn(name="estat_id") @ForeignKey(name="hel_estat_expedient_fk") public Estat getEstat() { return estat; } public void setEstat(Estat estat) { this.estat = estat; } @ManyToOne(optional=false) @JoinColumn(name="tipus_id") @ForeignKey(name="hel_exptipus_expedient_fk") public ExpedientTipus getTipus() { return tipus; } public void setTipus(ExpedientTipus tipus) { this.tipus = tipus; } @ManyToOne(optional=false) @JoinColumn(name="entorn_id") @ForeignKey(name="hel_entorn_expedient_fk") public Entorn getEntorn() { return entorn; } public void setEntorn(Entorn entorn) { this.entorn = entorn; } @ManyToMany() @JoinTable( name="hel_expedient_rels", joinColumns=@JoinColumn(name="origen_id", referencedColumnName="id"), inverseJoinColumns=@JoinColumn(name="desti_id", referencedColumnName="id") ) @ForeignKey(name="hel_origen_exprel_fk", inverseName="hel_desti_exprel_fk") public Set<Expedient> getRelacionsOrigen() { return this.relacionsOrigen; } public void setRelacionsOrigen(Set<Expedient> relacionsOrigen) { this.relacionsOrigen = relacionsOrigen; } public void addRelacioOrigen(Expedient relacionat) { getRelacionsOrigen().add(relacionat); } public void removeRelacioOrigen(Expedient relacionat) { getRelacionsOrigen().remove(relacionat); } @ManyToMany(mappedBy="relacionsOrigen") public Set<Expedient> getRelacionsDesti() { return this.relacionsDesti; } public void setRelacionsDesti(Set<Expedient> relacionsDesti) { this.relacionsDesti = relacionsDesti; } public void addRelacioDesti(Expedient relacionat) { getRelacionsDesti().add(relacionat); } public void removeRelacioDesti(Expedient relacionat) { getRelacionsDesti().remove(relacionat); } @OneToMany(mappedBy="expedient", cascade=CascadeType.REMOVE) public Set<Alerta> getAlertes() { return this.alertes; } public void setAlertes(Set<Alerta> alertes) { this.alertes = alertes; } public void addAlerta(Alerta alerta) { getAlertes().add(alerta); } public void removeAlerta(Alerta alerta) { getAlertes().remove(alerta); } @OneToMany(mappedBy="expedient", cascade={CascadeType.ALL}) @OrderBy("data asc, id asc") public List<ExpedientLog> getLogs() { return logs; } public void setLogs(List<ExpedientLog> logs) { this.logs = logs; } public void addLogs(ExpedientLog logs) { getLogs().add(logs); } public void removeLogs(ExpedientLog logs) { getLogs().remove(logs); } @OneToMany(mappedBy="expedient", cascade={CascadeType.ALL}) @OrderBy("dataEnviat asc") public List<Portasignatures> getPortasignatures() { return portasignatures; } public void setPortasignatures(List<Portasignatures> portasignatures) { this.portasignatures = portasignatures; } public void addPortasignatures(Portasignatures portasignatures) { getPortasignatures().add(portasignatures); } public void removePortasignatures(Portasignatures portasignatures) { getPortasignatures().remove(portasignatures); } @Column(name="amb_retroaccio") public boolean isAmbRetroaccio() { return ambRetroaccio; } public void setAmbRetroaccio(boolean ambRetroaccio) { this.ambRetroaccio = ambRetroaccio; } @Column(name="reindexar_data", nullable=true) public Date getReindexarData() { return reindexarData; } public void setReindexarData(Date reindexarData) { this.reindexarData = reindexarData; } @Column(name="reindexar_error") public boolean isReindexarError() { return reindexarError; } public void setReindexarError(boolean reindexarError) { this.reindexarError = reindexarError; } @Transient public String getNumeroIdentificador() { if (tipus.getTeNumero().booleanValue()) return getNumero(); return this.getNumeroDefault(); } @Transient public String getIdentificador() { String identificador = null; if (tipus.getTeNumero().booleanValue() && tipus.getTeTitol().booleanValue()) identificador = "[" + getNumero() + "] " + getTitol(); else if (tipus.getTeNumero().booleanValue() && !tipus.getTeTitol().booleanValue()) identificador = getNumero(); else if (!tipus.getTeNumero().booleanValue() && tipus.getTeTitol().booleanValue()) identificador = getTitol(); if (identificador == null || "[null] null".equals(identificador)) return this.getNumeroDefault(); else return identificador; } @Transient public String getIdentificadorOrdenacio() { if (!tipus.getTeNumero().booleanValue() && tipus.getTeTitol().booleanValue()) { return getIdentificador(); } else { Calendar cal = Calendar.getInstance(); cal.setTime(dataInici); int anyInici = cal.get(Calendar.YEAR); return new Integer(anyInici).toString() + new DecimalFormat("0000000000000000000").format(id); } } @Transient public String getIdentificadorLimitat() { if (getIdentificador() != null && getIdentificador().length() > 100) return StringEscapeUtils.escapeHtml(getIdentificador().substring(0, 100) + " (...)"); else return StringEscapeUtils.escapeHtml(getIdentificador()); } @Transient public String getNumeroEntradaSistra() { if (iniciadorTipus.equals(IniciadorTipus.SISTRA)) { return iniciadorCodi.split(SEPARADOR_SISTRA)[0]; } return null; } @Transient public String getClaveAccesoSistra() { if (iniciadorTipus.equals(IniciadorTipus.SISTRA)) { return iniciadorCodi.split(SEPARADOR_SISTRA)[1]; } return null; } @Transient public static String crearIniciadorCodiPerSistra(String numeroEntrada, String claveAcceso) { return numeroEntrada + SEPARADOR_SISTRA + claveAcceso; } @Transient public boolean isAturat() { return infoAturat != null; } public String getComentariAnulat() { return comentariAnulat; } public void setComentariAnulat(String comentariAnulat) { this.comentariAnulat = comentariAnulat; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((processInstanceId == null) ? 0 : processInstanceId .hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Expedient other = (Expedient) obj; if (processInstanceId == null) { if (other.processInstanceId != null) return false; } else if (!processInstanceId.equals(other.processInstanceId)) return false; return true; } private static final long serialVersionUID = 1L; }