/**
*
*/
package net.conselldemallorca.helium.core.model.hibernate;
import java.io.Serializable;
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.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.TableGenerator;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.persistence.UniqueConstraint;
import net.conselldemallorca.helium.core.common.TerminiStringUtil;
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 termini iniciat per a un expedient
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Entity
@Table( name="hel_termini_iniciat",
uniqueConstraints={@UniqueConstraint(columnNames={"termini_id", "process_instance_id"})})
@org.hibernate.annotations.Table(
appliesTo = "hel_termini_iniciat",
indexes = @Index(name = "hel_terminic_termini_i", columnNames = {"termini_id"}))
public class TerminiIniciat implements Serializable, GenericEntity<Long> {
public enum TerminiIniciatEstat {
NORMAL,
AVIS,
COMPLETAT_TEMPS,
CADUCAT,
COMPLETAT_FORA
}
private Long id;
@NotNull
private Date dataInici;
@NotNull
private Date dataFi;
private Date dataAturada;
private Date dataCancelacio;
private Date dataFiProrroga;
private Date dataCompletat;
private int diesAturat;
private int anys;
private int mesos;
private int dies;
@NotBlank
@MaxLength(255)
private String processInstanceId;
@MaxLength(1024)
private String timerIds;
private String taskInstanceId;
private boolean alertaPrevia;
private boolean alertaFinal;
private boolean alertaCompletat;
@NotNull
private Termini termini;
private Set<Alerta> alertes = new HashSet<Alerta>();
public TerminiIniciat() {}
public TerminiIniciat(Termini termini, String processInstanceId, Date dataInici, Date dataFi) {
this.termini = termini;
this.anys = termini.getAnys();
this.mesos = termini.getMesos();
this.dies = termini.getDies();
this.processInstanceId = processInstanceId;
this.dataInici = dataInici;
this.dataFi = dataFi;
}
public TerminiIniciat(Termini termini, int anys, int mesos, int dies, String processInstanceId, Date dataInici, Date dataFi) {
this.termini = termini;
this.anys = anys;
this.mesos = mesos;
this.dies = dies;
this.processInstanceId = processInstanceId;
this.dataInici = dataInici;
this.dataFi = dataFi;
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator="gen_termini_iniciat")
@TableGenerator(name="gen_termini_iniciat", 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="data_inici", nullable=false)
@Temporal(TemporalType.DATE)
public Date getDataInici() {
return dataInici;
}
public void setDataInici(Date dataInici) {
this.dataInici = dataInici;
}
@Column(name="data_fi", nullable=false)
@Temporal(TemporalType.DATE)
public Date getDataFi() {
return dataFi;
}
public void setDataFi(Date dataFi) {
this.dataFi = dataFi;
}
@Column(name="data_aturada")
@Temporal(TemporalType.DATE)
public Date getDataAturada() {
return dataAturada;
}
public void setDataAturada(Date dataAturada) {
this.dataAturada = dataAturada;
}
@Column(name="data_cancel")
@Temporal(TemporalType.DATE)
public Date getDataCancelacio() {
return dataCancelacio;
}
public void setDataCancelacio(Date dataCancelacio) {
this.dataCancelacio = dataCancelacio;
}
@Column(name="data_fi_prorroga")
@Temporal(TemporalType.DATE)
public Date getDataFiProrroga() {
return dataFiProrroga;
}
public void setDataFiProrroga(Date dataFiProrroga) {
this.dataFiProrroga = dataFiProrroga;
}
@Column(name="data_completat")
@Temporal(TemporalType.DATE)
public Date getDataCompletat() {
return dataCompletat;
}
public void setDataCompletat(Date dataCompletat) {
this.dataCompletat = dataCompletat;
}
@Column(name="dies_aturat")
public int getDiesAturat() {
return diesAturat;
}
public void setDiesAturat(int diesAturat) {
this.diesAturat = diesAturat;
}
@Column(name="anys")
public int getAnys() {
return anys;
}
public void setAnys(int anys) {
this.anys = anys;
}
@Column(name="mesos")
public int getMesos() {
return mesos;
}
public void setMesos(int mesos) {
this.mesos = mesos;
}
@Column(name="dies")
public int getDies() {
return dies;
}
public void setDies(int dies) {
this.dies = dies;
}
@Transient
public String getDurada() {
TerminiStringUtil tsu = new TerminiStringUtil(
anys,
mesos,
dies);
if (dies > 0)
return tsu.toString() + ((termini.isLaborable()) ? " laborables" : " naturals");
else
return tsu.toString();
}
@Column(name="process_instance_id", length=255, nullable=false)
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
@Column(name="timer_ids", length=1024)
public String getTimerIds() {
return timerIds;
}
public void setTimerIds(String timerIds) {
this.timerIds = timerIds;
}
@Column(name="task_instance_id", length=255)
public String getTaskInstanceId() {
return taskInstanceId;
}
public void setTaskInstanceId(String taskInstanceId) {
this.taskInstanceId = taskInstanceId;
}
@Column(name="alerta_previa")
public boolean isAlertaPrevia() {
return alertaPrevia;
}
public void setAlertaPrevia(boolean alertaPrevia) {
this.alertaPrevia = alertaPrevia;
}
@Column(name="alerta_final")
public boolean isAlertaFinal() {
return alertaFinal;
}
public void setAlertaFinal(boolean alertaFinal) {
this.alertaFinal = alertaFinal;
}
@Column(name="alerta_completat")
public boolean isAlertaCompletat() {
return alertaCompletat;
}
public void setAlertaCompletat(boolean alertaCompletat) {
this.alertaCompletat = alertaCompletat;
}
@ManyToOne(optional=false, fetch=FetchType.LAZY)
@JoinColumn(name="termini_id")
@ForeignKey(name="hel_termini_terminic_fk")
public Termini getTermini() {
return termini;
}
public void setTermini(Termini termini) {
this.termini = termini;
}
@OneToMany(mappedBy="terminiIniciat", 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);
}
@Transient
public int getNumDiesAturadaActual(Date data) {
if (getDataAturada() == null)
return 0;
long milisegonsUnDia = 1000 * 60 * 60 * 24;
long inici = getDataAturada().getTime();
long fi = data.getTime();
return new Long((fi - inici) / milisegonsUnDia).intValue();
}
@Transient
public Date getDataFiAmbAturadaActual() {
if (dataFiProrroga != null)
return dataFiProrroga;
if (dataFi == null)
return null;
Calendar cal = Calendar.getInstance();
cal.setTime(dataFi);
cal.add(Calendar.DAY_OF_MONTH, getNumDiesAturadaActual(new Date()));
return cal.getTime();
}
@Transient
public TerminiIniciatEstat getEstat() {
Date dataFi = getDataFiAmbAturadaActual();
if (dataCompletat != null) {
if (dataCompletat.before(dataFi))
return TerminiIniciatEstat.COMPLETAT_TEMPS;
return TerminiIniciatEstat.COMPLETAT_FORA;
}
Date ara = new Date();
if (ara.after(dataFi))
return TerminiIniciatEstat.CADUCAT;
if (termini.getDiesPrevisAvis() != null) {
Calendar cal = Calendar.getInstance();
cal.setTime(dataFi);
cal.add(Calendar.DAY_OF_MONTH, -termini.getDiesPrevisAvis().intValue());
if (ara.after(cal.getTime()))
return TerminiIniciatEstat.AVIS;
}
return TerminiIniciatEstat.NORMAL;
}
@Transient
public void afegirTimerId(long id) {
if (timerIds == null) {
timerIds = new Long(id).toString();
} else {
if (!timerIds.contains(new Long(id).toString()))
timerIds += "," + id;
}
}
@Transient
public void esborrarTimerId(long id) {
if (timerIds != null) {
timerIds.replaceAll(new Long(id).toString(), "");
timerIds.replaceAll(",,", ",");
}
}
@Transient
public long[] getTimerIdsArray() {
if (timerIds != null) {
List<Long> ids = new ArrayList<Long>();
for (String id: timerIds.split(",")) {
if (id.length() > 0)
ids.add(new Long(id));
}
long[] resposta = new long[ids.size()];
for (int i = 0; i < ids.size(); i++)
resposta[i] = ids.get(i).longValue();
return resposta;
}
return new long[0];
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime
* result
+ ((processInstanceId == null) ? 0 : processInstanceId
.hashCode());
result = prime * result + ((termini == null) ? 0 : termini.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;
TerminiIniciat other = (TerminiIniciat) obj;
if (processInstanceId == null) {
if (other.processInstanceId != null)
return false;
} else if (!processInstanceId.equals(other.processInstanceId))
return false;
if (termini == null) {
if (other.termini != null)
return false;
} else if (!termini.equals(other.termini))
return false;
return true;
}
private static final long serialVersionUID = 1L;
}