Arquitetura para um Sistema de Vendas OpenSource!

Olá…estou redesenhando um projeto meu e gostaria de pediu auxílio de vocês para minhas classes e relacionamentos. Tenho aqui um diagrama de classe que gostaria de dessem uma olhada.

Este projeto meu é para uma empresa em que tenho (tinha) vinculo, mas ao termino vou deixar o projeto Open Source para quer quiser usar e verificar os códigos, e corrigindo… e aumentando, porque nao!! É um sistema de venda geral com servidor web tomcat e cliente magro desktop Swing, podendo ser extendido para outros tipos de clientes. Vou implementar no servidor a ferramenta OLAP Mondrian para a gerencia de informações e relatórios estáticos com drill…

Vou implementar tbm o envio para o servidor com HTTPClient, como o Luca me sugeriu em outro tópico, enviando e resgatando as informações com XML pelo XStream… acho que dessa forma a rede fica mais “leve” do que com objetos. No servidor será persistido com Hibernate e com banco Firebird, que ao meu ver é mais poderoso do que o MySQL. A lógica tentará ser o mais simples e funcional no servidor e não terá EBJ’s… o cliente terá os resources para internacionalização, mesmo no Swing.

Como é um projeto Open, estou tentando torná-lo o mais “internacional” possível. Sei que muita coisa aqui no brasil nao tem em outros países, mas tentei chegar perto disso. Gostaria tbm de pedir opinião sobre os nomes das classes e campos, bem como deixar mais perto internacionalmente, mas cobrindo a burocracia do Brasil… mas por favor, o enfoque será os relacionamentos e a arquitetura das classes… estou precisando mesmo para continuar o projeto.

A idéia do sistema é esta:
–> cadastro, alteração, exclusão e consulta de:
– cliente
– funcionario
– fornecedor
– produto
–> movimentações:
– venda
– compra
– pagamento
– recebimento

Possui tbm outras opções que não está mapeada no modelo pq não faz parte do “núcleo”, como comissões de funcionáios, impressões, relatórios e caixa.

A Venda possui um Cliente, que escolhe os Produtos (Itens de Venda) e, ao final, cria uma Conta a Receber, onde as parcelas são Itens de Conta a Receber. O recebimento é feito através desta classe de Itens de Conta a Receber. No caso eu somente atualizo o status da parcela como “finalizado”… e caso for reparcelado, eu cria outra Conta a Receber e os itens. Está legal?? Não está implementado o Pagamento das Compras ainda.

Sobre as heranças, eu sei que ela nao presta e etc, mas creio eu que neste caso, onde o que conta é o mapeamento de um punhado de classes “fixas”, reaproveitando métodos e atributos (nas abstratas há métodos get/set) e encaixa o É-UM, é mais simples e natural do que criar composições. O que acham?

Em Fornecedor há mais atributos que este aí, somente por efeito de simplicidade não mencionei.

Só lembrando da regra de que TODOS os atributos de uma classe TÊM QUE SER pertineteS a ela, achei que esse método feito ficou legal, mas não tenho muita experiência e vocês podem apontar os erros… não é intuito levar a discuções longas sobre herança, mas sobre a arquitetura apresentada…

Obrigado pela contribuição.
Após pronto, disponibilizarei a todos!

vlw

Joao Paulo :stuck_out_tongue:

ninguem galera?

Poderia ser criado uma classe Transactions agrupando Sale e Purchase ?? Por que eles possuem atributos iguais, mas Sale tem Client e Employee, e Purchase tem Supplier… no caso uma classe Transactions teria tudo, mas, quando instanciado como Sale, o atributo Supplier ficaria null… e se instanciado como Purchase, Client e Employee ficariam null…

Isso é legal?? Por que sempre aprendi a regra que todos os att tem que ser pertinentes à classe… mas matava duas classes (ou quatro se vermos tbm os itens)… dê uma olhada, note o atributo typeTransactioin em Transaction, ele pode ser Venda ou Compra… e em typeAccount de Account pode ser Pagamento ou Recebimento (pela facilidade já incorporei o pagamento). O que acham?

jopss :stuck_out_tongue:

Umm…já que Profile possui seu proprio id, não seria legal fazer uma composição para RG/CNPJ/Whatever?Vc pode penar nesse numRegister devido a formas diferentes de validar isso em diferentes países.No mais tá parecendo bacana.E a date de Transaction é um timestamp né?

Pode ser necessário vc redefinir o escopo, ou ao menos isolar os interesses melhor.As finalidades estão bem definidas(os requisitos)?Acho que antes do diagrama, deve sempre vir a “mãodelagem”, para vc dizer “tudo”(ou quase) do que o seu sistema precisa.

Vc diz do primeiro ou segundo diagrama acima? :roll:
Particulamente (nao quer dizer corretamente!), estou pensando no segundo… sim tenho os requisitos, mas estou interessando mais na modalegem das classes java… estaria correto se eu implementasse segundo o segundo modelo acima?

jopss :stuck_out_tongue:

[quote=jopss]Poderia ser criado uma classe Transactions agrupando Sale e Purchase ?? Por que eles possuem atributos iguais, mas Sale tem Client e Employee, e Purchase tem Supplier… no caso uma classe Transactions teria tudo, mas, quando instanciado como Sale, o atributo Supplier ficaria null… e se instanciado como Purchase, Client e Employee ficariam null…
[/quote]

Porque o conjuge não é um cliente ? Porque precisa do nome do pai e da mae ?
não é “sex” (sexo) é “gender” (genero)
Cada pessoa e suplyier só tem um numero de telefone e endereço ?

A pergunta não é : “Poderia ser criado uma classe Transactions agrupando Sale e Purchase ?? Por que eles possuem atributos iguais” . A pergunta é "Se Sale e Purchase têm campos iguais , singifica isso que são a mesma coisa ?"
A resposta é: sim, são transações. Então sim, faz sentido.
Pense transação bancária. Vc tem duas partes que transacionam. O valor da transação e o sentido da transação são dados dela. Por exemplo , Transação ( A , B , 100 ) é diferente de Transação ( B , A , 100 ).
Do ponto de vista de A e B existem debitos e creditos, mas do ponto de vista do banco existem transações.
Quando A transaciona com B ele pode fazer isso no caixa do banco. O Z que atender o A não aparece na trasnação bancária, mas poderia. Ele é um participante da transação. No seu caso, o Empregado é um participante e a transação é entre a empresa e o Customer ou o Suppier. Oque são o Customer e o Supplier do ponto de vista da empresa ? São as contrapartes.

Pense nisso…

P.S. Não é Client é Customer. Em portugues não ha destinção mas em ingles Client não indica relação comercial, Customer sim. É semelhante a Cliente e Consumidor …

Eu acho que eu me referia ao primeiro, mas vc editou eu nem sei mais…huaha :lol:
Mas como eu disse, vai depender mais do universo dos seus requisitos.
Algumas dicas do sérgio são bem válidas.

[quote]Porque precisa do nome do pai e da mae ?
[/quote]
Isso depende do grau de precisão do cadastro que ele quer, mas dependendo da necessidade, é melhor por em Person.Mas tem que tomar cuidado para o Cadastro não virar um Orkut.
E o termo “Sale” tb pode ser questionado, pois pode ser mais apropriado chamar de Order e ItemOrder, e por um flag para pagamento efetuado ou não.MAs o sistema pode ficar muito inchado, tudo depende do escopo.