-- =============================================
-- DOCE & SABOR - Versão MySQL (myCompiler)
-- =============================================

CREATE TABLE pessoas (
    cpf                 CHAR(11)        NOT NULL,
    nome                VARCHAR(100)    NOT NULL,
    email               VARCHAR(150)    NOT NULL,
    data_nascimento     DATE            NULL,
    senha_hash          VARCHAR(255)    NOT NULL,
    data_cadastro       DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    PRIMARY KEY (cpf),
    UNIQUE KEY uk_pessoas_email (email)
);

CREATE TABLE clientes (
    cpf                 CHAR(11)        NOT NULL,
    observacao          TEXT            NULL,
    data_ultima_compra  DATETIME        NULL,
    PRIMARY KEY (cpf),
    CONSTRAINT fk_clientes_pessoas 
        FOREIGN KEY (cpf) REFERENCES pessoas (cpf)
        ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE administradores (
    cpf                 CHAR(11)        NOT NULL,
    nivel_acesso        ENUM('operador','gerente','super') NOT NULL DEFAULT 'operador',
    data_admissao       DATE            NULL,
    PRIMARY KEY (cpf),
    CONSTRAINT fk_administradores_pessoas 
        FOREIGN KEY (cpf) REFERENCES pessoas (cpf)
        ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE telefones (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pessoa_cpf          CHAR(11)        NOT NULL,
    numero              VARCHAR(20)     NOT NULL,
    tipo                ENUM('celular','residencial','comercial','whatsapp','outro') NOT NULL,
    principal           TINYINT(1)      NOT NULL DEFAULT 0,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    CONSTRAINT fk_telefones_pessoas 
        FOREIGN KEY (pessoa_cpf) REFERENCES pessoas (cpf)
        ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE enderecos (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pessoa_cpf          CHAR(11)        NOT NULL,
    logradouro          VARCHAR(150)    NOT NULL,
    numero              VARCHAR(20)     NOT NULL,
    complemento         VARCHAR(80)     NULL,
    bairro              VARCHAR(80)     NOT NULL,
    cidade              VARCHAR(80)     NOT NULL,
    estado              CHAR(2)         NOT NULL,
    cep                 CHAR(8)         NOT NULL,
    ponto_referencia    VARCHAR(150)    NULL,
    principal           TINYINT(1)      NOT NULL DEFAULT 1,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    CONSTRAINT fk_enderecos_pessoas 
        FOREIGN KEY (pessoa_cpf) REFERENCES pessoas (cpf)
        ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE categorias (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    nome                VARCHAR(80)     NOT NULL,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    PRIMARY KEY (id),
    UNIQUE KEY uk_categorias_nome (nome)
);

CREATE TABLE produtos (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    categoria_id        INT UNSIGNED    NOT NULL,
    nome                VARCHAR(120)    NOT NULL,
    descricao           TEXT            NULL,
    preco               DECIMAL(10,2)   NOT NULL,
    quantidade_estoque  INT UNSIGNED    NOT NULL DEFAULT 0,
    estoque_minimo      INT UNSIGNED    NOT NULL DEFAULT 5,
    imagem_url          VARCHAR(255)    NULL,
    ativo               TINYINT(1)      NOT NULL DEFAULT 1,
    data_criacao        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    data_atualizacao    DATETIME        NULL ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    CONSTRAINT fk_produtos_categorias 
        FOREIGN KEY (categoria_id) REFERENCES categorias (id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

CREATE TABLE pedidos (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    numero_pedido       VARCHAR(20)     NOT NULL,
    cliente_cpf         CHAR(11)        NOT NULL,
    endereco_entrega_id INT UNSIGNED    NOT NULL,
    status              ENUM('pendente','pago','em_preparo','pronto','em_entrega','entregue','cancelado') 
                        NOT NULL DEFAULT 'pendente',
    valor_total         DECIMAL(10,2)   NOT NULL,
    observacao          TEXT            NULL,
    data_pedido         DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    data_atualizacao    DATETIME        NULL ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    UNIQUE KEY uk_pedidos_numero (numero_pedido),
    CONSTRAINT fk_pedidos_clientes 
        FOREIGN KEY (cliente_cpf) REFERENCES clientes (cpf)
        ON DELETE RESTRICT ON UPDATE CASCADE,
    CONSTRAINT fk_pedidos_enderecos 
        FOREIGN KEY (endereco_entrega_id) REFERENCES enderecos (id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

CREATE TABLE itens_pedido (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pedido_id           INT UNSIGNED    NOT NULL,
    produto_id          INT UNSIGNED    NOT NULL,
    quantidade          INT UNSIGNED    NOT NULL,
    preco_unitario      DECIMAL(10,2)   NOT NULL,
    subtotal            DECIMAL(10,2)   NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_itens_pedido (pedido_id, produto_id),
    CONSTRAINT fk_itens_pedido_pedidos 
        FOREIGN KEY (pedido_id) REFERENCES pedidos (id)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_itens_pedido_produtos 
        FOREIGN KEY (produto_id) REFERENCES produtos (id)
        ON DELETE RESTRICT ON UPDATE CASCADE
);

CREATE TABLE pagamentos (
    id                      INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pedido_id               INT UNSIGNED    NOT NULL,
    plataforma_externa_id   VARCHAR(100)    NOT NULL,
    status                  ENUM('pendente','aprovado','recusado','estornado') NOT NULL DEFAULT 'pendente',
    valor                   DECIMAL(10,2)   NOT NULL,
    metodo                  VARCHAR(50)     NOT NULL,
    data_pagamento          DATETIME        NULL,
    dados_retorno           JSON            NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_pagamentos_pedido (pedido_id),
    CONSTRAINT fk_pagamentos_pedidos 
        FOREIGN KEY (pedido_id) REFERENCES pedidos (id)
        ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE entregas (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pedido_id           INT UNSIGNED    NOT NULL,
    status_entrega      ENUM('aguardando','saiu_para_entrega','entregue','falha') 
                        NOT NULL DEFAULT 'aguardando',
    data_prevista       DATETIME        NULL,
    data_saida          DATETIME        NULL,
    data_entrega        DATETIME        NULL,
    administrador_cpf   CHAR(11)        NULL,
    observacao          TEXT            NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_entregas_pedido (pedido_id),
    CONSTRAINT fk_entregas_pedidos 
        FOREIGN KEY (pedido_id) REFERENCES pedidos (id)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_entregas_administradores 
        FOREIGN KEY (administrador_cpf) REFERENCES administradores (cpf)
        ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE recibos (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    pedido_id           INT UNSIGNED    NOT NULL,
    numero_recibo       VARCHAR(30)     NOT NULL,
    data_emissao        DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    caminho_pdf         VARCHAR(255)    NULL,
    gerado_por_cpf      CHAR(11)        NULL,
    PRIMARY KEY (id),
    UNIQUE KEY uk_recibos_pedido (pedido_id),
    UNIQUE KEY uk_recibos_numero (numero_recibo),
    CONSTRAINT fk_recibos_pedidos 
        FOREIGN KEY (pedido_id) REFERENCES pedidos (id)
        ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT fk_recibos_administradores 
        FOREIGN KEY (gerado_por_cpf) REFERENCES administradores (cpf)
        ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE movimentacoes_estoque (
    id                  INT UNSIGNED    NOT NULL AUTO_INCREMENT,
    produto_id          INT UNSIGNED    NOT NULL,
    tipo                ENUM('entrada','saida','ajuste') NOT NULL,
    quantidade          INT UNSIGNED    NOT NULL,
    motivo              VARCHAR(150)    NOT NULL,
    administrador_cpf   CHAR(11)        NULL,
    pedido_id           INT UNSIGNED    NULL,
    data                DATETIME        NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    CONSTRAINT fk_movimentacoes_produtos 
        FOREIGN KEY (produto_id) REFERENCES produtos (id)
        ON DELETE RESTRICT ON UPDATE CASCADE,
    CONSTRAINT fk_movimentacoes_administradores 
        FOREIGN KEY (administrador_cpf) REFERENCES administradores (cpf)
        ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT fk_movimentacoes_pedidos 
        FOREIGN KEY (pedido_id) REFERENCES pedidos (id)
        ON DELETE SET NULL ON UPDATE CASCADE
);
SHOW TABLES;

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: