Caros colegas,
Esqueçam do meu e-mail anterior. Percebi a orelhada que estava cometendo. Agora já compreendo que devo sim utilizar o padrão composite para esta estrutura de contas. Mas, ainda estou com algumas dúvidas. Primeiro o padrão composite é estrutural ou comportamental? Pergunto isso por que em diversos lugares vejo o relacionamento entre os elementos e as composições como sendo generalização/especialização e algumas vezes os vejo modelados como implementação das interfaces das classes. Pelo que sei o correto é o estrutural, as interfaces das classes irão seguir a estrutura das classes, certo?
Abaixo segue o código fonte/diagrma das classes (POJO ou JavaBean). De-em uma olhada e critiquem por favor.
ContaContabil.java
/**
* @author Marcelo Magalhães
* @version 1.0
* @created 19-mai-2010 13:06:24
*/
public abstract class ContaContabil
{
/**
* Identificador da conta. Sequencia gerada pelo banco de dados.
*/
private long identificador;
/**
* Nome da conta contábil. Pode ser alfanumérico de até 70 posições.
*/
private String nome;
/**
* Campo destinado a observações sobre a conta.
*/
private String observacao;
/**
* Saldo total da conta contábil. Nas contas contábeis analíticas é a diferença
* entre os lançamento de crédito e os de débito. Já nas contas contábies
* sintéticas, o saldo, é o somatório dos saldos das contas contábeis analíticas
* pertencentes a esta conta.
*/
private float saldo;
/**
* Construtor padrão
*/
public ContaContabil()
{
super();
}
/**
* Construtor com argumentos.
*
* @param identificador
* @param nome
* @param observacao
* @param saldo
*/
public ContaContabil(long identificador, String nome, String observacao, float saldo)
{
}
@Column(name="")
public long getIdentificador()
{
return this.identificador;
}
@Column(name="")
public String getNome()
{
return this.nome;
}
@Column(name="")
public String getObservacao()
{
return this.observacao;
}
/**
*
* @param identificador
*/
public void setIdentificador(long identificador)
{
this.identificador = identificador;
}
/**
*
* @param nome
*/
public void setNome(String nome)
{
this.nome = nome;
}
/**
*
* @param observacao
*/
public void setObservacao(String observacao)
{
this.observacao = observacao;
}
@Column(name="")
public float getSaldo()
{
return <unknown>;
}
public void setSaldo()
{
<unknown> = newVal;
}
}
ContaContabilAnalitica.java
/**
* Conta contábil. É nas contas contábeis que são feitos os lançamentos contábeis
* que ocorrem no dia a dia de uma empresa. As contas podem ser agrupadas em dois
* grandes grupo, a saber, grupo das contas patrimoniais e grupo das contas de
* resultado. As contas patrimoniais são responsáveis por registrar os elementos
* patrimoniais da empresa, já as contas de resultado servem para apurar a
* desenvolvimento financeiro da empresa ao longo do ano. Sendo assim estas contas
* de resultado terão seus saldos zerados ao final do exercício contábil no
* momento da apuração de resultado do exercício.
* @author Marcelo Magalhães
* @version 1.0
* @created 19-mai-2010 13:06:30
*/
@Entity
@Table(name="ContaContabilAnalitica")
public class ContaContabilAnalitica extends ContaContabil implements Serializable
{
private static final long serialVersionUID = 1;
/**
* Construtor padrão
*/
public ContaContabilAnalitica()
{
super();
}
/**
* Construtor padrão com argumentos
*
* @param identificador
* @param nome
* @param observacao
* @param saldo
*/
public ContaContabilAnalitica(long identificador, String nome, String observacao, float saldo)
{
super (identificador, nome, observacao , 0);
}
}
ContaContabilSintetica.java
/**
* As contas contábeis sintéticas servem somente para agrupar as contas contábeis
* analíticas, não sendo permitido lançamentos nestas contas. Outra boa finalidade
* para estas contas é a geração de relatórios sintéticos para niveis gerenciais
* de uma empresa, visto que tais contas sintéticas possuem o somatório de suas
* contas analíticas.
* @author Marcelo Magalhães
* @version 1.0
* @created 19-mai-2010 13:06:36
*/
@Entity
@Table(name="ContaContabilSintetica")
public class ContaContabilSintetica extends ContaContabil implements Serializable
{
private static final int serialVersionUID = 1;
/**
* Identificador da conta contábil sintética que pertence a esta conta contábil
* sintética (filho).
*/
private long identificadorFilho;
/**
* Classificador do tipo de grupo ao qual pertence a conta contábil sintética.
*/
private Classificador classificador;
/**
* Construtor padrão
*/
public ContaContabilSintetica()
{
super();
}
/**
*
* @param classificador Classificador do tipo de grupo ao qual pertence a conta
* contábil sintética.
*/
public ContaContabilSintetica(Classificador classificador)
{
this.classificador = new Classificador(classificador);
}
}
Lancamento.java
/**
* @author Marcelo Magalhães
* @version 1.0
* @created 19-mai-2010 13:06:42
*/
@Entity
@Table(name="Lancamento")
public class Lancamento implements Serializable
{
private static final long serialVersionUID = 1;
/**
* Identificador do lançamento. Sequence gerada pelo banco de dados.
*/
private long identificador;
/**
* Data da cadastro do lançamento. O valor padrão é data corrente. Formato: yyyy-
* mm-dd hh:mm:ss
*/
private Date dataCadastro = now;
/**
* Valor do lançamento
*/
private float valor;
/**
* Histórico ou descrição do lançamento
*/
private String historico;
/**
* Identificador da conta de débito do lançamento.
*/
private ContaContabilAnalitica contaDebito;
/**
* Identificador da conta de crédito do lançamento.
*/
private ContaContabilAnalitica contaCredito;
/**
* Construtor padrão
*/
public Lancamento()
{
}
/**
* Construtor padrão com argumentos
*
* @param identificador
* @param dataCadastro
* @param valor
* @param historico
* @param contaDebito
* @param contaCredito
*/
public Lancamento(long identificador, Date dataCadastro, float valor, String historico, long contaDebito, long contaCredito)
{
this.identificador = identificador;
this.data = data;
this.valor = valor;
this.historico = historico;
this.contaDebito = contaDebito;
this.contaCredito = contaCredito;
}
@Column(name="")
public long getIdentificador()
{
return this.identificador;
}
@Column(name="")
public Date getDataCadastro()
{
return this.data;
}
@Column(name="")
public float getValor()
{
return this.valor;
}
@Column(name="")
public String getHistorico()
{
return this.historico;
}
@Column(name="")
public ContaContabilAnalitica[] getContaDebito()
{
return this.contaDebito;
}
@Column(name="")
public ContaContabilAnalitica[] getContaCredito()
{
return this.contaCredito;
}
/**
*
* @param identificador
*/
public void setIdentificador(long identificador)
{
this.identificador = identificador;
}
/**
*
* @param data
*/
public void setDataCadastro(Date data)
{
this.data = data;
}
/**
*
* @param valor
*/
public void setValor(float valor)
{
this.valor = valor;
}
/**
*
* @param historico
*/
public void setHistorico(String historico)
{
this.historico = historico;
}
/**
*
* @param contaDebito
*/
public void setContaDebito(ContaContabilAnalitica contaDebito)
{
this.contaDebito = contaDebito;
}
/**
*
* @param contaCredito
*/
public void setContaCredito(ContaContabilAnalitica contaCredito)
{
this.contaCredito = contaCredito;
}
}
Classificador.java
/**
* @author Marcelo Magalhães
* @version 1.0
* @created 19-mai-2010 13:06:47
*/
public enum Classificador {
ATIVO(0,"Patrimonial","Ativo"),
PASSIVO(1,"Patrimonial","Passivo"),
DESPESAS(3,"Resultado","Despesas"),
RECEITAS(4,"Resultado","Receitas"),
APURACAO_RESULTADO(5,"Resultado","Apuração de resultado");
private final int identificador;
private final String grupo;
private final String nome;
/**
* Construtor padrão com argumentos
*
* @param identificador Código identificador do classificador.
* @param grupo Nome do grupo a qual pertence o classificador.
* @param nome Nome por extenso do classificador.
*/
private Classificador(int identificador, String grupo, String nome)
{
this.identificador = identificador;
this.nome = nome;
}
@Column(name="")
public int getIdentificador()
{
return this.identificador;
}
@Column(name="")
public String getGrupo()
{
return this.grupo;
}
@Column(name="")
public String getNome()
{
return this.nome;
}
}