/* * * 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 relativo a todas as classes de negocio. * Com as classes bean */ package modelo; import java.io.Serializable; import java.text.Collator; import java.util.ArrayList; 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; @NamedQueries( { @NamedQuery(name = "Modelo.recuperaListaDeModelos", query = "select m from Modelo m " + "order by m.codModelo" ), @NamedQuery(name = "Modelo.recuperaListaDeModelosComFamilias", query = "select m from Modelo m " + "left outer join fetch m.familia " + "order by m.codModelo" ), @NamedQuery(name = "Modelo.recuperaListaDeModelosComFamiliasEPeriodos", query = "select m from Modelo m " + "left outer join fetch m.familia " + "left outer join fetch m.deModPers " + "order by m.codModelo " ), @NamedQuery(name = "Modelo.recuperaUmModeloComFamilia", query = "select m from Modelo m " + "left outer join fetch m.familia " + "where m = ?" ), @NamedQuery(name = "Modelo.recuperaModeloComFamiliaEPeriodos", query = "select m from Modelo m " + "left outer join fetch m.familia " + "left outer join fetch m.deModPers " + "where m = ?" ), @NamedQuery(name = "Modelo.recuperaListaDeModelosPorFamilia", query = "select m from Modelo m " + "left outer join m.familia f " + "where f = ?" ), @NamedQuery(name = "Modelo.recuperaModeloPorCodigo", query = "select m from Modelo m " + "left outer join fetch m.familia " + "where m.codModelo = ?" ), @NamedQuery(name = "Modelo.recuperaModeloPorCodigoLike", query = "select m from Modelo m " + "left outer join fetch m.familia " + "where m.codModelo like '%' || upper(?) || '%' " ), @NamedQuery(name = "Modelo.recuperaModeloPorDescricao", query = "select distinct(m) from Modelo m " + "left outer join fetch m.familia " + "where upper(m.descrModelo) like '%' || upper(?) || '%' " + "order by m.codModelo " ), @NamedQuery(name = "Modelo.recuperaListaPaginadaDeModelosComFamilias", query = "select m from Modelo m " + "left outer join fetch m.familia " + "order by m.codModelo " ), @NamedQuery(name = "Modelo.recuperaListaPaginadaDeModelosComFamiliasCount", query = "select count(distinct modelo) " + "from Modelo modelo " ), @NamedQuery(name = "Modelo.recuperaListaDeModelosComFamiliasEPeriodosCount", query = "select count(distinct m) " + "from Modelo m " + "left outer join m.familia " + "left outer join m.deModPers " ), @NamedQuery ( name = "Modelo.recuperaListaPaginadaDeModelosComFamiliaComListaDePMPs", query = "select distinct m from Modelo m " + "left outer join fetch m.familia f " + "left outer join fetch m.pmps pmp " + "order by m.codModelo asc " ), @NamedQuery ( name = "Modelo.recuperaListaPaginadaDeModelosComFamiliaComListaDePMPsCount", query = "select count(distinct m) from Modelo m " + "left outer join m.pmps " ) } ) @Entity @Table(name = "MODELO") @SequenceGenerator(name = "SEQUENCIA", sequenceName = "SEQ_MODELO", allocationSize = 1) public class Modelo implements Serializable, Comparable<Modelo> { private static final long serialVersionUID = 1L; public static final String FLAG_LIVRE = "Livre"; public static final String FLAG_FIXO = "Fixo"; /** identificador de modelos */ private Long id; /** codigo do modelo */ private String codModelo; /** descricao do modelo */ private String descrModelo; /** flag para identificar se modelo � livre ou fixo para altera��o no algoritmo */ private Boolean flagProducaoModel; /** verificar finalidade do campo e se deve realmente ser double */ private double indiceCob; /** Tempo Unitario de Costura (em minutos) */ private double tuc; /** tamanho do lote (em pe�as) */ private double tamLote; /** Tempo de reposi��o do modelo (TR - em dias) */ private double tr; /** cobertura percentual de estoques do modelo em rela��o ao pr�ximo per�odo do HP */ private double cobertura; /** estoque inicial (em pe�as) para o modelo no in�cio do HP */ private double estqInicModel; /** O recebimento pendente entra na inclus�o do plano somando com estoque inicial, * pois � uma quantidade que j� est� sendo praticamente entregue no estoque, * mas ainda est� no ch�o de fabrica. * * ATENCAO: quando O usu�rio for iniciar o novo ciclo de planejamento deve editar essa quantidade * no campo recebimentopendente do modelo como sendo um feedback do chao de fabrica. */ private double recebimentoPendente; /** * Corresponde a venda que n�o foi atendida no ciclo de planejamento anterior, * ou seja, � a quantidade que ficou negativa na dispproj no plano * vigente anterior e que estava indicando * que tinha venda naquele per�odo que n�o havia sido atendida. * Campo que pode ser editado a cada ciclo de planejamento, juntamente com estoque inicial, * mas que ser� calculado automaticamente a partir da parcela negativa do dispProj do periodo inicial do * ciclo de planejamento anterior. * No campo estoque inicial do modelo que tamb�m � editado a cada ciclo essa quantidade "faltando" no estoque n�o vai ser * levada em considera��o pois n�o permite edi��o de estoque negativo. */ private double estqEmFalta; //Campos referentes aos dados de quando � gerado um PMP vigente. /** Tempo de reposi��o do modelo relativo ao momento em que foi implementado o PMP vigente. (TR - em dias) */ private double trPMP; /** tamanho do lote (em pe�as) relativo ao momento em que foi implementado o PMP vigente. */ private double tamLotePMP; /** cobertura percentual de estoques do modelo em rela��o ao pr�ximo per�odo do HP. * relativo ao momento em que foi implementado o PMP vigente. */ private double coberturaPMP; /** estoque inicial (em pe�as) para o modelo no in�cio do HP * relativo ao momento em que foi implementado o PMP vigente. */ private double estqInicModelPMP; /** O recebimento pendente entra na inclus�o do plano somando com estoque inicial, * pois � uma quantidade que j� est� sendo praticamente entregue no estoque, * mas ainda est� no ch�o de fabrica. * * ATENCAO: quando O usu�rio for iniciar o novo ciclo de planejamento deve editar essa quantidade * no campo recebimentopendente do modelo como sendo um feedback do chao de fabrica. * relativo ao momento em que foi implementado o PMP vigente. */ private double recebimentoPendentePMP; /** * Corresponde a venda que n�o foi atendida no ciclo de planejamento anterior, * ou seja, � a quantidade que ficou negativa na dispproj no plano * vigente anterior e que estava indicando * que tinha venda naquele per�odo que n�o havia sido atendida. * Campo que pode ser editado a cada ciclo de planejamento, juntamente com estoque inicial, * mas que ser� calculado automaticamente a partir da parcela negativa do dispProj do periodo inicial do * ciclo de planejamento anterior. * No campo estoque inicial do modelo que tamb�m � editado a cada ciclo essa quantidade "faltando" no estoque n�o vai ser * levada em considera��o pois n�o permite edi��o de estoque negativo. * relativo ao momento em que foi implementado o PMP vigente. */ private double estqEmFaltaPMP; /** Um modelo pertence a uma �nica familia */ private Familia familia; private List<RecModel> recModels = new ArrayList<RecModel>(); private List<TecModel> tecmodels = new ArrayList<TecModel>(); private List<DeModPer> deModPers; private Set<PlanoModelo> planosModelo; /** Lista de registros do Plano mestre Vigente relativos a esse modelo */ private List<PMP> pmps; // ********* Construtores ********* public Modelo() { } // ********* M�todos get/set ********* @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQUENCIA") @Column(name = "ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(nullable = false, length = 15, unique=true) public String getCodModelo() { return codModelo; } public void setCodModelo(String codModelo) { this.codModelo = codModelo; } @Column(length = 50) public String getDescrModelo() { return descrModelo; } public void setDescrModelo(String descrModelo) { this.descrModelo = descrModelo; } @Column(nullable = false) public Boolean getFlagProducaoModel() { return flagProducaoModel; } public void setFlagProducaoModel(Boolean flagProducaoModel) { this.flagProducaoModel = flagProducaoModel; } public double getIndiceCob() { return indiceCob; } public void setIndiceCob(double indiceCob) { this.indiceCob = indiceCob; } public double getTuc() { return tuc; } public void setTuc(double tuc) { this.tuc = tuc; } public double getTamLote() { return tamLote; } public void setTamLote(double tamLote) { this.tamLote = tamLote; } public double getTr() { return tr; } public void setTr(double tr) { this.tr = tr; } public double getCobertura() { return cobertura; } public void setCobertura(double cobertura) { this.cobertura = cobertura; } public double getEstqInicModel() { return estqInicModel; } public void setEstqInicModel(double estqInicModel) { this.estqInicModel = estqInicModel; } public double getRecebimentoPendente() { return recebimentoPendente; } public double getEstqEmFalta() { return estqEmFalta; } public void setEstqEmFalta(double estqEmFalta) { this.estqEmFalta = estqEmFalta; } @Column(nullable = true) public double getTrPMP() { return trPMP; } public void setTrPMP(double trPMP) { this.trPMP = trPMP; } @Column(nullable = true) public double getTamLotePMP() { return tamLotePMP; } public void setTamLotePMP(double tamLotePMP) { this.tamLotePMP = tamLotePMP; } @Column(nullable = true) public double getCoberturaPMP() { return coberturaPMP; } public void setCoberturaPMP(double coberturaPMP) { this.coberturaPMP = coberturaPMP; } @Column(nullable = true) public double getEstqInicModelPMP() { return estqInicModelPMP; } public void setEstqInicModelPMP(double estqInicModelPMP) { this.estqInicModelPMP = estqInicModelPMP; } @Column(nullable = true) public double getRecebimentoPendentePMP() { return recebimentoPendentePMP; } public void setRecebimentoPendentePMP(double recebimentoPendentePMP) { this.recebimentoPendentePMP = recebimentoPendentePMP; } @Column(nullable = true) public double getEstqEmFaltaPMP() { return estqEmFaltaPMP; } public void setEstqEmFaltaPMP(double estqEmFaltaPMP) { this.estqEmFaltaPMP = estqEmFaltaPMP; } public void setRecebimentoPendente(double recebimentoPendente) { this.recebimentoPendente = recebimentoPendente; } //ATEN��O: Quando excluir modelo esta excluindo em cascata os RecModels desse modelo //Isso por conta do uso da propriedade "cascade=CascadeType.REMOVE" na rela��o. //O atributo mappedBy faz referencia ao ATRIBUTO da classe RecModel, ou seja, //o valor desse atributo deve ser o nome do atributo em RecModel @OneToMany(mappedBy = "modelo", cascade=CascadeType.REMOVE) public List<RecModel> getRecModels() { return recModels; } public void setRecModels(List<RecModel> recModels) { this.recModels = recModels; } // ********* M�todos para Associa��es ********* @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "FAMILIA_ID", nullable = false) public Familia getFamilia() { return familia; } public void setFamilia(Familia familia) { this.familia = familia; } @OneToMany(mappedBy = "modelo", cascade=CascadeType.REMOVE) public List<TecModel> getTecModels() { return tecmodels; } public void setTecModels(List<TecModel> tecmodels) { this.tecmodels = tecmodels; } public void setDeModPers(List<DeModPer> deModPers) { this.deModPers = deModPers; } // O atributo 'mappedBy' do JPA faz referencia ao atributo "modelo" da classe DeModPer // e por default, esta lista � inicializada como LAZY. @OneToMany(mappedBy="modelo", cascade=CascadeType.REMOVE) public List<DeModPer> getDeModPers() { return deModPers; } public void setPlanosModelo(Set<PlanoModelo> planosModelo) { this.planosModelo = planosModelo; } @OneToMany(mappedBy="modelo", cascade=CascadeType.REMOVE) public Set<PlanoModelo> getPlanosModelo() { return planosModelo; } @OneToMany(mappedBy = "modelo", fetch=FetchType.LAZY, cascade=CascadeType.REMOVE) public List<PMP> getPmps() { return pmps; } /** * @param pMPs the pMPs to set */ public void setPmps(List<PMP> pmps) { this.pmps = pmps; } @Override public String toString() { return this.codModelo + " - " + this.descrModelo; } /** * 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 + ((codModelo == null) ? 0 : codModelo.hashCode()); return result; } /** * * Este m�todo pode ser gerado AUTOMATICAMENTE pelo Java , juntamente com o m�todo * "hashCode()". Estes metodos s�o necess�rios para se determinar um crit�rio principal * de igualdade entre 2 objetos. * * @param Object * @return boolean */ @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (!(obj instanceof Modelo)) { return false; } Modelo other = (Modelo) obj; if (codModelo == null) { if (other.codModelo != null) { return false; } } else if (!codModelo.equals(other.codModelo)) { return false; } return true; } /** * * Este m�todo consiste em definir o crit�rio de ordena��o entre 2 objetos Modelo, que deve estar * associado a um de seus atributos. No nosso caso, o atributo em quest�o � o 'codModelo', 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 Modelo * @return int */ @Override public int compareTo(Modelo o) { int valor = codModelo.compareTo(o.codModelo); return (valor != 0 ? valor : 1); } }