Modelagem de fluxo de caixa para restaurante

MySQL

27/09/2018

Pessoal, boa tarde!

Estou modelando um sistema para restaurantes. Já tenho algumas tabelas prontas e muito provavelmente terei que modelar novas tabelas ou mudar a regra de negócio. Porém, no meu entendimento, a relação de todas as vendas com o caixa será o ponto crucial do sistema. Desta forma me encontro na seguinte situação.

Sei que em um caixa, cada venda pode ter vários itens. Ao final do lançamento dos itens, a subtração do valor recebido - total da compra - troco, deve ser acrescido ao saldo do caixa. Porém, embora tenha este conceito em mente, não tenho idéia de como modelar este caixa.

Na minha regra de negócio, o sistema cadastras as vendas na tabela "venda" e existem 3 tipos de venda: frente de caixa, internet e por comandas(mesas do restaurante).

Por favor, se alguém puder me ajudar, só preciso de uma orientação de como prosseguir para a modelagem deste caixa. O sistema em si será em java.

Críticas e sujestões sobre a modelagem geral são bem vindas!

Segue abaixo o código que já tenho.

Obrigado!

/*TABELA CAIXA*/
CREATE TABLE caixa(
cod_caixa INT(11) AUTO_INCREMENT PRIMARY KEY,
data_abertura TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
caixa_inicial DECIMAL(10,2) NOT NULL,
caixa_final DECIMAL(10,2) NOT NULL,
data_fechamento TIMESTAMP NOT NULL,
cod_usuario INT(11) NOT NULL,
saldo double NOT NULL,
status BOOL NOT NULL
) ENGINE = InnoDB;

/*TABELA CATEGORIA*/
CREATE TABLE categoria(
cod_categoria TINYINT(3) AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(40) NOT NULL,
cod_categoria_pai TINYINT(3)
) ENGINE = InnoDB;

/*TABELA PRODUTO*/
CREATE TABLE produto(
cod_produto MEDIUMINT(4) AUTO_INCREMENT PRIMARY KEY,
nome VARCHAR(50) NOT NULL,
cod_categoria TINYINT(3) NOT NULL,
lote VARCHAR(11) DEFAULT NULL,
preco_venda DECIMAL(10,2) NOT NULL,
estoque_minimo DOUBLE NOT NULL,
estoque_maximo DOUBLE NOT NULL,
ultima_compra TIMESTAMP
) ENGINE = InnoDB;

/*TABELA ENTRADA_PRODUTO*/
CREATE TABLE entrada_produto(
cod_entrada INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_produto MEDIUMINT(4) NOT NULL,
quantidade DOUBLE NOT NULL,
cod_motivo CHAR(1) NOT NULL,
data TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
cod_usuario INT(11) NOT NULL
) ENGINE = InnoDB;

/*TABELA SAIDA_PRODUTO*/
CREATE TABLE saida_produto(
cod_saida INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_produto MEDIUMINT(4) NOT NULL,
quantidade DOUBLE NOT NULL,
cod_motivo CHAR(1) NOT NULL,
data TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
cod_usuario INT(11) NOT NULL
) ENGINE = InnoDB;

/*TABELA MOTIVO*/
CREATE TABLE motivo(
cod_motivo TINYINT(2) NOT NULL PRIMARY KEY,
nome VARCHAR(30)
) ENGINE = InnoDB;

/*TABELA ESTOQUE*/
CREATE TABLE estoque(
cod_produto MEDIUMINT(4) PRIMARY KEY,
quantidade double NOT NULL
) ENGINE = InnoDB;

/*TABELA PEDIDO*/
CREATE TABLE pedido(
cod_pedido INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_cliente INT(11) NOT NULL,
cod_forma_pagamento TINYINT NOT NULL,
cod_endereco_cobranca INT(11) NOT NULL,
cod_endereco_entrega INT(11) NOT NULL,
data TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status CHAR(1) DEFAULT ''1''
) ENGINE = InnoDB;

/*TABELA PEDIDO_ITEM*/
CREATE TABLE pedido_item(
cod_pedido INT(11) NOT NULL,
cod_produto MEDIUMINT(4) NOT NULL,
quantidade double NOT NULL,
PRIMARY KEY(cod_pedido, cod_produto)
) ENGINE = InnoDB;

/*TABELA FORMA_PAGAMENTO*/
CREATE TABLE forma_pagamento(
cod_forma_pagamento TINYINT NOT NULL PRIMARY KEY,
nome VARCHAR(30) NOT NULL
) ENGINE = InnoDB;

/*TABELA ENTREGA*/
CREATE TABLE entrega(
cod_entrega INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_pedido INT(11) NOT NULL,
data TIMESTAMP,
status CHAR(1) NOT NULL
) ENGINE = InnoDB;

/*TABELA MESA*/
CREATE TABLE mesa(
cod_mesa TINYINT(3) AUTO_INCREMENT PRIMARY KEY,
status CHAR(1) DEFAULT ''0'',
cod_usuario INT(11) NULL
) ENGINE = InnoDB;

/*TABELA COMANDA*/
CREATE TABLE comanda(
cod_comanda CHAR(7) NOT NULL PRIMARY KEY,
cod_mesa TINYINT(3) NOT NULL,
hora_abertura TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
cod_usuario INT(11) NOT NULL
) ENGINE = InnoDB;

/*TABELA COMANDA_ITEM*/
CREATE TABLE comanda_item(
cod_comanda CHAR(7) NOT NULL,
cod_item TINYINT(2) NOT NULL PRIMARY KEY,
cod_produto MEDIUMINT(4) NOT NULL,
quatidade DOUBLE NOT NULL,
hora_pedido TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
cod_usuario INT(11) NOT NULL,
PRIMARY KEY(cod_comanda, cod_produto)
) ENGINE = InnoDB;

/*TABLE TIPO_VENDA*/
CREATE TABLE tipo_venda(
cod_tipo_venda TINYINT NOT NULL PRIMARY KEY,
nome VARCHAR(20)
) ENGINE = InnoDB;

/*TABELA VENDA*/
CREATE TABLE venda(
cod_venda INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_tipo_venda TINYINT NOT NULL,
cod_produto MEDIUMINT(4) NOT NULL,
quantidade DOUBLE NOT NULL,
data TIMESTAMP NOT NULL,
total DECIMAL(10,2) NOT NULL,
cod_usuario INT(11) NOT NULL
) ENGINE = InnoDB;

/*TABELA COMPRA*/
CREATE TABLE compra(
cod_compra INT(11) AUTO_INCREMENT PRIMARY KEY,
cod_produto MEDIUMINT(4) NOT NULL,
quantidade DOUBLE NOT NULL,
data TIMESTAMP NOT NULL,
total DECIMAL(10,2) NOT NULL,
cod_usuario INT(11) NOT NULL
) ENGINE = InnoDB;

/*TABELA USUARIO*/
CREATE TABLE usuario(
cod_usuario INT(11) AUTO_INCREMENT PRIMARY KEY,
login VARCHAR(20) NOT NULL,
senha VARCHAR(100) NOT NULL,
cod_tipo_proprietario CHAR(1) NOT NULL,
cod_proprietario INT(11) NOT NULL
) ENGINE = InnoDB;

ALTER TABLE produto ADD FOREIGN KEY(cod_categoria) REFERENCES categoria(cod_categoria);
ALTER TABLE categoria ADD FOREIGN KEY(cod_categoria_pai) REFERENCES categoria(cod_categoria);
ALTER TABLE cliente ADD FOREIGN KEY(cod_tipo_proprietario) REFERENCES tipo_proprietario(cod_tipo_proprietario);
ALTER TABLE usuario ADD FOREIGN KEY(cod_tipo_proprietario) REFERENCES tipo_proprietario(cod_tipo_proprietario);

ALTER TABLE entrada_produto ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE entrada_produto ADD FOREIGN KEY(cod_motivo) REFERENCES motivo(cod_motivo);
ALTER TABLE entrada_produto ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE saida_produto ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE saida_produto ADD FOREIGN KEY(cod_motivo) REFERENCES motivo(cod_motivo);
ALTER TABLE saida_produto ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE pedido ADD FOREIGN KEY(cod_cliente) REFERENCES cliente(cod_cliente);
ALTER TABLE pedido ADD FOREIGN KEY(cod_forma_pagamento) REFERENCES forma_pagamento(cod_forma_pagamento);
ALTER TABLE pedido ADD FOREIGN KEY(cod_endereco_cobranca) REFERENCES endereco(cod_endereco);
ALTER TABLE pedido ADD FOREIGN KEY(cod_endereco_entrega) REFERENCES endereco(cod_endereco);

ALTER TABLE pedido_item ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE estoque ADD FOREIGN KEY(cod_produto) REFERENCES produto(produto);
ALTER TABLE entrega ADD FOREIGN KEY(cod_pedido) REFERENCES pedido(cod_pedido);

ALTER TABLE venda ADD FOREIGN KEY(cod_tipo_venda) REFERENCES tipo_venda(cod_tipo_venda);
ALTER TABLE venda ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE venda ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE compra ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE compra ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE mesa ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE comanda ADD FOREIGN KEY(cod_mesa) REFERENCES mesa(cod_mesa);
ALTER TABLE comanda ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE comanda_item ADD FOREIGN KEY(cod_comanda) REFERENCES comanda(cod_comanda);
ALTER TABLE comanda_item ADD FOREIGN KEY(cod_produto) REFERENCES produto(cod_produto);
ALTER TABLE comanda_item ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);

ALTER TABLE caixa ADD FOREIGN KEY(cod_usuario) REFERENCES usuario(cod_usuario);
Paulo

Paulo

Curtidas 0
POSTAR