Projeto Farmácia Paul Eduardo Costa Gabriel Cypriano Rodrigo Calhau Escopo do Sistema • Controle de Estoque – aviso automático de medicamentos com estoque abaixo de um limite configurável – aviso automático de lotes com validade próxima do vencimento (configurável) • Controle de Vendas • Controle de Funcionários • Controle de Clientes Projeto Conceitual – parte 1 Projeto Conceitual – parte 2 Projeto Conceitual (UML com atributos) Projeto Conceitual Diagrama de Estados - Lote Mapeamento de heranças • Herança parcial – Podem existir Vendas que não sejam VendaEntrega • Abordagem com apenas uma tabela utilizando flags não serve, pois não suporta atributos not null de VendaEntrega • Utilizamos abordagem de duas tabelas (superclasse e subclasse) Mapeamento de heranças • Herança total – Não podem existir PessoaFisica que não seja das subclasses • Herança sobreposta – Pode haver PessoaFisica que seja tanto Cliente quanto Funcionario • Abordagem com apenas uma tabela utilizando flags não serve, pois não suporta atributos not null de VendaEntrega • Abordagem com duas tabelas (subclasses) não serve, pois não é uma herança disjunta • Utilizamos abordagem de três tabelas (superclasse e subclasses) Outros Mapeamentos • Relação NxN com atributos ItemVenda foi mapeada para uma tabela item_venda • Atributo multivalorado Telefones de PessoaFisica foi mapeado para uma tabela telefones_pessoa_fisica (1a. Forma normal) • Atributos derivados foram mapeados nas Views Projeto Lógico 1FN – parte 1 Projeto Lógico 1FN – parte 2 Dependências Funcionais (diagrama parcial da 1FN) • Tabela Medicamento desnormalizada Dependências Funcionais (diagrama parcial da 3FN) • Tabela Medicamento desnormalizada Projeto Lógico 3FN (parcial) Criação do Schema • Domínios Criação do Schema • Tabelas (1) Criação do Schema • Tabelas (2) Criação do Schema • Tabelas (3) Criação do Schema • Tabelas (4) Criação do Schema • Tabelas (5) Criação do Schema • Tabelas (6) Criação do Schema • Tabelas (7) Criação do Schema • Tabelas (8) Criação do Schema • Tabelas (9) Criação do Schema • Tabelas (10) Criação do Schema • Views Criação do Schema • Restrições(1) Criação do Schema • Restrições(2) Consultas • Consulta 1: Dentre os funcionários que trabalham no caixa, recupere seu nome e o valor total de vendas efetuadas (quanto já vendeu), em ordem decrescente do valor de total de vendas. SELECT nome, SUM (valor_item) FROM item_venda, venda, pessoa_fisica WHERE (item_venda.num_boleto_fiscal = venda.num_boleto_fiscal) GROUP BY venda.cpf_caixa, nome, cpf HAVING pessoa_fisica.cpf = cpf_caixa ORDER BY SUM DESC Item_Venda Pessoa_fisica Venda Resultado Consultas • Consulta 2: Recupere o valor total de descontos concedidos, via cupons de desconto, por mês, ordenados por ordem decrescente de valor SELECT round(SUM(descontos.valor_desconto), 2) AS valor_descontos, descontos.mes FROM (SELECT (valor_item * 100 / (100 - desconto_medicamento)) AS valor_desconto, to_char(data, 'Month/ YYYY') AS mes FROM (item_venda NATURAL JOIN venda)) AS descontos GROUP BY descontos.mes ORDER BY SUM(descontos.valor_desconto) DESC; Plano de Execução Consultas • Consulta 3: • Enunciado: Recupere para cada funcionário o seu nome e o valor de descontos concedidos por ele em cada mês. • Consulta: Consultas • Consulta 3: Tabela funcionario VIEW valor_venda Tabela pessoa_fisica Resultado Consultas • Consulta 4: Dentre os clientes que residem na cidade de Vitória, recupere seu nome e o valor total de compras efetuadas, em ordem decrescente do valor total de compras efetuadas SELECT nome, SUM(item_venda.valor_item) FROM (((item_venda JOIN venda ON venda.num_boleto_fiscal = item_venda.num_boleto_fiscal) JOIN endereco ON endereco.cpf_pessoa_fisica = venda.cpf_cliente) JOIN pessoa_fisica ON pessoa_fisica.cpf = venda.cpf_cliente) WHERE endereco.cidade = 'Vitoria' GROUP BY pessoa_fisica.nome ORDER BY SUM DESC Resultado Consultas • Consulta 5: Recupere os nomes dos medicamentos mais vendidos, ordenados pelo número de unidades vendidas • • • • • SELECT nome, SUM(item_venda.num_unidades_medicamento) FROM ((item_venda JOIN lote ON codigo_lote=codigo) JOIN medicamento ON codigo_barras_medicamento=codigo_barras) GROUP BY medicamento.nome ORDER BY SUM(item_venda.num_unidades_medicamento) DESC; Resultado Consultas • Consulta 6: • Enunciado: Recupere para cada funcionário o seu nome e a quantidade de entregas por ele efetuada, em ordem decrescente do número de entregas. • Consulta: Consultas • Consulta 6: Tabela funcionario Tabela venda_entrega Tabela pessoa_fisica Resultado da Consulta Consultas • Consulta 7: Recupere a razão social e o número de lotes devolvidos por ano de cada distribuidor, em ordem decrescente de lotes devolvidos SELECT distribuidor.razao_social, COUNT(*) AS nDevolucoes FROM lote, distribuidor, devolucao_lote WHERE (lote.cnpj_distribuidor = distribuidor.cnpj AND devolucao_lote.codigo_lote = lote.codigo) GROUP BY distribuidor.razao_social ORDER BY COUNT(*) DESC Resultado Consultas • Consulta 8: Recupere para cada medicamento o seu nome e sua quantidade em estoque • • • • • SELECT nome, SUM(qtde_estoque) AS quantidade_estoque FROM (medicamento JOIN lote ON codigo_barras_medicamento=codigo_barras) WHERE lote.qtde_estoque > 0 GROUP BY nome ORDER BY SUM(qtde_estoque) DESC; Resultado Plano de Execução Consultas • Consulta 9: • Enunciado: Recupere para o conhecimento medicamento ‘Gadernal’ as dosagens existentes e a quantidade em estoque de cada uma das dosagens, ordenado pela quantidade em estoque. • Consulta: Consultas • Consulta 9: Tabela lote Tabela medicamento Resultado Consultas • Consulta 10: Recupere para as cidades com mais de 5 entregas o seu nome e a quantidade de entrega, em ordem decrescente do numero de entregas. • • • • • SELECT cidade, COUNT(*) AS nEntregas FROM (venda_entrega JOIN endereco ON venda_entrega.cpf_endereco = endereco.cpf_pessoa_fisica) GROUP BY cidade HAVING COUNT(*) > 5 ORDER BY nEntregas DESC Resultado Consultas • Consulta 11: Para cada cliente, recupere seu nome e a quantidade de cupons de desconto já utilizados por ele, ordenando pela ordem decrescente da quantidade de cupons • • • • • SELECT nome, SUM(item_venda.num_unidades_medicamento) FROM ((item_venda JOIN lote ON codigo_lote=codigo) JOIN medicamento ON codigo_barras_medicamento=codigo_barras) GROUP BY medicamento.nome ORDER BY SUM(item_venda.num_unidades_medicamento) DESC Resultado Consultas • Consulta 12: • Enunciado: Recupere a quantidade medicamentos genéricos contidos em vendas que foram entregues em Vila Velha. • Consulta: Consultas • Consulta 12: Tabela lote Tabela medicamento Consultas Tabela venda • Consulta 12: Tabela item_venda Resultado Consultas • Consulta 13: Recupere para cada lote cujo tempo de expiração seja menor que o especificado no medicamento que ele representa o nome do medicamento e a quantidade em estoque dele SELECT tempo_expiracao_lote.codigo, nome, qtde_estoque FROM (tempo_expiracao_lote JOIN medicamento ON codigo_barras_medicamento=codigo_barras) WHERE tempo_expiracao_lote.limite_dias_expiracao < medicamento.limite_dias_expiracao ORDER BY qtde_estoque DESC Resultado Plano de Execução Consultas • Consulta 14: • Enunciado: Recupere para cada lote o seu código e seu tempo de expiração em dias e o medicamento que ele refere. • Consulta: Consultas • Consulta 14: • Enunciado: Recupere para cada lote o seu código e seu tempo de expiração em dias e o medicamento que ele refere. • Consulta: Consultas • Consulta 14: VIEW tempo_expiracao_lote Resultado Tabela medicamento Consultas • Consulta 15: • Enunciado: Recupere para cada venda o numero do seu boleto, o nome do caixa que efetuou a venda, o nome do cliente (caso possua), o nome do entregador (caso possua) e o seu valor. • Consulta: Consultas • Consulta 15: View valor_entrega Tabela venda Tabela venda_entrega Consultas • Consulta 15: Tabela pessoa_fisica Resultado