/*
*
* 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.text.Collator;
import java.util.Comparator;
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.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
@NamedQueries(
{
@NamedQuery(name="CadPlan.recuperaCadPlanPorCodigo",
query = "select cadplan " +
"from CadPlan cadPlan " +
"where cadPlan.codPlan = ? "
),
@NamedQuery(name="CadPlan.recuperaListaDeCadPlan",
query = "select cadPlan " +
"from CadPlan cadPlan " +
"order by cadPlan.codPlan "
),
@NamedQuery(name="CadPlan.recuperaListaDeCadPlanPorUsuario",
query = "select cadPlan " +
"from CadPlan cadPlan " +
"where cadPlan.usuario = ? " +
"order by cadPlan.codPlan "
),
@NamedQuery(name="CadPlan.recuperaListaDeCadPlanPorModelagemFuzzy",
query = "select cadPlan " +
"from CadPlan cadPlan " +
"where cadPlan.modelagemFuzzy = ? "
),
@NamedQuery(name="CadPlan.recuperaCadPlanComPlanosModelo",
query = "select c from CadPlan c " +
"left outer join fetch c.planosModelo pl " +
"where c.codPlan = ? "
),
@NamedQuery(name="CadPlan.recuperaCadPlanApenasComPlanosModelo",
query = "select c from CadPlan c " +
"left outer join fetch c.planosModelo pl " +
"where c.codPlan = ? "
)
}
)
@Entity
@Table(name = "CadPlan")
@SequenceGenerator(name = "SEQUENCIA", sequenceName = "SEQ_CADPLAN", allocationSize = 1)
public class CadPlan implements Serializable, Comparable<CadPlan> {
private static final long serialVersionUID = 1L;
public CadPlan() {
this.escoreMin = 0.0;
this.escoreModeloEscMinimo = 0.0;
this.escoreMedio = 0.0;
this.varEstqPer = 0.0;
this.varProdDiaPer = 0.0;
this.ranking = 0.0;
this.escoreCalculado=false;
}
/**
* Identificador do cadastro de planos
*/
private Long id;
/**
* Codigo do Plano Mestre de Producao
*/
private String codPlan;
/**
* Descri��o do PMP
*/
private String descrPlan;
/**
* Valor do Escore minimo obtido pelo plano para um determinado
* modelo em algum periodo de seu HP
*/
private Double escoreMin;
/**
* Valor do escore medio obtido pelo plano, considerando
* todos seus modelos
*/
private Double escoreMedio;
/**
* Valor do escore do modelo de escore minimo.
* (menor nota de todos os modelos)
*/
private Double escoreModeloEscMinimo;
/**
* Variacao percentual em relacao ao Estoque Desejado para
* um determinado modelo x periodo relativa ao EscoreMin
*/
private Double varEstqPer;
/**
* Variacao percentual em relacao a ProdDiariaMedia daquela
* combinacao modelo x plano
*/
private Double varProdDiaPer;
/**
* Ranking obtido pelo plano.
* Varia no intervalo [1...numeroDePlanos]
*/
private Double ranking;
/**
* Se o escore foi calculado para esse plano.
*/
private boolean escoreCalculado;
/**
* Usuario responsavel por este Plano.
*/
private Usuario usuario;
/**
* Modelagem fuzzy sendo usada neste plano.
*/
private ModelagemFuzzy modelagemFuzzy;
/**
* Objeto que referencia a classe que faz a rela��o entre o Plano e o Modelo
*/
private Set<PlanoModelo> planosModelo;
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCIA")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Column(unique=true)
public String getCodPlan() {
return codPlan;
}
public void setCodPlan(String codPlan) {
this.codPlan = codPlan;
}
@ManyToOne
@JoinColumn(name="USUARIO_ID", nullable=false)
public Usuario getUsuario() {
return usuario;
}
public void setUsuario(Usuario usuario) {
this.usuario = usuario;
}
@ManyToOne
@JoinColumn(name="MODELAGEMFUZZY_ID", nullable=true)
public ModelagemFuzzy getModelagemFuzzy() {
return modelagemFuzzy;
}
public void setModelagemFuzzy(ModelagemFuzzy modelagemFuzzy) {
this.modelagemFuzzy = modelagemFuzzy;
}
public String getDescrPlan() {
return descrPlan;
}
public Double getEscoreMin() {
return escoreMin;
}
public Double getEscoreMedio() {
return escoreMedio;
}
public Double getEscoreModeloEscMinimo() {
return escoreModeloEscMinimo;
}
public Double getVarEstqPer() {
return varEstqPer;
}
public Double getVarProdDiaPer() {
return varProdDiaPer;
}
public Double getRanking() {
return ranking;
}
@OneToMany(mappedBy="cadPlan", cascade={CascadeType.REMOVE, CascadeType.PERSIST})
public Set<PlanoModelo> getPlanosModelo() {
return planosModelo;
}
public void setDescrPlan(String descrPlan) {
this.descrPlan = descrPlan;
}
public void setEscoreMin(Double escoreMin) {
this.escoreMin = escoreMin;
}
public void setEscoreMedio(Double escoreMedio) {
this.escoreMedio = escoreMedio;
}
public void setEscoreModeloEscMinimo(Double escoreModeloEscMinimo) {
this.escoreModeloEscMinimo = escoreModeloEscMinimo;
}
public void setVarEstqPer(Double varEstqPer) {
this.varEstqPer = varEstqPer;
}
public void setVarProdDiaPer(Double varProdDiaPer) {
this.varProdDiaPer = varProdDiaPer;
}
public void setRanking(Double ranking) {
this.ranking = ranking;
}
public void setPlanosModelo(Set<PlanoModelo> planosModelo) {
this.planosModelo = planosModelo;
}
public boolean getEscoreCalculado() {
return escoreCalculado;
}
public void setEscoreCalculado(boolean escoreCalculado) {
this.escoreCalculado = escoreCalculado;
}
/**
*
* Este m�todo consiste em definir o crit�rio de ordena��o entre 2 objetos CadPlan, que deve estar
* associado a um de seus atributos. No nosso caso, o atributo em quest�o � o 'codPlan', que � do tipo
* nativo 'String', que sabe internamente se auto-ordenar, gra�as a implementa��o da API Java que o realiza.
*
* @author walanem.junior
* @param CadPlan
* @return int
*
*/
@Override
public int compareTo(CadPlan o) {
return Collator.getInstance().compare(codPlan, o.codPlan);
}
public String toString() {
return this.codPlan + " - " + this.descrPlan;
}
/**
* 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
*/
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((codPlan == null) ? 0 : codPlan.hashCode());
result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
return result;
}
/**
*
* Como o crit�rio principal de igualdade entre 2 objetos CadPlan � o campo
* 'codPlan' que, por ser do tipo String, tamb�m representa uma classe, exige que haja a implementa��o deste m�todo.
* Caso contr�rio, fica imposs�vel diferenciar 2 objetos do tipo CadPlan, 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 walanem.junior
* @param Object
* @return boolean
*
*/
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof CadPlan)) {
return false;
}
CadPlan other = (CadPlan) obj;
if (codPlan == null) {
if (other.codPlan != null) {
return false;
}
} else if (!codPlan.equals(other.codPlan)) {
return false;
}
if (id == null) {
if (other.id != null) {
return false;
}
} else if (!id.equals(other.id)) {
return false;
}
if (usuario == null) {
if (other.usuario != null) {
return false;
}
} else if (!usuario.equals(other.usuario)) {
return false;
}
return true;
}
}