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