package br.com.ec.domain.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
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.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.annotations.ForeignKey;
import br.com.ec.domain.model.tipos.TipoCorProduto;
import br.com.ec.domain.model.tipos.TipoEstiloProduto;
import br.com.ec.domain.model.tipos.TipoGenero;
import br.com.ec.domain.model.tipos.TipoPedido;
import br.com.ec.domain.model.tipos.TipoProduto;
import br.com.ec.domain.model.tipos.TipoSituacaoPedido;
import br.edu.cesmac.core.interfaces.Alterar;
import br.edu.cesmac.core.interfaces.Cadastrar;
import br.edu.cesmac.core.util.DataUtils;
import br.edu.cesmac.core.util.StringUtil;
import br.edu.cesmac.core.util.VerificadorUtil;
@
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 Cliente cliente
;
private String contatoCliente
;
private Modelo modelo
;
private Venda venda
;
private String genero
;
private String tipoProduto
;
private String estiloProduto
;
private String corProduto
;
private String observacao
;
private Usuario usuarioAtendimento
;
private String tipoSituacao
;
private Date dataUltimaAlteracaoSituacao
;
private Date dataSolicitadoParaComprar
;
private List<PedidoHistorico
> historico
;
private List<PedidoProduto
> produtos
;
private String tipoPedido
;
// 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_tipo_produto")
public String getTipoProduto
() {
return tipoProduto
;
}
public void setTipoProduto
(String tipoProduto
) {
this.
tipoProduto = tipoProduto
;
}
@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_situacao")
public String getTipoSituacao
() {
return tipoSituacao
;
}
public void setTipoSituacao
(String tipoSituacao
) {
this.
tipoSituacao = tipoSituacao
;
}
@Column
(name=
"dth_pedido", nullable=
false)
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=
"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_solicitacao_compra")
public Date getDataSolicitadoParaComprar
() {
return dataSolicitadoParaComprar
;
}
public void setDataSolicitadoParaComprar
(Date dataSolicitadoParaComprar
) {
this.
dataSolicitadoParaComprar = dataSolicitadoParaComprar
;
}
/*
@Column(name="obs_material_recolhido")
public String getObservacaoMaterialRecolhido() {
return observacaoMaterialRecolhido;
}
public void setObservacaoMaterialRecolhido(String observacaoMaterialRecolhido) {
this.observacaoMaterialRecolhido = observacaoMaterialRecolhido;
}
@Column(name="dsc_servico")
public String getDescricaoServico() {
return descricaoServico;
}
public void setDescricaoServico(String descricaoServico) {
this.descricaoServico = descricaoServico;
}
*/
@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 String getDescricaoDoModelo
() {
return VerificadorUtil.
naoEstaNulo(modelo
)? modelo.
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 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 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 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
;
}
}