Subversion Repositories Integrator Subversion

Rev

Rev 382 | 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.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 javax.validation.constraints.Size;

import org.hibernate.annotations.ForeignKey;

import br.com.ec.core.generic.identidade.Identidade;
import br.com.ec.core.interfaces.Alterar;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.StringUtil;
import br.com.ec.core.util.VerificadorUtil;
import br.com.ec.domain.model.tipos.TipoFrequencia;

@Entity
@Table(name="sec_parcela", schema="sc_sec")
public class Parcela implements Serializable, Identidade, Cloneable {

        private static final long serialVersionUID = 1L;

        private Long sequencial;
        private Conta conta;
        private ContaBancaria contaBancaria;
        private FormaPagamento formaPagamento;
        private Date dataEmissao;
        private Date dataVencimento;
        private Date dataPagamento;
        private Double valor;
        private String observacao;
        private Boolean indicadorOficial;
        private Boolean indicadorAtivo;
        private Boolean indicadorConciliado;
       
        private Boolean possuiLancamento = false;
       
        public Parcela() {}
       
        public Parcela(Long sequencial) {
                this.sequencial = sequencial;
        }
       
        public Parcela(Conta conta, ContaBancaria contaBancaria, Date dataEmissao,
                        Date dataVencimento, Date dataPagamento, Double valor, String observacao, Boolean indicadorAtivo) {
                this.conta = conta;
                this.contaBancaria = contaBancaria;
                this.dataEmissao = dataEmissao;
                this.dataVencimento = dataVencimento;
                this.dataPagamento = dataPagamento;
                this.valor = valor;
                this.observacao = StringUtil.setarUpperCaseComTrim(observacao);
                this.indicadorAtivo = indicadorAtivo;
        }
       
        public Parcela(Conta conta, ContaBancaria contaBancaria, FormaPagamento formaPagamento, Date dataEmissao,
                        Date dataVencimento, Date dataPagamento, Double valor, String observacao, Boolean indicadorOficial,
                        Boolean indicadorAtivo, Boolean indicadorConciliado) {
                super();
                this.conta = conta;
                this.contaBancaria = contaBancaria;
                this.formaPagamento = formaPagamento;
                this.dataEmissao = dataEmissao;
                this.dataVencimento = dataVencimento;
                this.dataPagamento = dataPagamento;
                this.valor = valor;
                this.observacao = StringUtil.setarUpperCaseComTrim(observacao);
                this.indicadorOficial = indicadorOficial;
                this.indicadorAtivo = indicadorAtivo;
                this.indicadorConciliado = indicadorConciliado;
        }
       
        public Parcela(Parcela parcela) {
                super();
                this.conta = parcela.getConta();
                this.contaBancaria = parcela.getContaBancaria();
                this.formaPagamento = parcela.getFormaPagamento();
                this.dataEmissao = parcela.getDataEmissao();
                this.dataVencimento = parcela.getDataVencimento();
                this.dataPagamento = parcela.getDataPagamento();
                this.valor = parcela.getValor();
                this.observacao = StringUtil.setarUpperCaseComTrim(parcela.getObservacao());
                this.indicadorOficial = parcela.getIndicadorOficial();
                this.indicadorAtivo = parcela.getIndicadorAtivo();
                this.indicadorConciliado = parcela.getIndicadorConciliado();
        }

        @Override
        @Transient
        public Object getId() {
                return this.getSequencial();
        }
        @Override
        public void setId(Object id) {
                this.sequencial = (Long) id;
        }
       
        @Id
        @SequenceGenerator(name = "sq_parcela")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name="seq_parcela", nullable=false)
        public Long getSequencial() {
                return sequencial;
        }
        public void setSequencial(Long sequencial) {
                this.sequencial = sequencial;
        }

        @ManyToOne
        @ForeignKey(name="fk_parcela_conta")
        @JoinColumn(name="seq_conta")
        public Conta getConta() {
                return conta;
        }
        public void setConta(Conta conta) {
                this.conta = conta;
        }
       
        @ManyToOne
        @ForeignKey(name="fk_parcela_contabancaria")
        @JoinColumn(name="cod_conta_bancaria")
        public ContaBancaria getContaBancaria() {
                return contaBancaria;
        }
        public void setContaBancaria(ContaBancaria contaBancaria) {
                this.contaBancaria = contaBancaria;
        }
       
        @ManyToOne
        @ForeignKey(name="fk_parcela_formapagamento")
        @JoinColumn(name="cod_formapagament")
        public FormaPagamento getFormaPagamento() {
                return formaPagamento;
        }
        public void setFormaPagamento(FormaPagamento formaPagamento) {
                this.formaPagamento = formaPagamento;
        }
       
        @Column(name="dth_emissao", nullable=false)
        public Date getDataEmissao() {
                return dataEmissao;
        }
        public void setDataEmissao(Date dataEmissao) {
                this.dataEmissao = dataEmissao;
        }
       
        @Column(name="dat_vencimento", nullable=true)
        public Date getDataVencimento() {
                return dataVencimento;
        }
        public void setDataVencimento(Date dataVencimento) {
                this.dataVencimento = dataVencimento;
        }

        @Column(name="dat_pagamento", nullable=true)
        public Date getDataPagamento() {
                return dataPagamento;
        }
        public void setDataPagamento(Date dataPagamento) {
                this.dataPagamento = dataPagamento;
        }

        @Column(name="val_valor", nullable=true)
        @NotNull(message = "Parâmetro obrigatório não preenchido: Valor da parcela", groups = {Cadastrar.class, Alterar.class})
        public Double getValor() {
                return valor;
        }
        public void setValor(Double valor) {
                this.valor = valor;
        }
       
        @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="ind_oficial")
        public Boolean getIndicadorOficial() {
                return indicadorOficial;
        }
        public void setIndicadorOficial(Boolean indicadorOficial) {
                this.indicadorOficial = indicadorOficial;
        }

        @Column(name="ind_ativo", nullable=false)
        public Boolean getIndicadorAtivo() {
                return indicadorAtivo;
        }
        public void setIndicadorAtivo(Boolean indicadorAtivo) {
                this.indicadorAtivo = indicadorAtivo;
        }

        @Column(name="ind_conciliado", nullable=false)
        public Boolean getIndicadorConciliado() {
                return indicadorConciliado;
        }
        public void setIndicadorConciliado(Boolean indicadorConciliado) {
                this.indicadorConciliado = indicadorConciliado;
        }
       
        @Transient
        public Boolean getPossuiLancamento() {
                return possuiLancamento;
        }
        public void setPossuiLancamento(Boolean possuiLancamento) {
                this.possuiLancamento = possuiLancamento;
        }

        @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;
                Parcela other = (Parcela) obj;
                if (sequencial == null) {
                        if (other.sequencial != null)
                                return false;
                } else if (!sequencial.equals(other.sequencial))
                        return false;
                return true;
        }
       
        @Transient
        public Boolean parcelaAVencerAlemDeTresDias() {
                return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(getDataVencimento(), DataUtils.getDataAtual()) > 3 ? true : false;
        }
       
        @Transient
        public Boolean parcelaAVencerAteTresDias() {
                return DataUtils.calcularDiferenceEmDiasEntreDuasDatas(getDataVencimento(), DataUtils.getDataAtual()) < 3 &&
                                DataUtils.calcularDiferenceEmDiasEntreDuasDatas(getDataVencimento(), DataUtils.getDataAtual()) >= 0? true : false;
        }
       
        @Transient
        public Boolean parcelaVencida() {
                if (VerificadorUtil.naoEstaNulo(getDataVencimento())) {
                        Date dataVerificar = DataUtils.acrescentarDias(DataUtils.getDataAtual(), -1);
                        return getDataVencimento().before(DataUtils.getDataComHorarioMaximo(dataVerificar));
                }
                return false;
        }
       
        @Transient
        public Boolean parcelaAhReceber() {
                return VerificadorUtil.naoEstaNulo(getConta())? getConta().ehContaAReceber() : false;
        }
       
        @Transient
        public Boolean parcelaAhPagar() {
                return VerificadorUtil.naoEstaNulo(getConta())? getConta().ehContaAPagar() : false;
        }
       
        @Transient
        public String corParcela() {
                return parcelaAhPagar()? "red" : "green";
        }
       
        @Transient
        public String descricaoDaLoja() {
                return VerificadorUtil.naoEstaNulo(getConta())? VerificadorUtil.naoEstaNulo(getConta().getLoja())? getConta().getLoja().getDescricao() : "" : "";
        }
       
        @Transient
        public Boolean formaDePagamentoEhDebito() {
                return VerificadorUtil.naoEstaNulo(getConta())? getConta().formaDePagamentoEhDebito() : false;
        }
       
        @Transient
        public Boolean formaDePagamentoEhCredito() {
                return VerificadorUtil.naoEstaNulo(getConta())? getConta().formaDePagamentoEhCredito() : false;
        }
       
        @Transient
        public String getDescricaoDaCategoria() {
                return VerificadorUtil.naoEstaNulo(getConta())? VerificadorUtil.naoEstaNulo(getConta().getCategoria())? getConta().getCategoria().getDescricao(): null: null;
        }
       
        @Transient
        public String getTipoDaCategoria() {
                return VerificadorUtil.naoEstaNulo(getConta())? VerificadorUtil.naoEstaNulo(getConta().getCategoria())? "(" + getConta().getCategoria().getTipo() + ")": null: null;
        }
       
        @Override
        public Parcela clone() throws CloneNotSupportedException {
                return (Parcela) super.clone();
        }

        public void provisionarNovaDataVencimentoPelaFrequencia() {
                if (getConta().getTipoFrequencia().equals(TipoFrequencia.DIARIAMENTE.getValor())) {
                        setDataVencimento(DataUtils.acrescentarDias(getDataVencimento(), 1));
                }
                if (getConta().getTipoFrequencia().equals(TipoFrequencia.SEMANAL.getValor())) {
                        setDataVencimento(DataUtils.acrescentarDias(getDataVencimento(), 7));
                }
                if (getConta().getTipoFrequencia().equals(TipoFrequencia.MENSAL.getValor())) {
                        setDataVencimento(DataUtils.acrescentarMeses(getDataVencimento(), 1));
                }
                if (getConta().getTipoFrequencia().equals(TipoFrequencia.ANUAL.getValor())) {
                        setDataVencimento(DataUtils.acrescentarAnos(getDataVencimento(), 1));
                }
        }
       
}