-- Esquema do Banco de Dados para o Sistema de Gestão Montando Festa (PHP/MySQL)
-- Versão: 1.0
-- Data: 2025-04-27

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Estrutura da tabela `clientes`
--
CREATE TABLE IF NOT EXISTS `clientes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  `telefone` varchar(20) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `cpf_cnpj` varchar(20) DEFAULT NULL,
  `endereco_completo` text DEFAULT NULL,
  `data_cadastro` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_cpf_cnpj_unique` (`cpf_cnpj`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `vendedores`
--
CREATE TABLE IF NOT EXISTS `vendedores` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `telefone` varchar(20) DEFAULT NULL,
  `ativo` tinyint(1) NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `servicos_oferecidos`
--
CREATE TABLE IF NOT EXISTS `servicos_oferecidos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) NOT NULL,
  `descricao` text DEFAULT NULL,
  `preco_base` decimal(10,2) DEFAULT 0.00,
  `ativo` tinyint(1) NOT NULL DEFAULT 1,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `eventos`
--
CREATE TABLE IF NOT EXISTS `eventos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cliente_id` int(11) NOT NULL,
  `vendedor_id` int(11) DEFAULT NULL,
  `data_evento` date NOT NULL,
  `hora_evento` time DEFAULT NULL,
  `tipo_evento` varchar(100) DEFAULT NULL,
  `endereco` text DEFAULT NULL,
  `distancia_km` decimal(10,2) DEFAULT NULL,
  `voltagem` enum("110v","220v","ambos","não aplicável") DEFAULT "não aplicável",
  `facilidade_carga` enum("fácil","moderado","difícil","não aplicável") DEFAULT "não aplicável",
  `preco_final` decimal(10,2) NOT NULL DEFAULT 0.00,
  `forma_pagamento` varchar(100) DEFAULT NULL,
  `parcelas` int(11) DEFAULT 1,
  `comissao_percentual` decimal(5,2) DEFAULT 0.00,
  `valor_comissao` decimal(10,2) DEFAULT 0.00,
  `status_contrato` enum("PENDENTE","CONFIRMADO","CANCELADO","REALIZADO") NOT NULL DEFAULT "PENDENTE",
  `observacao` text DEFAULT NULL,
  `data_criacao` timestamp NOT NULL DEFAULT current_timestamp(),
  `data_atualizacao` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_cliente_id` (`cliente_id`),
  KEY `idx_vendedor_id` (`vendedor_id`),
  KEY `idx_data_evento` (`data_evento`),
  CONSTRAINT `fk_eventos_cliente` FOREIGN KEY (`cliente_id`) REFERENCES `clientes` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT `fk_eventos_vendedor` FOREIGN KEY (`vendedor_id`) REFERENCES `vendedores` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `evento_servicos`
--
CREATE TABLE IF NOT EXISTS `evento_servicos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `evento_id` int(11) NOT NULL,
  `servico_oferecido_id` int(11) NOT NULL,
  `quantidade` int(11) NOT NULL DEFAULT 1,
  `preco_unitario` decimal(10,2) NOT NULL DEFAULT 0.00,
  `preco_total_servico` decimal(10,2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_evento_servico_unique` (`evento_id`,`servico_oferecido_id`), -- Evita duplicar o mesmo serviço no mesmo evento
  KEY `idx_evento_id` (`evento_id`),
  KEY `idx_servico_oferecido_id` (`servico_oferecido_id`),
  CONSTRAINT `fk_evento_servicos_evento` FOREIGN KEY (`evento_id`) REFERENCES `eventos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_evento_servicos_servico` FOREIGN KEY (`servico_oferecido_id`) REFERENCES `servicos_oferecidos` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `pagamentos`
--
CREATE TABLE IF NOT EXISTS `pagamentos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `evento_id` int(11) NOT NULL,
  `data_pagamento` date NOT NULL,
  `valor_pago` decimal(10,2) NOT NULL,
  `metodo_pagamento` varchar(100) DEFAULT NULL,
  `observacao` text DEFAULT NULL,
  `data_registro` timestamp NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`id`),
  KEY `idx_evento_id_pagamento` (`evento_id`),
  CONSTRAINT `fk_pagamentos_evento` FOREIGN KEY (`evento_id`) REFERENCES `eventos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Estrutura da tabela `alertas`
--
CREATE TABLE IF NOT EXISTS `alertas` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `evento_id` int(11) DEFAULT NULL, -- Pode haver alertas não ligados a eventos específicos
  `tipo_alerta` enum("PAGAMENTO_PENDENTE","CONTRATO_NAO_ASSINADO","OUTRO") NOT NULL,
  `mensagem` text NOT NULL,
  `data_criacao` timestamp NOT NULL DEFAULT current_timestamp(),
  `resolvido` tinyint(1) NOT NULL DEFAULT 0,
  `data_resolucao` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_evento_id_alerta` (`evento_id`),
  KEY `idx_resolvido` (`resolvido`),
  CONSTRAINT `fk_alertas_evento` FOREIGN KEY (`evento_id`) REFERENCES `eventos` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

--
-- Dados Iniciais (Exemplos)
--

-- Inserir Vendedores Iniciais
INSERT INTO `vendedores` (`id`, `nome`, `email`, `telefone`, `ativo`) VALUES
(1, 'Vendedor Padrão', 'vendedor@montandofesta.com.br', '11999998888', 1),
(2, 'Ana Silva', 'ana.silva@email.com', '11988887777', 1);

-- Inserir Serviços Oferecidos Iniciais
INSERT INTO `servicos_oferecidos` (`id`, `nome`, `descricao`, `preco_base`, `ativo`) VALUES
(1, 'Decoração Básica', 'Inclui toalhas, arranjos simples.', 500.00, 1),
(2, 'DJ com Som e Iluminação', 'Equipamento completo para pista de dança.', 1200.00, 1),
(3, 'Buffet Infantil', 'Salgados, doces, bolo e bebidas para crianças.', 1500.00, 1),
(4, 'Fotografia (4 horas)', 'Cobertura fotográfica do evento.', 800.00, 1),
(5, 'Garçons (unidade)', 'Profissional para servir os convidados.', 150.00, 1);

COMMIT;

