package br.com.ec.domain.model;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MapsId;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.Size;
import org.hibernate.annotations.ForeignKey;
import br.com.ec.core.exception.NegocioException;
import br.com.ec.core.generic.identidade.Identidade;
import br.com.ec.core.util.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.dto.AvaliacaoFuncionarioDTO;
import br.com.ec.domain.model.tipos.TipoComissionamento;
@
Entity
@Table
(name=
"sec_avaliacao_funcionario", schema=
"sc_sec")
public class AvaliacaoFuncionario
implements Serializable, Identidade
{
private static final long serialVersionUID = 1L
;
private AvaliacaoFuncionarioId avaliacaoFuncionarioId
;
private Funcionario funcionario
;
private Avaliacao avaliacao
;
private Loja loja
;
private String observacao
;
private Double porcentagemComissao
;
private Integer quantidadeHorasExtras50
;
private Integer quantidadeHorasExtras100
;
private Double valorMetaMensal
;
private Double valorMetaMensalVivo
;
private Double valorComissao
;
private Double valorTotalVendido
;
private Double valorTotalVendidoVivo
;
private List<AvaliacaoFuncionarioItemAvaliacao
> itens
;
public AvaliacaoFuncionario
() {
this.
avaliacaoFuncionarioId =
new AvaliacaoFuncionarioId
();
}
public AvaliacaoFuncionario
(AvaliacaoFuncionarioId avalicaoFuncionarioId
) {
this.
avaliacaoFuncionarioId = avalicaoFuncionarioId
;
}
public AvaliacaoFuncionario
(Funcionario funcionario, Avaliacao avaliacao, Loja loja
) {
avaliacaoFuncionarioId =
new AvaliacaoFuncionarioId
();
setAvaliacao
(avaliacao
);
setFuncionario
(funcionario
);
setLoja
(loja
);
}
@
Override
@Transient
public Object getId
() {
return getAvaliacaoFuncionarioId
();
}
@
Override
public void setId
(Object id
) {
this.
avaliacaoFuncionarioId =
(AvaliacaoFuncionarioId
) id
;
}
@EmbeddedId
public AvaliacaoFuncionarioId getAvaliacaoFuncionarioId
() {
return avaliacaoFuncionarioId
;
}
public void setAvaliacaoFuncionarioId
(AvaliacaoFuncionarioId avaliacaoFuncionarioId
) {
this.
avaliacaoFuncionarioId = avaliacaoFuncionarioId
;
}
@ManyToOne
@ForeignKey
(name=
"fk_avalfunc_avaliacao")
@MapsId
(value=
"sequencialAvaliacao")
@JoinColumn
(name =
"seq_avaliacao", referencedColumnName=
"seq_avaliacao", insertable=
false, updatable=
false, nullable =
false)
public Avaliacao getAvaliacao
() {
return avaliacao
;
}
public void setAvaliacao
(Avaliacao avaliacao
) {
if (VerificadorUtil.
naoEstaNulo(avaliacao
)) {
avaliacaoFuncionarioId.
setSequencialAvaliacao(avaliacao.
getSequencial());
}
this.
avaliacao = avaliacao
;
}
@ManyToOne
@ForeignKey
(name=
"fk_avalfunc_funcionario")
@MapsId
(value=
"sequencialFuncionario")
@JoinColumn
(name =
"seq_funcionario", referencedColumnName=
"seq_funcionario", insertable=
false, updatable=
false, nullable =
false)
public Funcionario getFuncionario
() {
return funcionario
;
}
public void setFuncionario
(Funcionario funcionario
) {
if (VerificadorUtil.
naoEstaNulo(funcionario
)) {
avaliacaoFuncionarioId.
setSequencialFuncionario(funcionario.
getSequencial());
}
this.
funcionario = funcionario
;
}
@ManyToOne
@ForeignKey
(name=
"fk_avalfunc_loja")
@MapsId
(value=
"sequencialLoja")
@JoinColumn
(name =
"seq_loja", referencedColumnName=
"seq_loja", insertable=
false, updatable=
false, nullable =
false)
public Loja getLoja
() {
return loja
;
}
public void setLoja
(Loja loja
) {
if (VerificadorUtil.
naoEstaNulo(loja
)) {
avaliacaoFuncionarioId.
setSequencialLoja(loja.
getSequencial());
}
this.
loja = loja
;
}
@Column
(name=
"dsc_observacao")
@Size
(max =
400, message =
"Limite de caracteres ultrapassado: Observação")
public String getObservacao
() {
return observacao
;
}
public void setObservacao
(String observacao
) {
this.
observacao = StringUtil.
setarUpperCaseComTrim(observacao
);
}
@Column
(name=
"val_porcentagem_comissao")
public Double getPorcentagemComissao
() {
return porcentagemComissao
;
}
public void setPorcentagemComissao
(Double porcentagemComissao
) {
this.
porcentagemComissao = porcentagemComissao
;
}
@Column
(name=
"qtd_horas_extras_50")
public Integer getQuantidadeHorasExtras50
() {
return quantidadeHorasExtras50
;
}
public void setQuantidadeHorasExtras50
(Integer quantidadeHorasExtras50
) {
this.
quantidadeHorasExtras50 = quantidadeHorasExtras50
;
}
@Column
(name=
"qtd_horas_extras_100")
public Integer getQuantidadeHorasExtras100
() {
return quantidadeHorasExtras100
;
}
public void setQuantidadeHorasExtras100
(Integer quantidadeHorasExtras100
) {
this.
quantidadeHorasExtras100 = quantidadeHorasExtras100
;
}
@Column
(name=
"val_meta_mensal")
public Double getValorMetaMensal
() {
return valorMetaMensal
;
}
public void setValorMetaMensal
(Double valorMetaMensal
) {
this.
valorMetaMensal = valorMetaMensal
;
}
@Column
(name=
"val_meta_mensal_vivo")
public Double getValorMetaMensalVivo
() {
return valorMetaMensalVivo
;
}
public void setValorMetaMensalVivo
(Double valorMetaMensalVivo
) {
this.
valorMetaMensalVivo = valorMetaMensalVivo
;
}
@Column
(name=
"val_comissao")
public Double getValorComissao
() {
return valorComissao
;
}
public void setValorComissao
(Double valorComissao
) {
this.
valorComissao = valorComissao
;
}
@OneToMany
(mappedBy=
"avaliacaoFuncionario", cascade=CascadeType.
ALL, orphanRemoval=
true)
public List<AvaliacaoFuncionarioItemAvaliacao
> getItens
() {
return itens
;
}
public void setItens
(List<AvaliacaoFuncionarioItemAvaliacao
> itens
) {
this.
itens = itens
;
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result +
((avaliacaoFuncionarioId ==
null) ? 0 : avaliacaoFuncionarioId.
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;
AvaliacaoFuncionario other =
(AvaliacaoFuncionario
) obj
;
if (avaliacaoFuncionarioId ==
null) {
if (other.
avaliacaoFuncionarioId !=
null)
return false;
} else if (!avaliacaoFuncionarioId.
equals(other.
avaliacaoFuncionarioId))
return false;
return true;
}
@Transient
public Double getValorTotalVendido
() {
return valorTotalVendido
;
}
public void setValorTotalVendido
(Double valorTotalVendido
) {
this.
valorTotalVendido = valorTotalVendido
;
}
@Transient
public Double getValorTotalVendidoVivo
() {
return valorTotalVendidoVivo
;
}
public void setValorTotalVendidoVivo
(Double valorTotalVendidoVivo
) {
this.
valorTotalVendidoVivo = valorTotalVendidoVivo
;
}
@Transient
public Long getSequencialDaAvaliacao
() {
return VerificadorUtil.
naoEstaNulo(getAvaliacao
())? getAvaliacao
().
getSequencial() :
null;
}
@Transient
public Long getSequencialDaVigencia
() {
return VerificadorUtil.
naoEstaNulo(getAvaliacao
())? getAvaliacao
().
getSequencialDaVigencia() :
null;
}
@Transient
public Long getSequencialDoFuncionario
() {
return VerificadorUtil.
naoEstaNulo(getAvaliacaoFuncionarioId
())? getAvaliacaoFuncionarioId
().
getSequencialFuncionario() :
null;
}
@Transient
public Long getSequencialDaLoja
() {
return VerificadorUtil.
naoEstaNulo(getAvaliacaoFuncionarioId
())? getAvaliacaoFuncionarioId
().
getSequencialLoja() :
null;
}
@Transient
public Integer pontuacao
(Set<AvaliacaoFuncionarioItemAvaliacao
> itens
) {
Integer pontuacao =
10;
if (VerificadorUtil.
naoEstaNulo(itens
)) {
for (AvaliacaoFuncionarioItemAvaliacao item : itens
) {
if (item.
getItemAvaliacao().
getIndicadorRetirarPontos()) {
pontuacao = pontuacao - item.
getQuantidadePontos();
} else {
pontuacao = pontuacao + item.
getQuantidadePontos();
}
}
}
return pontuacao
;
}
@Transient
public Integer getPontuacao
() {
Integer pontuacao =
10;
if (VerificadorUtil.
naoEstaNulo(getItens
())) {
for (AvaliacaoFuncionarioItemAvaliacao item : getItens
()) {
if (item.
getItemAvaliacao().
getIndicadorRetirarPontos()) {
pontuacao = pontuacao - item.
getQuantidadePontos();
} else {
pontuacao = pontuacao + item.
getQuantidadePontos();
}
}
}
return pontuacao
;
}
@Transient
public void adicionarItemAvaliacao
(AvaliacaoFuncionarioItemAvaliacao itemParticipante
) {
if (VerificadorUtil.
estaNulo(itemParticipante.
getItemAvaliacao())) {
throw new NegocioException
("Parâmetro obrigatório não preenchido: Item da avaliação");
}
if (VerificadorUtil.
estaNulo(itemParticipante.
getQuantidadePontos())) {
throw new NegocioException
("Parâmetro obrigatório não preenchido: Quantidade de pontos");
}
if (VerificadorUtil.
estaNulo(getItens
())) {
setItens
(new ArrayList<AvaliacaoFuncionarioItemAvaliacao
>());
}
for (AvaliacaoFuncionarioItemAvaliacao item : getItens
()) {
if (item.
equals(itemParticipante
)) {
getItens
().
remove(itemParticipante
);
Integer pontos = item.
getQuantidadePontos();
itemParticipante.
setQuantidadePontos(itemParticipante.
getQuantidadePontos()+pontos
);
if (VerificadorUtil.
naoEstaNuloOuVazio(item.
getObservacao())) {
String observacao = item.
getObservacao();
itemParticipante.
setObservacao(observacao +
"; " + itemParticipante.
getObservacao());
}
break;
}
}
getItens
().
add(itemParticipante
);
}
@Transient
public Double retornarValorComissao
(Double totalVendas,
String tipoComissionamento
) {
if (VerificadorUtil.
naoEstaNuloOuVazio(valorMetaMensal
)) {
return totalVendas
* retornarFaixaComissao
(totalVendas, tipoComissionamento
);
}
return 0.0;
}
@Transient
public Double retornarValorComissao
() {
if (VerificadorUtil.
naoEstaNulo(getFuncionario
())) {
return retornarValorComissao
(getValorTotalVendido
(), getFuncionario
().
getTipoComissionamento());
}
return 0.0;
}
@Transient
public Double retornarFaixaComissao
(Double totalVendas,
String tipoComissionamento
) {
if (VerificadorUtil.
naoEstaNuloOuVazio(valorMetaMensal
)) {
Double percentualRealizado = totalVendas
* 100 / valorMetaMensal
;
if (TipoComissionamento.
COMISSSIONAMENTO_ESPACO_CASE.
getValor().
equals(tipoComissionamento
)) {
if (percentualRealizado
< 75) {
return 0.0;
} else if (percentualRealizado
< 100) {
return 0.01;
} else if (percentualRealizado
< 125) {
return 0.02;
}
return 0.025;
}
if (TipoComissionamento.
COMISSSIONAMENTO_FARMACIA.
getValor().
equals(tipoComissionamento
)) {
if (percentualRealizado
< 75) {
return 0.0;
} else if (percentualRealizado
< 100) {
return 0.025;
}
return 0.05;
}
}
return 0.0;
}
@Transient
public Double retornarFaixaComissao
() {
if (VerificadorUtil.
naoEstaNulo(getFuncionario
())) {
return retornarFaixaComissao
(getValorTotalVendido
(), getFuncionario
().
getTipoComissionamento());
}
return 0.0;
}
@Transient
public Double retornarFaixaComissaoVivo
(Double totalVendas
) {
if (VerificadorUtil.
naoEstaNuloOuVazio(valorMetaMensalVivo
)) {
Double percentualRealizado = totalVendas
* 100 / valorMetaMensalVivo
;
if (percentualRealizado
< 75) {
return 0.0;
} else if (percentualRealizado
< 100) {
return 0.10;
}
return 0.15;
}
return 0.0;
}
@Transient
public Double retornarFaixaComissaoVivo
() {
return retornarFaixaComissaoVivo
(getValorTotalVendido
());
}
@Transient
public Double retornarPercentualRealizado
() {
return retornarPercentual
(getValorTotalVendido
(), getValorMetaMensal
());
}
@Transient
public Double retornarPercentualVivoRealizado
() {
return retornarPercentual
(getValorTotalVendidoVivo
(), getValorMetaMensalVivo
());
}
@Transient
public Double retornarPercentualRealizado
(Double totalVendas
) {
return retornarPercentual
(totalVendas, getValorMetaMensal
());
}
@Transient
public Double retornarPercentualVivoRealizado
(Double totalVendasVivo
) {
return retornarPercentual
(totalVendasVivo, getValorMetaMensalVivo
());
}
@Transient
public Double retornarPercentual
(Double total,
Double meta
) {
return VerificadorUtil.
naoEstaNulo(total
) && VerificadorUtil.
naoEstaNulo(meta
)? meta
> new Double(0.0) ? total / meta :
new Double(0.0) :
new Double(0.0);
}
}