CREATE DATABASE IF NOT EXISTS hm
  CHARACTER SET utf8mb4
  COLLATE utf8mb4_unicode_ci;

USE hm;

CREATE TABLE IF NOT EXISTS roles (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(80) NOT NULL UNIQUE,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS usuarios (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  rol_id INT UNSIGNED NULL,
  usuario VARCHAR(80) NOT NULL UNIQUE,
  nombre VARCHAR(150) NOT NULL,
  email VARCHAR(150) NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_usuarios_roles
    FOREIGN KEY (rol_id) REFERENCES roles(id)
    ON UPDATE CASCADE
    ON DELETE SET NULL
) ENGINE=InnoDB;

ALTER TABLE usuarios
  ADD COLUMN IF NOT EXISTS ultimo_acceso DATETIME NULL AFTER activo;

CREATE TABLE IF NOT EXISTS auditoria (
  id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  usuario_id INT UNSIGNED NULL,
  accion VARCHAR(50) NOT NULL,
  tabla_afectada VARCHAR(100) NULL,
  registro_id INT NULL,
  detalle TEXT NULL,
  ip VARCHAR(45) NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_auditoria_usuario (usuario_id),
  INDEX idx_auditoria_creado_en (creado_en),
  CONSTRAINT fk_auditoria_usuarios
    FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
    ON UPDATE CASCADE
    ON DELETE SET NULL
) ENGINE=InnoDB;

INSERT INTO roles (nombre)
VALUES ('Administrador')
ON DUPLICATE KEY UPDATE nombre = VALUES(nombre);

INSERT INTO usuarios (rol_id, usuario, nombre, email, password_hash, activo)
SELECT id, 'admin', 'Administrador', 'admin@hm.local',
       '$2y$10$lfHehRg4t.scaYUla2rysOTq3k9BqE.PzvLzn9JFwo3zaF1Svyciq', 1
FROM roles
WHERE nombre = 'Administrador'
ON DUPLICATE KEY UPDATE
  rol_id = VALUES(rol_id),
  nombre = VALUES(nombre),
  password_hash = VALUES(password_hash),
  activo = 1;

CREATE TABLE IF NOT EXISTS departamentos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(120) NOT NULL UNIQUE,
  descripcion VARCHAR(255) NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS cargos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  departamento_id INT UNSIGNED NULL,
  nombre VARCHAR(120) NOT NULL,
  descripcion VARCHAR(255) NULL,
  salario_referencia DECIMAL(14,2) NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_cargos_departamentos FOREIGN KEY (departamento_id)
    REFERENCES departamentos(id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS colaboradores (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  codigo VARCHAR(30) NOT NULL UNIQUE,
  nombres VARCHAR(100) NOT NULL,
  apellidos VARCHAR(100) NOT NULL,
  documento VARCHAR(30) NOT NULL UNIQUE,
  fecha_nacimiento DATE NULL,
  email VARCHAR(150) NULL,
  telefono VARCHAR(40) NULL,
  direccion VARCHAR(255) NULL,
  banco VARCHAR(120) NULL,
  cuenta VARCHAR(80) NULL,
  alias_cuenta VARCHAR(120) NULL,
  departamento_id INT UNSIGNED NULL,
  cargo_id INT UNSIGNED NULL,
  fecha_ingreso DATE NOT NULL,
  tipo_contrato ENUM('Indefinido','Plazo fijo','Temporal','Servicios') NOT NULL DEFAULT 'Indefinido',
  salario_base DECIMAL(14,2) NOT NULL DEFAULT 0,
  estado ENUM('Activo','Inactivo','Suspendido','Desvinculado') NOT NULL DEFAULT 'Activo',
  contacto_emergencia VARCHAR(150) NULL,
  telefono_emergencia VARCHAR(40) NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_colaboradores_departamentos FOREIGN KEY (departamento_id)
    REFERENCES departamentos(id) ON UPDATE CASCADE ON DELETE SET NULL,
  CONSTRAINT fk_colaboradores_cargos FOREIGN KEY (cargo_id)
    REFERENCES cargos(id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

ALTER TABLE colaboradores
  MODIFY fecha_ingreso DATE NULL,
  ADD COLUMN IF NOT EXISTS banco VARCHAR(120) NULL AFTER direccion,
  ADD COLUMN IF NOT EXISTS cuenta VARCHAR(80) NULL AFTER banco,
  ADD COLUMN IF NOT EXISTS alias_cuenta VARCHAR(120) NULL AFTER cuenta;

CREATE TABLE IF NOT EXISTS asistencias (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  fecha DATE NOT NULL,
  hora_entrada TIME NULL,
  hora_salida TIME NULL,
  estado ENUM('Presente','Ausente','Tardanza','Teletrabajo') NOT NULL DEFAULT 'Presente',
  observacion VARCHAR(255) NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_asistencia_colaborador_fecha (colaborador_id, fecha),
  CONSTRAINT fk_asistencias_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS ausencias (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  tipo ENUM('Vacaciones','Permiso','Reposo médico','Maternidad/Paternidad','Otro') NOT NULL,
  fecha_desde DATE NOT NULL,
  fecha_hasta DATE NOT NULL,
  dias DECIMAL(6,2) NOT NULL DEFAULT 1,
  motivo VARCHAR(255) NULL,
  estado ENUM('Pendiente','Aprobado','Rechazado') NOT NULL DEFAULT 'Pendiente',
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_ausencias_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS nominas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  periodo VARCHAR(7) NOT NULL,
  salario_base DECIMAL(14,2) NOT NULL DEFAULT 0,
  horas_extra DECIMAL(14,2) NOT NULL DEFAULT 0,
  bonificaciones DECIMAL(14,2) NOT NULL DEFAULT 0,
  adicionales DECIMAL(14,2) NOT NULL DEFAULT 0,
  descuentos DECIMAL(14,2) NOT NULL DEFAULT 0,
  total_neto DECIMAL(14,2) NOT NULL DEFAULT 0,
  estado ENUM('Abierta','Procesado','Pagado','Cerrado') NOT NULL DEFAULT 'Abierta',
  fecha_pago DATE NULL,
  cerrado_en DATETIME NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_nomina_colaborador_periodo (colaborador_id, periodo),
  CONSTRAINT fk_nominas_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

ALTER TABLE nominas
  MODIFY estado ENUM('Borrador','Abierta','Procesado','Pagado','Cerrado') NOT NULL DEFAULT 'Abierta',
  ADD COLUMN IF NOT EXISTS adicionales DECIMAL(14,2) NOT NULL DEFAULT 0 AFTER bonificaciones,
  ADD COLUMN IF NOT EXISTS cerrado_en DATETIME NULL AFTER fecha_pago;

UPDATE nominas SET estado='Abierta' WHERE estado='Borrador';

ALTER TABLE nominas
  MODIFY estado ENUM('Abierta','Procesado','Pagado','Cerrado') NOT NULL DEFAULT 'Abierta';

CREATE TABLE IF NOT EXISTS descuentos_recurrentes (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  concepto VARCHAR(150) NOT NULL,
  monto DECIMAL(14,2) NOT NULL DEFAULT 0,
  desde_periodo VARCHAR(7) NOT NULL,
  hasta_periodo VARCHAR(7) NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_descuentos_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS nomina_descuentos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nomina_id INT UNSIGNED NOT NULL,
  descuento_recurrente_id INT UNSIGNED NULL,
  concepto VARCHAR(150) NOT NULL,
  monto DECIMAL(14,2) NOT NULL DEFAULT 0,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_nomina_descuentos_nomina FOREIGN KEY (nomina_id)
    REFERENCES nominas(id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT fk_nomina_descuentos_recurrente FOREIGN KEY (descuento_recurrente_id)
    REFERENCES descuentos_recurrentes(id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS adicionales_recurrentes (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  concepto VARCHAR(150) NOT NULL,
  monto DECIMAL(14,2) NOT NULL DEFAULT 0,
  desde_periodo VARCHAR(7) NOT NULL,
  hasta_periodo VARCHAR(7) NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_adicionales_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS nomina_adicionales (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nomina_id INT UNSIGNED NOT NULL,
  adicional_recurrente_id INT UNSIGNED NULL,
  concepto VARCHAR(150) NOT NULL,
  monto DECIMAL(14,2) NOT NULL DEFAULT 0,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_nomina_adicionales_nomina FOREIGN KEY (nomina_id)
    REFERENCES nominas(id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT fk_nomina_adicionales_recurrente FOREIGN KEY (adicional_recurrente_id)
    REFERENCES adicionales_recurrentes(id) ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS documentos_rrhh (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  tipo VARCHAR(100) NOT NULL,
  nombre VARCHAR(180) NOT NULL,
  fecha_emision DATE NULL,
  fecha_vencimiento DATE NULL,
  referencia VARCHAR(255) NULL,
  observacion VARCHAR(255) NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_documentos_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS evaluaciones (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  colaborador_id INT UNSIGNED NOT NULL,
  periodo VARCHAR(30) NOT NULL,
  fecha DATE NOT NULL,
  evaluador VARCHAR(150) NOT NULL,
  puntaje DECIMAL(5,2) NOT NULL,
  fortalezas TEXT NULL,
  mejoras TEXT NULL,
  estado ENUM('Borrador','Finalizada') NOT NULL DEFAULT 'Borrador',
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_evaluaciones_colaboradores FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS capacitaciones (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(180) NOT NULL,
  proveedor VARCHAR(150) NULL,
  fecha_inicio DATE NOT NULL,
  fecha_fin DATE NULL,
  horas DECIMAL(6,2) NOT NULL DEFAULT 0,
  costo DECIMAL(14,2) NOT NULL DEFAULT 0,
  estado ENUM('Planificada','En curso','Finalizada','Cancelada') NOT NULL DEFAULT 'Planificada',
  observacion VARCHAR(255) NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS capacitacion_colaboradores (
  capacitacion_id INT UNSIGNED NOT NULL,
  colaborador_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (capacitacion_id, colaborador_id),
  CONSTRAINT fk_capacitacion_participantes_capacitacion FOREIGN KEY (capacitacion_id)
    REFERENCES capacitaciones(id) ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT fk_capacitacion_participantes_colaborador FOREIGN KEY (colaborador_id)
    REFERENCES colaboradores(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

INSERT INTO departamentos (nombre, descripcion)
VALUES ('Administración', 'Departamento inicial')
ON DUPLICATE KEY UPDATE descripcion = VALUES(descripcion);

CREATE TABLE IF NOT EXISTS clientes (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  codigo VARCHAR(30) NOT NULL UNIQUE,
  nombre VARCHAR(180) NOT NULL,
  tipo_documento ENUM('RUC','Cédula','Pasaporte','Otro') NOT NULL DEFAULT 'RUC',
  documento VARCHAR(40) NULL UNIQUE,
  email VARCHAR(150) NULL,
  telefono VARCHAR(50) NULL,
  direccion VARCHAR(255) NULL,
  ciudad VARCHAR(100) NULL,
  contacto VARCHAR(150) NULL,
  estado ENUM('Activo','Inactivo') NOT NULL DEFAULT 'Activo',
  observaciones TEXT NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS contratos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  cliente_id INT UNSIGNED NOT NULL,
  titulo VARCHAR(200) NOT NULL,
  detalle TEXT NULL,
  monto DECIMAL(14,2) NOT NULL DEFAULT 0,
  fecha_inicio DATE NULL,
  fecha_fin DATE NULL,
  estado ENUM('Borrador','Vigente','Finalizado','Cancelado') NOT NULL DEFAULT 'Borrador',
  archivo VARCHAR(255) NULL,
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  CONSTRAINT fk_contratos_clientes FOREIGN KEY (cliente_id)
    REFERENCES clientes(id) ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS contrato_novedades (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  contrato_id INT UNSIGNED NOT NULL,
  novedad TEXT NOT NULL,
  archivo VARCHAR(255) NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_novedades_contratos FOREIGN KEY (contrato_id)
    REFERENCES contratos(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS proyectos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(220) NOT NULL,
  descripcion LONGTEXT NULL,
  lider VARCHAR(180) NULL,
  sponsor VARCHAR(180) NULL,
  requisitos LONGTEXT NULL,
  alcance LONGTEXT NULL,
  fecha_objetivo DATE NULL,
  costo DECIMAL(14,2) NOT NULL DEFAULT 0,
  finalidad LONGTEXT NULL,
  justificacion LONGTEXT NULL,
  amenazas LONGTEXT NULL,
  estado ENUM('Pendiente','En Proceso','Finalizado','Cancelado') NOT NULL DEFAULT 'Pendiente',
  creado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  actualizado_en TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS proyecto_areas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  proyecto_id INT UNSIGNED NOT NULL,
  area VARCHAR(150) NOT NULL,
  rol VARCHAR(200) NOT NULL,
  CONSTRAINT fk_proyecto_areas_proyecto FOREIGN KEY (proyecto_id)
    REFERENCES proyectos(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS proyecto_objetivos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  proyecto_id INT UNSIGNED NOT NULL,
  categoria ENUM('Alcance','Tiempo','Costo') NOT NULL,
  objetivo TEXT NOT NULL,
  criterio_exito TEXT NOT NULL,
  fecha_exito DATE NULL,
  CONSTRAINT fk_proyecto_objetivos_proyecto FOREIGN KEY (proyecto_id)
    REFERENCES proyectos(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

DELETE FROM proyecto_objetivos WHERE categoria='Otro';
DELETE o1 FROM proyecto_objetivos o1
JOIN proyecto_objetivos o2
  ON o1.proyecto_id=o2.proyecto_id
 AND o1.categoria=o2.categoria
 AND o1.id>o2.id;
ALTER TABLE proyecto_objetivos
  MODIFY categoria ENUM('Alcance','Tiempo','Costo') NOT NULL,
  ADD UNIQUE INDEX IF NOT EXISTS uk_proyecto_objetivo_categoria (proyecto_id, categoria);

CREATE TABLE IF NOT EXISTS proyecto_hitos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  proyecto_id INT UNSIGNED NOT NULL,
  descripcion VARCHAR(255) NOT NULL,
  fecha_vencimiento DATE NOT NULL,
  estado ENUM('Pendiente','En Proceso','Finalizado','Cancelado') NOT NULL DEFAULT 'Pendiente',
  CONSTRAINT fk_proyecto_hitos_proyecto FOREIGN KEY (proyecto_id)
    REFERENCES proyectos(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS proyecto_hito_seguimientos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  hito_id INT UNSIGNED NOT NULL,
  seguimiento TEXT NOT NULL,
  imagen VARCHAR(255) NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_seguimientos_hito FOREIGN KEY (hito_id)
    REFERENCES proyecto_hitos(id) ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS menus_sistema (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  clave VARCHAR(100) NOT NULL UNIQUE,
  nombre VARCHAR(150) NOT NULL,
  ruta VARCHAR(255) NOT NULL,
  grupo VARCHAR(100) NOT NULL,
  activo TINYINT(1) NOT NULL DEFAULT 1
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS rol_menus (
  rol_id INT UNSIGNED NOT NULL,
  menu_id INT UNSIGNED NOT NULL,
  habilitado TINYINT(1) NOT NULL DEFAULT 0,
  PRIMARY KEY (rol_id, menu_id),
  CONSTRAINT fk_rol_menus_rol FOREIGN KEY (rol_id) REFERENCES roles(id) ON DELETE CASCADE,
  CONSTRAINT fk_rol_menus_menu FOREIGN KEY (menu_id) REFERENCES menus_sistema(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS facturas (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  cliente_id INT UNSIGNED NOT NULL,
  trabajo_realizado TEXT NOT NULL,
  fecha_vencimiento DATE NOT NULL,
  nro_factura VARCHAR(50) NULL,
  fecha_factura DATE NULL,
  importe DECIMAL(14,2) NOT NULL DEFAULT 0,
  iva DECIMAL(14,2) NOT NULL DEFAULT 0,
  observacion TEXT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_facturas_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS factura_pagos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  factura_id INT UNSIGNED NOT NULL,
  fecha_pago DATE NOT NULL,
  importe DECIMAL(14,2) NOT NULL,
  observacion TEXT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_pagos_factura FOREIGN KEY (factura_id) REFERENCES facturas(id) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS factura_seguimientos (
  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  factura_id INT UNSIGNED NOT NULL,
  detalle TEXT NOT NULL,
  creado_en DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  CONSTRAINT fk_seguimiento_factura FOREIGN KEY (factura_id) REFERENCES facturas(id) ON DELETE CASCADE
) ENGINE=InnoDB;
