/*
*
* Copyright (c) 2013 - 2014 INT - National Institute of Technology & COPPE - Alberto Luiz Coimbra Institute
- Graduate School and Research in Engineering.
* See the file license.txt for copyright permission.
*
*/
package modelo;
import java.io.Serializable;
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.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
@NamedQueries(
{
@NamedQuery(name="PlanoModelo.recuperarPlPerModsPorPlanoModelo",
query = "select pl " +
"from PlanoModelo pl " +
"left outer join fetch pl.plPerMods " +
"where pl = ? "
),
@NamedQuery(name="PlanoModelo.recuperarPlanoModeloPorCodigoModeloECodigoCadPlan",
query = "select pl " +
"from PlanoModelo pl " +
"left outer join fetch pl.cadPlan cp " +
"left outer join fetch pl.modelo m " +
"where cp.codPlan = ? " +
"and m.codModelo = ? "
)
}
)
@Entity
@Table(name = "PLANOMODELO")
@SequenceGenerator(name = "SEQUENCIA", sequenceName = "SEQ_PLANOMODELO", allocationSize = 1)
public class PlanoModelo implements Serializable, Comparable<PlanoModelo> {
private static final long serialVersionUID = 1L;
public PlanoModelo(){
this.escorePlanPerModMin=0.0;
this.varEstqPercEscMin =0.0;
this.varProdDiaPercEscMin=0.0;
this.prodDiariaMediaPlanoModelo=0.0;
this.escore=0.0;
}
public PlanoModelo(CadPlan cadPlan, Modelo modelo){
this.cadPlan = cadPlan;
this.modelo = modelo;
}
/**
* identificador do registro planoModelo
*
*/
private Long id;
/**
* Define o escore resultante da avalia��o do plano para um determinado modelo.
* corresponde a media dos escores de cada periodo do modelo(plPerMods).
*/
private Double escore;
/**
* Informa se o modelo foi planejado ou n�o, caso tenha sido permite a implementa��o do plano.
* Funciona como um controle para o planejador, permitindo identificar os planos
* de que modelos ja foram analisados.
*/
private boolean modeloPlanejado;
/**
* Objeto que representa a classe Modelo de um determinado plano.
*/
private Modelo modelo;
/**
* Objeto que representa o cadPlan desse planoModelo
*/
private CadPlan cadPlan;
/**
* booleano que indica se o campo produ��o pode ser recalculado pelo algoritmo ("livre')
* ou se � "fixo", n�o pode ser recalculado automaticamente pelo algoritmo.
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Boolean flagProducaoModelOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Double indiceCobOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Double tamLoteOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Double trOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Double coberturaOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*/
private Double estqInicModelOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*
*/
private Double estqEmFaltaOriginal;
/**
* Este campo armazena o valor original da tabela modelo no momento em que foi gerado o plano.
* � util pois esse campo pode ser alterado na tabela de modelo mas nao sera alterado nos PlPerMod
* gerados anteriormente a essa altera��o.
*
*/
private Double recebimentoPendenteOriginal;
/**
* Menor escore dentre os escores obtidos para todos os periodos desse modelo nesse plano(plPerMod).
*/
private Double escorePlanPerModMin;
/**
* Variacao do estoque percentual relativa ao periodo de escore minimo, para esse plano x modelo.
*/
private Double varEstqPercEscMin;
/**
* Variacao percentual na producao diaria em lote relativa ao periodo de escore minimo, para esse plano x modelo.
*/
private Double varProdDiaPercEscMin;
private Double prodDiariaMediaPlanoModelo;
/**
* Objeto que representa os PlPerMods relacionado a um planoModelo.
*/
private Set<PlPerMod> plPerMods;
/**
* Vari�vel criada unica e exclusivamente para fins de exibicao em tela da cole��o de PlPerMods associada a
* entidade. ATEN��O: Esta vari�vel � exatamente uma C�PIA do Set declarado acima, por isso, este atributo n�o
* � persistido, ou seja, � declarado como transiente.
*
*@author wallanem figueiredo
*
*/
private transient List<PlPerMod> plPerModsList;
/**
* Objeto que representa os PlPerMods relacionado a um planoModelo.
*/
private List<ExcecaoMens> excecaoMenss;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCIA")
@Column(name = "ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Double getEscore() {
return escore;
}
public boolean isModeloPlanejado() {
return modeloPlanejado;
}
public void setEscore(Double escore) {
this.escore = escore;
}
public void setModeloPlanejado(boolean modeloPlanejado) {
this.modeloPlanejado = modeloPlanejado;
}
public void setModelo(Modelo modelo) {
this.modelo = modelo;
}
@ManyToOne
@JoinColumn(name="MODELO_ID", nullable = false)
public Modelo getModelo() {
return modelo;
}
public void setCadPlan(CadPlan cadPlan) {
this.cadPlan = cadPlan;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CADPLAN_ID", nullable = false)
public CadPlan getCadPlan() {
return cadPlan;
}
public Boolean getFlagProducaoModelOriginal() {
return flagProducaoModelOriginal;
}
public Double getIndiceCobOriginal() {
return indiceCobOriginal;
}
public Double getTamLoteOriginal() {
return tamLoteOriginal;
}
public Double getTrOriginal() {
return trOriginal;
}
public Double getCoberturaOriginal() {
return coberturaOriginal;
}
public Double getEstqInicModelOriginal() {
return estqInicModelOriginal;
}
public Double getRecebimentoPendenteOriginal() {
return recebimentoPendenteOriginal;
}
public void setRecebimentoPendenteOriginal(Double recebimentoPendenteOriginal) {
this.recebimentoPendenteOriginal = recebimentoPendenteOriginal;
}
public Double getEstqEmFaltaOriginal() {
return estqEmFaltaOriginal;
}
public void setEstqEmFaltaOriginal(Double estqEmFaltaOriginal) {
this.estqEmFaltaOriginal = estqEmFaltaOriginal;
}
public Double getEscorePlanPerModMin() {
return escorePlanPerModMin;
}
public void setEscorePlanPerModMin(Double escorePlanPerModMin) {
this.escorePlanPerModMin = escorePlanPerModMin;
}
public Double getVarEstqPercEscMin() {
return varEstqPercEscMin;
}
public void setVarEstqPercEscMin(Double varEstqPercEscMin) {
this.varEstqPercEscMin = varEstqPercEscMin;
}
public Double getVarProdDiaPercEscMin() {
return varProdDiaPercEscMin;
}
public void setVarProdDiaPercEscMin(Double varProdDiaPercEscMin) {
this.varProdDiaPercEscMin = varProdDiaPercEscMin;
}
public void setFlagProducaoModelOriginal(Boolean flagProducaoModelOriginal) {
this.flagProducaoModelOriginal = flagProducaoModelOriginal;
}
public void setIndiceCobOriginal(Double indiceCobOriginal) {
this.indiceCobOriginal = indiceCobOriginal;
}
public void setTamLoteOriginal(Double tamLoteOriginal) {
this.tamLoteOriginal = tamLoteOriginal;
}
public void setTrOriginal(Double trOriginal) {
this.trOriginal = trOriginal;
}
public void setCoberturaOriginal(Double coberturaOriginal) {
this.coberturaOriginal = coberturaOriginal;
}
public void setEstqInicModelOriginal(Double estqInicModelOriginal) {
this.estqInicModelOriginal = estqInicModelOriginal;
}
public void setPlPerMods(Set<PlPerMod> plPerMods) {
this.plPerMods = plPerMods;
}
@OneToMany(mappedBy="planoModelo", cascade={CascadeType.REMOVE, CascadeType.PERSIST})
public Set<PlPerMod> getPlPerMods() {
return plPerMods;
}
@OneToMany(mappedBy="planoModelo")
public List<ExcecaoMens> getExcecaoMenss() {
return excecaoMenss;
}
public void setExcecaoMenss(List<ExcecaoMens> excecaoMenss) {
this.excecaoMenss = excecaoMenss;
}
// ------------------------ M�todos get() e set() dos atributos transientes ------------------------
public void setPlPerModsList(List<PlPerMod> plPerModsList) {
this.plPerModsList = plPerModsList;
}
@Transient
public List<PlPerMod> getPlPerModsList() {
return plPerModsList;
}
public Double getProdDiariaMediaPlanoModelo() {
return prodDiariaMediaPlanoModelo;
}
public void setProdDiariaMediaPlanoModelo(Double prodDiariaMediaPlanoModelo) {
this.prodDiariaMediaPlanoModelo = prodDiariaMediaPlanoModelo;
}
/**
* Aqui, estamos dizendo que a Ordem Natural de Objetos, ou seja a ordem que sao inseridos em uma lista,
* do tipo 'PlanoModelo' deve se basear em como � implementada a ordem natural na classe 'Modelo' neste
* caso por codigo do modelo.
*
* @param PlanoModelo
* @return int
*/
@Override
public int compareTo(PlanoModelo o) {
return this.modelo.compareTo(o.getModelo());
}
/**
* Este m�todo poder ser gerado AUTOMATICAMENTE pelo Java , juntamente com o m�todo "equals(Object obj)".
* Eles S�o necess�rios para determinarmos um criterio de igualdade entre 2 objetos.
*
* Obs.: � primoridal dar aten��o para este detalhe, principalmente quando trabalhamos com Estruturas
* de Dados como Set.
*
* @return int
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cadPlan == null) ? 0 : cadPlan.hashCode());
result = prime * result + ((modelo == null) ? 0 : modelo.hashCode());
return result;
}
/**
*
* Este m�todo � gerado AUTOMATICAMENTE pelo Java , juntamente com o m�todo
* "hashCode()". Eles S�o necess�rios pois como o crit�rio principal de igualdade entre 2 objetos PlanoModelo � o campo
* 'cadPlan' exige que haja a implementa��o deste m�todo.
* Caso contr�rio, fica imposs�vel diferenciar 2 objetos do tipo PlanoModelo, e consequentemente temos a impress�o
* de que 'sumiram' registros, entre outros possiveis problemas.
*
* OBS: � PRIMORDIAL DAR ATEN��O PARA ESTE DETALHE (PRINCIPALMENTE QUANDO TRABALHARMOS COM ESTRUTURAS COMO 'Set')
*
* @author felipe.arruda
* @param Object
* @return int
*
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof PlanoModelo)) {
return false;
}
PlanoModelo other = (PlanoModelo) obj;
if (cadPlan == null) {
if (other.cadPlan != null) {
return false;
}
} else if (!cadPlan.equals(other.cadPlan)) {
return false;
}
if (modelo == null) {
if (other.modelo != null) {
return false;
}
} else if (!modelo.equals(other.modelo)) {
return false;
}
return true;
}
@Override
public String toString() {
return "PlanoModelo [cadPlan=" + cadPlan + ", modelo=" + modelo + "]";
}
}