-- Módulo PCP (Planejamento e Controle de Produção)

-- ============================================
-- BOM (Bill of Materials - Lista de Materiais)
-- ============================================

CREATE TABLE IF NOT EXISTS bom (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Produto final (pai)
    product_id BIGINT UNSIGNED NOT NULL,
    
    -- Versão do BOM
    versao VARCHAR(20) NOT NULL DEFAULT '1.0',
    descricao VARCHAR(255) NULL,
    
    -- Status
    status ENUM('rascunho', 'ativo', 'inativo', 'obsoleto') DEFAULT 'rascunho',
    ativo BOOLEAN DEFAULT FALSE,
    
    -- Quantidade base
    quantidade_base DECIMAL(18,3) NOT NULL DEFAULT 1.0, -- Quantidade do produto final
    
    -- Custo
    custo_total DECIMAL(18,2) DEFAULT 0,
    custo_mao_obra DECIMAL(18,2) DEFAULT 0,
    custo_materiais DECIMAL(18,2) DEFAULT 0,
    
    -- Metadados
    created_by INT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_product (product_id),
    INDEX idx_status (status),
    INDEX idx_versao (versao)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Itens do BOM (componentes)
CREATE TABLE IF NOT EXISTS bom_items (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    bom_id BIGINT UNSIGNED NOT NULL,
    
    -- Componente
    component_product_id BIGINT UNSIGNED NOT NULL, -- Produto componente
    
    -- Quantidade necessária
    quantidade DECIMAL(18,3) NOT NULL DEFAULT 1.0,
    unidade_medida VARCHAR(20) NULL, -- kg, m, un, etc
    
    -- Custo unitário (para cálculo)
    custo_unitario DECIMAL(18,2) DEFAULT 0,
    
    -- Sequência (ordem de uso)
    sequencia INT NOT NULL DEFAULT 1,
    
    -- Tipo de componente
    tipo ENUM('material', 'subproduto', 'servico', 'outro') DEFAULT 'material',
    
    -- Metadados
    observacoes TEXT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_bom (bom_id),
    INDEX idx_component (component_product_id),
    INDEX idx_sequencia (sequencia),
    FOREIGN KEY (bom_id) REFERENCES bom(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- ROTEIROS DE PRODUÇÃO
-- ============================================

CREATE TABLE IF NOT EXISTS production_routing (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Produto
    product_id BIGINT UNSIGNED NOT NULL,
    
    -- Dados do roteiro
    nome VARCHAR(255) NOT NULL,
    descricao TEXT NULL,
    versao VARCHAR(20) NOT NULL DEFAULT '1.0',
    
    -- Status
    status ENUM('rascunho', 'ativo', 'inativo') DEFAULT 'rascunho',
    ativo BOOLEAN DEFAULT FALSE,
    
    -- Tempo total estimado
    tempo_setup_minutos INT DEFAULT 0, -- Tempo de setup/preparação
    tempo_processamento_minutos INT DEFAULT 0, -- Tempo de processamento por unidade
    tempo_total_minutos INT DEFAULT 0, -- Tempo total (setup + processamento)
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_product (product_id),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Operações do roteiro
CREATE TABLE IF NOT EXISTS routing_operations (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    routing_id BIGINT UNSIGNED NOT NULL,
    
    -- Dados da operação
    nome VARCHAR(255) NOT NULL,
    descricao TEXT NULL,
    sequencia INT NOT NULL DEFAULT 1,
    
    -- Centro de trabalho/Máquina
    centro_trabalho_id BIGINT UNSIGNED NULL,
    maquina_id BIGINT UNSIGNED NULL,
    
    -- Tempos
    tempo_setup_minutos INT DEFAULT 0,
    tempo_processamento_minutos INT DEFAULT 0,
    tempo_espera_minutos INT DEFAULT 0,
    
    -- Recursos necessários
    operadores_necessarios INT DEFAULT 1,
    
    -- Metadados
    observacoes TEXT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_routing (routing_id),
    INDEX idx_sequencia (sequencia),
    FOREIGN KEY (routing_id) REFERENCES production_routing(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- ORDENS DE PRODUÇÃO
-- ============================================

CREATE TABLE IF NOT EXISTS production_orders (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Dados básicos
    numero VARCHAR(50) NOT NULL,
    product_id BIGINT UNSIGNED NOT NULL, -- Produto a ser produzido
    
    -- Quantidades
    quantidade_solicitada DECIMAL(18,3) NOT NULL,
    quantidade_produzida DECIMAL(18,3) DEFAULT 0,
    quantidade_aprovada DECIMAL(18,3) DEFAULT 0,
    quantidade_rejeitada DECIMAL(18,3) DEFAULT 0,
    
    -- BOM e Roteiro
    bom_id BIGINT UNSIGNED NULL,
    routing_id BIGINT UNSIGNED NULL,
    
    -- Datas
    data_solicitacao DATE NOT NULL,
    data_inicio_prevista DATE NULL,
    data_fim_prevista DATE NULL,
    data_inicio_real DATE NULL,
    data_fim_real DATE NULL,
    
    -- Status
    status ENUM('rascunho', 'pendente_aprovacao', 'aprovada', 'em_producao', 'pausada', 'finalizada', 'cancelada') DEFAULT 'rascunho',
    
    -- Prioridade
    prioridade ENUM('baixa', 'normal', 'alta', 'urgente') DEFAULT 'normal',
    
    -- Custos
    custo_previsto DECIMAL(18,2) DEFAULT 0,
    custo_real DECIMAL(18,2) DEFAULT 0,
    
    -- Aprovação
    aprovado_por INT NULL,
    data_aprovacao DATETIME NULL,
    
    -- Metadados
    observacoes TEXT NULL,
    created_by INT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_product (product_id),
    INDEX idx_status (status),
    INDEX idx_numero (numero),
    INDEX idx_datas (data_inicio_prevista, data_fim_prevista),
    UNIQUE KEY uk_tenant_numero (tenant_id, numero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Apontamentos de produção
CREATE TABLE IF NOT EXISTS production_apontamentos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    order_id BIGINT UNSIGNED NOT NULL,
    operation_id BIGINT UNSIGNED NULL, -- Operação do roteiro
    
    -- Dados do apontamento
    tipo ENUM('inicio', 'pausa', 'retomada', 'fim', 'quantidade', 'qualidade') NOT NULL,
    
    -- Quantidades
    quantidade_produzida DECIMAL(18,3) DEFAULT 0,
    quantidade_aprovada DECIMAL(18,3) DEFAULT 0,
    quantidade_rejeitada DECIMAL(18,3) DEFAULT 0,
    
    -- Tempos
    data_hora DATETIME NOT NULL,
    tempo_decorrido_minutos INT NULL,
    
    -- Qualidade
    qualidade_status ENUM('aprovado', 'rejeitado', 'pendente') NULL,
    motivo_rejeicao VARCHAR(255) NULL,
    
    -- Operador
    operador_id INT NULL,
    
    -- Metadados
    observacoes TEXT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_order (order_id),
    INDEX idx_operation (operation_id),
    INDEX idx_tipo (tipo),
    INDEX idx_data_hora (data_hora),
    FOREIGN KEY (order_id) REFERENCES production_orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Consumo de materiais na produção
CREATE TABLE IF NOT EXISTS production_material_consumption (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    order_id BIGINT UNSIGNED NOT NULL,
    
    -- Material consumido
    material_product_id BIGINT UNSIGNED NOT NULL,
    bom_item_id BIGINT UNSIGNED NULL, -- Referência ao item do BOM
    
    -- Quantidades
    quantidade_prevista DECIMAL(18,3) NOT NULL,
    quantidade_consumida DECIMAL(18,3) DEFAULT 0,
    
    -- Lote/Serie (se aplicável)
    lote_id BIGINT UNSIGNED NULL,
    serial_id BIGINT UNSIGNED NULL,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_order (order_id),
    INDEX idx_material (material_product_id),
    INDEX idx_bom_item (bom_item_id),
    FOREIGN KEY (order_id) REFERENCES production_orders(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================
-- CENTROS DE TRABALHO E MÁQUINAS
-- ============================================

CREATE TABLE IF NOT EXISTS work_centers (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    
    -- Dados básicos
    codigo VARCHAR(50) NOT NULL,
    nome VARCHAR(255) NOT NULL,
    descricao TEXT NULL,
    
    -- Capacidade
    capacidade_horaria DECIMAL(18,2) DEFAULT 8.0, -- Horas por dia
    operadores_max INT DEFAULT 1,
    
    -- Status
    status ENUM('ativo', 'inativo', 'manutencao') DEFAULT 'ativo',
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_codigo (codigo),
    INDEX idx_status (status),
    UNIQUE KEY uk_tenant_codigo (tenant_id, codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS machines (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    tenant_id VARCHAR(100) NOT NULL,
    work_center_id BIGINT UNSIGNED NULL,
    
    -- Dados básicos
    codigo VARCHAR(50) NOT NULL,
    nome VARCHAR(255) NOT NULL,
    descricao TEXT NULL,
    fabricante VARCHAR(255) NULL,
    modelo VARCHAR(255) NULL,
    numero_serie VARCHAR(100) NULL,
    
    -- Status
    status ENUM('ativo', 'inativo', 'manutencao', 'defeito') DEFAULT 'ativo',
    
    -- Manutenção
    proxima_manutencao DATE NULL,
    horas_uso_total INT DEFAULT 0,
    horas_uso_ultima_manutencao INT DEFAULT 0,
    
    -- Metadados
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    
    INDEX idx_tenant (tenant_id),
    INDEX idx_work_center (work_center_id),
    INDEX idx_codigo (codigo),
    INDEX idx_status (status),
    UNIQUE KEY uk_tenant_codigo (tenant_id, codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

