-- Creación de la base de datos para FELGAR E HIJOS S.L. (Versión Avanzada MVC - SPA)
CREATE DATABASE IF NOT EXISTS gestion_felgar CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE gestion_felgar;

-- 2. Tabla de Configuración de la Empresa e IPSI
CREATE TABLE IF NOT EXISTS sf_configuracion (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre_empresa VARCHAR(150) NOT NULL,
    cif_nif VARCHAR(20) NOT NULL,
    direccion VARCHAR(255) NOT NULL,
    codigo_postal VARCHAR(10) NOT NULL,
    ciudad VARCHAR(100) NOT NULL,
    telefono VARCHAR(20),
    email VARCHAR(100),
    porcentaje_ipsi DECIMAL(5,2) NOT NULL DEFAULT 4.00,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 3. Tabla de Clientes
CREATE TABLE IF NOT EXISTS sf_clientes (
    id INT AUTO_INCREMENT PRIMARY KEY,
    razon_social VARCHAR(150) NOT NULL,
    cif_nif VARCHAR(20) NOT NULL,
    direccion VARCHAR(255) NOT NULL,
    codigo_postal VARCHAR(10) NOT NULL,
    ciudad VARCHAR(100) NOT NULL,
    telefono VARCHAR(20),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 4. Nuevo Módulo: Catálogo de Conceptos (Autocompletado)
CREATE TABLE IF NOT EXISTS sf_catalogo_conceptos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) UNIQUE NULL,
    descripcion TEXT NOT NULL,
    precio_base DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- 5. Tabla de Presupuestos (Cabecera)
CREATE TABLE IF NOT EXISTS sf_presupuestos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numero_presupuesto VARCHAR(50) NOT NULL UNIQUE,
    fecha DATE NOT NULL,
    cliente_id INT NOT NULL,
    base_imponible DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    porcentaje_ipsi DECIMAL(5,2) NOT NULL DEFAULT 4.00,
    importe_ipsi DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    total DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    estado ENUM('Borrador', 'Enviado', 'Aceptado', 'Rechazado', 'Facturado') DEFAULT 'Borrador',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_sf_presupuestos_clientes FOREIGN KEY (cliente_id) REFERENCES sf_clientes(id) ON DELETE RESTRICT
) ENGINE=InnoDB;

-- 6. Tabla de Líneas de Presupuesto (Detalle)
CREATE TABLE IF NOT EXISTS sf_lineas_presupuesto (
    id INT AUTO_INCREMENT PRIMARY KEY,
    presupuesto_id INT NOT NULL,
    descripcion TEXT NOT NULL,
    num_operarios INT NULL,
    num_dias INT NULL,
    num_horas DECIMAL(10,2) NULL,
    precio_hora DECIMAL(10,2) NULL,
    total_linea DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_sf_lineas_presupuestos FOREIGN KEY (presupuesto_id) REFERENCES sf_presupuestos(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- 7. Tabla de Facturas (Cabecera)
CREATE TABLE IF NOT EXISTS sf_facturas (
    id INT AUTO_INCREMENT PRIMARY KEY,
    numero_factura VARCHAR(50) NOT NULL UNIQUE,
    fecha DATE NOT NULL,
    cliente_id INT NOT NULL,
    presupuesto_origen_id INT NULL COMMENT 'Trazabilidad con el presupuesto original',
    base_imponible DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    porcentaje_ipsi DECIMAL(5,2) NOT NULL DEFAULT 4.00,
    importe_ipsi DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    total DECIMAL(10,2) NOT NULL DEFAULT 0.00,
    estado ENUM('Pendiente', 'Cobro Parcial', 'Pagada', 'Anulada') DEFAULT 'Pendiente',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_sf_facturas_clientes FOREIGN KEY (cliente_id) REFERENCES sf_clientes(id) ON DELETE RESTRICT,
    CONSTRAINT fk_sf_facturas_presupuestos FOREIGN KEY (presupuesto_origen_id) REFERENCES sf_presupuestos(id) ON DELETE SET NULL
) ENGINE=InnoDB;

-- 8. Tabla de Líneas de Factura (Detalle)
CREATE TABLE IF NOT EXISTS sf_lineas_factura (
    id INT AUTO_INCREMENT PRIMARY KEY,
    factura_id INT NOT NULL,
    descripcion TEXT NOT NULL,
    num_operarios INT NULL,
    num_dias INT NULL,
    num_horas DECIMAL(10,2) NULL,
    precio_hora DECIMAL(10,2) NULL,
    total_linea DECIMAL(10,2) NOT NULL,
    CONSTRAINT fk_sf_lineas_facturas FOREIGN KEY (factura_id) REFERENCES sf_facturas(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- 9. Nuevo Módulo: Control de Pagos / Certificaciones (Deuda Pendiente)
CREATE TABLE IF NOT EXISTS sf_pagos_factura (
    id INT AUTO_INCREMENT PRIMARY KEY,
    factura_id INT NOT NULL,
    fecha_pago DATE NOT NULL,
    importe DECIMAL(10,2) NOT NULL,
    metodo_pago ENUM('Transferencia', 'Efectivo', 'Cheque', 'Otro') DEFAULT 'Transferencia',
    observaciones TEXT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_sf_pagos_facturas FOREIGN KEY (factura_id) REFERENCES sf_facturas(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- 10. Nuevo Módulo: Control de Gastos (Rentabilidad de la Obra)
CREATE TABLE IF NOT EXISTS sf_gastos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    presupuesto_id INT NULL COMMENT 'A qué obra/presupuesto se imputa este gasto',
    proveedor VARCHAR(150) NOT NULL,
    numero_factura_proveedor VARCHAR(50) NULL,
    fecha DATE NOT NULL,
    concepto VARCHAR(255) NOT NULL,
    base_imponible DECIMAL(10,2) NOT NULL,
    porcentaje_ipsi DECIMAL(5,2) DEFAULT 0.00,
    total DECIMAL(10,2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_sf_gastos_presupuestos FOREIGN KEY (presupuesto_id) REFERENCES sf_presupuestos(id) ON DELETE SET NULL
) ENGINE=InnoDB;

-- Insertar Empresa
INSERT INTO sf_configuracion (nombre_empresa, cif_nif, direccion, codigo_postal, ciudad, porcentaje_ipsi)
VALUES ('FELGAR E HIJOS S.L.', 'B12345678', 'Calle Principal, 1', '52001', 'Melilla', 4.00);

-- Insertar Conceptos de Ejemplo
INSERT INTO sf_catalogo_conceptos (codigo, descripcion, precio_base) VALUES
('SRV-01', 'ALQUILER, MONTAJE Y DESMONTAJE DE ANDAMIO TUBULAR EUROPEO', 25.50),
('MAT-01', 'SACO DE CEMENTO PORTLAND 25KG', 4.20),
('MO-01', 'HORA DE OFICIAL DE PRIMERA ALBAÑILERÍA', 18.00);