package br.com.ec.domain.model;
import java.io.Serializable;
import java.util.Date;
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.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.hibernate.annotations.ForeignKey;
import br.com.ec.core.interfaces.Alterar;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.model.tipos.TipoPedido;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
@
Entity
@Table
(name=
"sec_pedido", schema=
"sc_sec")
public class Pedido
implements Serializable {
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private Loja loja
;
private Date dataPedido
;
private Usuario usuarioPedido
;
private String tipoSituacao
;
private String tipoProduto
;
private String tipoPedido
;
/*
private Cliente cliente;
private String contatoCliente;
private Modelo modelo;
private Venda venda;
private String genero;
private String estiloProduto;
private String corProduto;
private String observacao;
private Usuario usuarioAtendimento;
*/
private Date dataUltimaAlteracaoSituacao
;
/*
private Date dataSolicitadoParaComprar;
private List<PedidoHistorico> historico;
private List<PedidoProduto> produtos;
*/
private Date dataEntrega
;
private Double kilometragemEntrega
;
// private String observacaoMaterialRecolhido;
// private String descricaoServico;
@Id
@SequenceGenerator
(name =
"sq_pedido")
@GeneratedValue
(strategy = GenerationType.
IDENTITY)
@Column
(name=
"seq_pedido", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@ManyToOne
@ForeignKey
(name=
"fk_pedido_loja")
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Loja do pedido", groups =
{Cadastrar.
class, Alterar.
class})
@JoinColumn
(name =
"seq_loja", referencedColumnName=
"seq_loja", nullable=
false)
public Loja getLoja
() {
return loja
;
}
public void setLoja
(Loja loja
) {
this.
loja = loja
;
}
@ManyToOne
@ForeignKey
(name=
"fk_pedido_usuario")
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Usuário do pedido", groups =
{Cadastrar.
class, Alterar.
class})
@JoinColumn
(name =
"seq_usuario_pedido", nullable=
false)
public Usuario getUsuarioPedido
() {
return usuarioPedido
;
}
public void setUsuarioPedido
(Usuario usuarioPedido
) {
this.
usuarioPedido = usuarioPedido
;
}
/*
@ManyToOne
@ForeignKey(name="fk_pedido_usuarioatend")
@JoinColumn(name = "seq_usuario_atendimento", nullable=true)
public Usuario getUsuarioAtendimento() {
return usuarioAtendimento;
}
public void setUsuarioAtendimento(Usuario usuarioAtendimento) {
this.usuarioAtendimento = usuarioAtendimento;
}
@ManyToOne
@ForeignKey(name="fk_pedido_cliente")
@JoinColumn(name = "seq_cliente", referencedColumnName="seq_cliente", nullable=true)
public Cliente getCliente() {
return cliente;
}
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
@Column(name="dsc_contato_cliente")
@Size(max = 200, message = "Limite de caracteres ultrapassado: Contato do Cliente")
public String getContatoCliente() {
return contatoCliente;
}
public void setContatoCliente(String contatoCliente) {
this.contatoCliente = StringUtil.setarUpperCaseComTrim(contatoCliente);
}
@ManyToOne
@ForeignKey(name="fk_pedido_modelo")
@JoinColumn(name = "seq_modelo", referencedColumnName="seq_modelo", nullable=true)
public Modelo getModelo() {
return modelo;
}
public void setModelo(Modelo modelo) {
this.modelo = modelo;
}
@ManyToOne
@ForeignKey(name="fk_pedido_venda")
@JoinColumn(name = "seq_venda", referencedColumnName="seq_venda", nullable=true)
public Venda getVenda() {
return venda;
}
public void setVenda(Venda venda) {
this.venda = venda;
}
@Column(name="tip_genero_produto")
public String getGenero() {
return genero;
}
public void setGenero(String genero) {
this.genero = genero;
}
@Column(name="tip_estilo_produto")
public String getEstiloProduto() {
return estiloProduto;
}
public void setEstiloProduto(String estiloProduto) {
this.estiloProduto = estiloProduto;
}
@Column(name="tip_cor_produto")
public String getCorProduto() {
return corProduto;
}
public void setCorProduto(String corProduto) {
this.corProduto = corProduto;
}
@Column(name="obs_pedido")
@Size(max = 250, message = "Limite de caracteres ultrapassado: Observação")
public String getObservacao() {
return observacao;
}
public void setObservacao(String observacao) {
this.observacao = StringUtil.setarUpperCaseComTrim(observacao);
}
*/
@Column
(name=
"tip_tipo_produto")
public String getTipoProduto
() {
return tipoProduto
;
}
public void setTipoProduto
(String tipoProduto
) {
this.
tipoProduto = tipoProduto
;
}
@Column
(name=
"tip_situacao")
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Situação do pedido", groups =
{Cadastrar.
class, Alterar.
class})
public String getTipoSituacao
() {
return tipoSituacao
;
}
public void setTipoSituacao
(String tipoSituacao
) {
this.
tipoSituacao = tipoSituacao
;
}
@Column
(name=
"dth_pedido", nullable=
false)
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Data do pedido", groups =
{Cadastrar.
class, Alterar.
class})
public Date getDataPedido
() {
return dataPedido
;
}
public void setDataPedido
(Date dataPedido
) {
this.
dataPedido = dataPedido
;
}
@Column
(name=
"dth_alteracao_situacao")
public Date getDataUltimaAlteracaoSituacao
() {
return dataUltimaAlteracaoSituacao
;
}
public void setDataUltimaAlteracaoSituacao
(Date dataUltimaAlteracaoSituacao
) {
this.
dataUltimaAlteracaoSituacao = dataUltimaAlteracaoSituacao
;
}
/*
@Column(name="dth_solicitacao_compra")
public Date getDataSolicitadoParaComprar() {
return dataSolicitadoParaComprar;
}
public void setDataSolicitadoParaComprar(Date dataSolicitadoParaComprar) {
this.dataSolicitadoParaComprar = dataSolicitadoParaComprar;
}
*/
@Column
(name=
"tip_pedido")
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Tipo do pedido", groups =
{Cadastrar.
class, Alterar.
class})
public String getTipoPedido
() {
return tipoPedido
;
}
public void setTipoPedido
(String tipoPedido
) {
this.
tipoPedido = tipoPedido
;
}
@Column
(name=
"dth_entrega")
public Date getDataEntrega
() {
return dataEntrega
;
}
public void setDataEntrega
(Date dataEntrega
) {
this.
dataEntrega = dataEntrega
;
}
@Column
(name=
"val_kilometragem_entrega")
public Double getKilometragemEntrega
() {
return kilometragemEntrega
;
}
public void setKilometragemEntrega
(Double kilometragemEntrega
) {
this.
kilometragemEntrega = kilometragemEntrega
;
}
/*
@OneToMany(mappedBy="pedido", cascade=CascadeType.ALL, orphanRemoval=true)
public List<PedidoHistorico> getHistorico() {
return historico;
}
public void setHistorico(List<PedidoHistorico> historico) {
this.historico = historico;
}
@OneToMany(mappedBy="pedido", cascade=CascadeType.ALL, fetch=FetchType.EAGER, orphanRemoval=true)
public List<PedidoProduto> getProdutos() {
return produtos;
}
public void setProdutos(List<PedidoProduto> produtos) {
this.produtos = produtos;
}
*/
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((sequencial ==
null) ? 0 : sequencial.
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;
Pedido other =
(Pedido
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null)
return false;
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
@Transient
public Boolean foiAtendido
() {
return TipoSituacaoPedido.
INVALIDO.
getValor().
equals(tipoSituacao
) ||
TipoSituacaoPedido.
FINALIZADO.
getValor().
equals(tipoSituacao
) ||
TipoSituacaoPedido.
FINALIZADO_COM_VENDAS.
getValor().
equals(tipoSituacao
);
}
@Transient
public String getDescricaoDaSituacao
() {
return TipoSituacaoPedido.
parse(getTipoSituacao
()).
getDescricao();
}
@Transient
public String getDescricaoDoTipoProduto
() {
return VerificadorUtil.
naoEstaNulo(tipoProduto
)? TipoProduto.
parse(tipoProduto
).
getDescricao() :
"";
}
@Transient
public String getDescricaoDoTipoPedido
() {
return VerificadorUtil.
naoEstaNulo(tipoPedido
)? TipoPedido.
parse(tipoPedido
).
getDescricao() :
"";
}
@Transient
public Boolean pedidoEhReserva
() {
return VerificadorUtil.
naoEstaNuloOuVazio(tipoPedido
) ? tipoPedido.
equals(TipoPedido.
RESERVA.
getValor()) :
false;
}
@Transient
public Boolean pedidoEhTroca
() {
return VerificadorUtil.
naoEstaNuloOuVazio(tipoPedido
) ? tipoPedido.
equals(TipoPedido.
TROCA.
getValor()) :
false;
}
@Transient
public Boolean pedidoEhAssistencia
() {
return VerificadorUtil.
naoEstaNuloOuVazio(tipoPedido
) ? tipoPedido.
equals(TipoPedido.
ASSISTENCIA.
getValor()) :
false;
}
@Transient
public Boolean pedidoEhPersonalizacao
() {
return VerificadorUtil.
naoEstaNuloOuVazio(tipoPedido
) ? tipoPedido.
equals(TipoPedido.
PERSONALIZACAO.
getValor()) :
false;
}
/*
@Transient
public String getDescricaoDoModelo() {
return VerificadorUtil.naoEstaNulo(modelo)? modelo.getDescricao() : "";
}
@Transient
public String getDescricaoDoEstiloProduto() {
return VerificadorUtil.naoEstaNulo(estiloProduto)? TipoEstiloProduto.parse(estiloProduto).getDescricao() : "";
}
@Transient
public String getDescricaoDaCorProduto() {
return VerificadorUtil.naoEstaNulo(corProduto)? TipoCorProduto.parse(corProduto).getDescricao() : "";
}
@Transient
public String getDescricaoDoGeneroProduto() {
return VerificadorUtil.naoEstaNulo(genero)? TipoGenero.parse(genero).getDescricao() : "";
}
@Transient
public String getNomeDoCliente() {
return VerificadorUtil.naoEstaNulo(cliente)? cliente.getNome() : "";
}
@Transient
public String getContatoDoCliente() {
return VerificadorUtil.naoEstaNulo(cliente)? cliente.getContato() : "";
}
@Transient
public String getTelefoneEeContatoDoCliente() {
return VerificadorUtil.naoEstaNulo(cliente)?
VerificadorUtil.naoEstaNuloOuVazio(cliente.getTelefone())? cliente.getTelefone() + " " + cliente.getContato():
VerificadorUtil.naoEstaNuloOuVazio(cliente.getContato())? cliente.getContato() : "" : "";
}
@Transient
public String getInformacoesBasicasDoCliente() {
return VerificadorUtil.naoEstaNulo(cliente)? getNomeDoCliente() + " " + getContatoCliente(): getContatoCliente();
}
*/
/*
@Transient
public String getDescricaoComModeloCompleta() {
String descricaoCompleta = "";
if (VerificadorUtil.naoEstaNuloOuVazio(getDescricaoDoModelo())) {
descricaoCompleta = getDescricaoDoModelo() + " - ";
}
return descricaoCompleta + getDescricao();
}
*/
/*
@Transient
public Long getSequencialDoModelo() {
return VerificadorUtil.naoEstaNulo(modelo)? modelo.getSequencial() : null;
}
@Transient
public Long getSequencialDaLoja() {
return VerificadorUtil.naoEstaNulo(loja)? loja.getSequencial() : null;
}
@Transient
public String getDescricaoDaLoja() {
return VerificadorUtil.naoEstaNulo(loja)? loja.getDescricao() : null;
}
@Transient
public Integer getQuantidadeDiasPedido() {
return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataAtual(), getDataPedido());
}
@Transient
public Integer getQuantidadeDiasAtendimento() {
return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(DataUtils.getDataAtual(), getDataUltimaAlteracaoSituacao());
}
@Transient
public String getImagemCronometroPedido() {
Integer quantidadeDias = getQuantidadeDiasPedido();
if (quantidadeDias < 15) {
return "cronometro_verde_sembg";
}
if (quantidadeDias < 30) {
return "cronometro_amarelo_sembg";
}
return "cronometro_vermelho_sembg";
}
@Transient
public String getCorSituacaoPedido() {
return TipoSituacaoPedido.parse(getTipoSituacao()).getCor();
}
@Transient
public String getCorPedido() {
Integer quantidadeDias = getQuantidadeDiasPedido();
if (quantidadeDias < 15) {
return "green";
}
return "red";
}
@Transient
public String getCorPedidoAtendimento() {
Integer quantidadeDias = getQuantidadeDiasAtendimento();
if (quantidadeDias < 15) {
return "green";
}
return "red";
}
@Transient
public Double getValorTotalProdutos() {
Double total = 0.0;
if (VerificadorUtil.naoEstaNuloOuVazio(getProdutos())) {
for (PedidoProduto pedidoProduto : getProdutos()) {
if (VerificadorUtil.naoEstaNulo(pedidoProduto.getValor())) {
total = total + (pedidoProduto.getValor() * pedidoProduto.getQuantidade());
}
}
}
return total;
}
@Transient
public List<PedidoHistorico> getHistoricoOrdenado() {
List<PedidoHistorico> historicoOrdenado = null;
if (VerificadorUtil.naoEstaNulo(getHistorico())) {
historicoOrdenado = new ArrayList<PedidoHistorico>(getHistorico());
Collections.sort(historicoOrdenado, new Comparator<PedidoHistorico>() {
public int compare(PedidoHistorico p1, PedidoHistorico p2) {
return p1.getDataHistorico().compareTo(p2.getDataHistorico());
};
});
}
return historicoOrdenado;
}
*/
}