Subversion Repositories Integrator Subversion

Rev

Rev 268 | Rev 656 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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.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 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) {
                avaliacaoFuncionarioId = new AvaliacaoFuncionarioId();
                setAvaliacao(avaliacao);
                setFuncionario(funcionario);
        }

        @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;
        }
       
        @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 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);
        }
       
}