-- ============================================================
-- SIGDA v1.0 - Sistema de Gestión de Distribución de Gas y Agua
-- Base completa: tablas, relaciones, índices, datos iniciales y vistas
-- Compatible con MariaDB 10.4+ / MySQL 8+
-- ============================================================

SET SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE DATABASE IF NOT EXISTS sigda
    DEFAULT CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

USE sigda;

-- ============================================================
-- LIMPIEZA PARA REIMPORTACIÓN
-- ============================================================

DROP VIEW IF EXISTS v_pedidos_pendientes;
DROP VIEW IF EXISTS v_resumen_liquidaciones_repartidor;
DROP VIEW IF EXISTS v_resumen_caja;
DROP VIEW IF EXISTS v_frecuencia_clientes;
DROP VIEW IF EXISTS v_ventas_repartidores;
DROP VIEW IF EXISTS v_ventas_mensuales;
DROP VIEW IF EXISTS v_ventas_diarias;
DROP VIEW IF EXISTS v_deuda_proveedores_envases;
DROP VIEW IF EXISTS v_deuda_envases_clientes;
DROP VIEW IF EXISTS v_deuda_clientes;
DROP VIEW IF EXISTS v_patrimonio_envases;
DROP VIEW IF EXISTS v_stock_productos;

DROP TABLE IF EXISTS notificaciones_usuario;
DROP TABLE IF EXISTS notificaciones;
DROP TABLE IF EXISTS dispositivos_moviles;
DROP TABLE IF EXISTS liquidacion_repartidor_pagos;
DROP TABLE IF EXISTS liquidaciones_repartidor;
DROP TABLE IF EXISTS gastos_repartidor;
DROP TABLE IF EXISTS jornadas_repartidor;
DROP TABLE IF EXISTS vacaciones_trabajador;
DROP TABLE IF EXISTS descuentos_trabajador;
DROP TABLE IF EXISTS adelantos_trabajador;
DROP TABLE IF EXISTS asistencias;
DROP TABLE IF EXISTS comprobantes;
DROP TABLE IF EXISTS caja_movimientos;
DROP TABLE IF EXISTS cierres_caja;
DROP TABLE IF EXISTS aperturas_caja;
DROP TABLE IF EXISTS cajas;
DROP TABLE IF EXISTS movimientos_envases;
DROP TABLE IF EXISTS movimientos_inventario;
DROP TABLE IF EXISTS transferencias_detalle;
DROP TABLE IF EXISTS transferencias_almacen;
DROP TABLE IF EXISTS compras_detalle;
DROP TABLE IF EXISTS compras;
DROP TABLE IF EXISTS proveedores;
DROP TABLE IF EXISTS cuenta_corriente_cliente;
DROP TABLE IF EXISTS operaciones_pagos;
DROP TABLE IF EXISTS operaciones_detalle;
DROP TABLE IF EXISTS operaciones;
DROP TABLE IF EXISTS pedido_historial;
DROP TABLE IF EXISTS pedidos_detalle;
DROP TABLE IF EXISTS pedidos;
DROP TABLE IF EXISTS clientes_direcciones;
DROP TABLE IF EXISTS clientes_telefonos;
DROP TABLE IF EXISTS clientes;
DROP TABLE IF EXISTS productos;
DROP TABLE IF EXISTS tipos_envase;
DROP TABLE IF EXISTS usuarios_roles;
DROP TABLE IF EXISTS roles_permisos;
DROP TABLE IF EXISTS permisos;
DROP TABLE IF EXISTS usuarios;
DROP TABLE IF EXISTS trabajadores;
DROP TABLE IF EXISTS cargos;
DROP TABLE IF EXISTS roles;
DROP TABLE IF EXISTS series;
DROP TABLE IF EXISTS almacenes;
DROP TABLE IF EXISTS zonas;
DROP TABLE IF EXISTS sucursales;
DROP TABLE IF EXISTS empresa;

SET FOREIGN_KEY_CHECKS = 1;

-- ============================================================
-- EMPRESA / ESTRUCTURA
-- ============================================================

CREATE TABLE empresa (
    id_empresa BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ruc VARCHAR(20) NULL,
    razon_social VARCHAR(200) NOT NULL,
    nombre_comercial VARCHAR(200) NULL,
    direccion_fiscal VARCHAR(255) NULL,
    ubigeo VARCHAR(10) NULL,
    telefono VARCHAR(30) NULL,
    email VARCHAR(150) NULL,
    igv_porcentaje DECIMAL(5,2) NOT NULL DEFAULT 18.00,
    moneda VARCHAR(3) NOT NULL DEFAULT 'PEN',
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE sucursales (
    id_sucursal BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_empresa BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    direccion VARCHAR(255) NULL,
    telefono VARCHAR(30) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_sucursal_codigo (id_empresa, codigo),
    CONSTRAINT fk_sucursal_empresa FOREIGN KEY (id_empresa) REFERENCES empresa(id_empresa)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE almacenes (
    id_almacen BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    direccion VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_almacen_codigo (id_sucursal, codigo),
    CONSTRAINT fk_almacen_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE zonas (
    id_zona BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_zona_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE series (
    id_serie BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    tipo_documento ENUM('PEDIDO','OPERACION','COBRO','COMPRA','BOLETA','FACTURA','NOTA_CREDITO','NOTA_DEBITO','LIQUIDACION') NOT NULL,
    serie VARCHAR(10) NOT NULL,
    correlativo BIGINT UNSIGNED NOT NULL DEFAULT 0,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_serie (id_sucursal, tipo_documento, serie),
    CONSTRAINT fk_serie_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- SEGURIDAD / PERSONAL
-- ============================================================

CREATE TABLE roles (
    id_rol BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_rol_nombre (nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE cargos (
    id_cargo BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_cargo_nombre (nombre)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE trabajadores (
    id_trabajador BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_cargo BIGINT UNSIGNED NOT NULL,
    tipo_documento ENUM('DNI','CE','PASAPORTE','OTRO') NOT NULL DEFAULT 'DNI',
    numero_documento VARCHAR(20) NOT NULL,
    nombres VARCHAR(150) NOT NULL,
    apellidos VARCHAR(150) NOT NULL,
    fecha_nacimiento DATE NULL,
    direccion VARCHAR(255) NULL,
    telefono VARCHAR(30) NULL,
    email VARCHAR(150) NULL,
    fecha_ingreso DATE NOT NULL,
    sueldo_base DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    estado ENUM('ACTIVO','CESADO','SUSPENDIDO') NOT NULL DEFAULT 'ACTIVO',
    observaciones TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_trabajador_documento (numero_documento),
    CONSTRAINT fk_trabajador_cargo FOREIGN KEY (id_cargo) REFERENCES cargos(id_cargo)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuarios (
    id_usuario BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_trabajador BIGINT UNSIGNED NULL,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    usuario VARCHAR(50) NOT NULL,
    clave VARCHAR(255) NOT NULL,
    nombres VARCHAR(150) NOT NULL,
    apellidos VARCHAR(150) NULL,
    telefono VARCHAR(30) NULL,
    email VARCHAR(150) NULL,
    foto VARCHAR(255) NULL,
    estado ENUM('ACTIVO','INACTIVO','BLOQUEADO') NOT NULL DEFAULT 'ACTIVO',
    ultimo_acceso DATETIME NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_usuario (usuario),
    UNIQUE KEY uk_email (email),
    UNIQUE KEY uk_usuario_trabajador (id_trabajador),
    CONSTRAINT fk_usuario_trabajador FOREIGN KEY (id_trabajador) REFERENCES trabajadores(id_trabajador)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_usuario_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE permisos (
    id_permiso BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    modulo VARCHAR(100) NOT NULL,
    accion VARCHAR(100) NOT NULL,
    descripcion VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_permiso (modulo, accion)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE usuarios_roles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_usuario BIGINT UNSIGNED NOT NULL,
    id_rol BIGINT UNSIGNED NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_usuario_rol (id_usuario, id_rol),
    CONSTRAINT fk_ur_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_ur_rol FOREIGN KEY (id_rol) REFERENCES roles(id_rol)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE roles_permisos (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_rol BIGINT UNSIGNED NOT NULL,
    id_permiso BIGINT UNSIGNED NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_rol_permiso (id_rol, id_permiso),
    CONSTRAINT fk_rp_rol FOREIGN KEY (id_rol) REFERENCES roles(id_rol)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_rp_permiso FOREIGN KEY (id_permiso) REFERENCES permisos(id_permiso)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- MAESTROS
-- ============================================================

CREATE TABLE tipos_envase (
    id_tipo_envase BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    capacidad DECIMAL(10,2) NOT NULL,
    unidad_medida VARCHAR(10) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_tipo_envase_codigo (codigo)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE productos (
    id_producto BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_tipo_envase BIGINT UNSIGNED NULL,
    codigo VARCHAR(30) NOT NULL,
    nombre VARCHAR(150) NOT NULL,
    tipo_producto ENUM('RECARGA_GAS','RECARGA_AGUA','ENVASE','ACCESORIO') NOT NULL,
    unidad_medida VARCHAR(10) NOT NULL DEFAULT 'UND',
    precio_compra DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    precio_venta DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    afecta_igv TINYINT(1) NOT NULL DEFAULT 1,
    controla_stock TINYINT(1) NOT NULL DEFAULT 1,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_producto_codigo (codigo),
    CONSTRAINT fk_producto_tipo_envase FOREIGN KEY (id_tipo_envase) REFERENCES tipos_envase(id_tipo_envase)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- CLIENTES / PROVEEDORES
-- ============================================================

CREATE TABLE clientes (
    id_cliente BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    tipo_cliente ENUM('HOGAR','NEGOCIO','RESTAURANTE','HOTEL','EMPRESA','DISTRIBUIDOR') NOT NULL DEFAULT 'HOGAR',
    tipo_documento ENUM('DNI','RUC','CE','OTRO') NOT NULL DEFAULT 'DNI',
    numero_documento VARCHAR(20) NULL,
    nombres VARCHAR(200) NOT NULL,
    limite_credito DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    credito_habilitado TINYINT(1) NOT NULL DEFAULT 0,
    dias_credito INT UNSIGNED NOT NULL DEFAULT 0,
    contacto VARCHAR(150) NULL,
    observaciones TEXT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_cliente_codigo (codigo),
    UNIQUE KEY uk_cliente_documento (tipo_documento, numero_documento)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE clientes_telefonos (
    id_telefono BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_cliente BIGINT UNSIGNED NOT NULL,
    telefono VARCHAR(20) NOT NULL,
    principal TINYINT(1) NOT NULL DEFAULT 0,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_cliente_telefono (id_cliente, telefono),
    CONSTRAINT fk_cliente_telefono FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE clientes_direcciones (
    id_direccion BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_cliente BIGINT UNSIGNED NOT NULL,
    id_zona BIGINT UNSIGNED NULL,
    alias VARCHAR(100) NULL,
    direccion VARCHAR(255) NOT NULL,
    referencia VARCHAR(255) NULL,
    principal TINYINT(1) NOT NULL DEFAULT 0,
    latitud DECIMAL(10,8) NULL,
    longitud DECIMAL(11,8) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    CONSTRAINT fk_direccion_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE CASCADE,
    UNIQUE KEY uk_direccion_cliente (id_direccion, id_cliente),
    CONSTRAINT fk_direccion_zona FOREIGN KEY (id_zona) REFERENCES zonas(id_zona)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Cliente genérico para ventas directas de oficina/mostrador.
INSERT INTO clientes (codigo, tipo_cliente, tipo_documento, numero_documento, nombres, credito_habilitado)
VALUES ('CLI-MOSTRADOR', 'HOGAR', 'OTRO', NULL, 'CLIENTE MOSTRADOR', 0);

CREATE TABLE proveedores (
    id_proveedor BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    codigo VARCHAR(20) NOT NULL,
    ruc VARCHAR(20) NULL,
    razon_social VARCHAR(200) NOT NULL,
    direccion VARCHAR(255) NULL,
    telefono VARCHAR(30) NULL,
    contacto VARCHAR(150) NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_proveedor_codigo (codigo),
    UNIQUE KEY uk_proveedor_ruc (ruc)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- CAJAS / JORNADAS REPARTIDOR (necesarias antes de operaciones)
-- ============================================================

CREATE TABLE cajas (
    id_caja BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_usuario BIGINT UNSIGNED NOT NULL,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    codigo VARCHAR(20) NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    estado TINYINT(1) NOT NULL DEFAULT 1,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_caja_codigo (id_sucursal, codigo),
    UNIQUE KEY uk_caja_usuario (id_usuario),
    CONSTRAINT fk_caja_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_caja_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE aperturas_caja (
    id_apertura BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_caja BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    fecha_apertura DATETIME NOT NULL,
    monto_inicial DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    estado ENUM('ABIERTA','CERRADA') NOT NULL DEFAULT 'ABIERTA',
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_apertura_caja FOREIGN KEY (id_caja) REFERENCES cajas(id_caja)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_apertura_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY uk_apertura_fecha (id_caja, fecha_apertura)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE jornadas_repartidor (
    id_jornada BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_usuario BIGINT UNSIGNED NOT NULL,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    hora_inicio DATETIME NOT NULL,
    hora_fin DATETIME NULL,
    estado ENUM('ABIERTA','CERRADA') NOT NULL DEFAULT 'ABIERTA',
    observaciones TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_jornada_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_jornada_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY uk_jornada_usuario_fecha (id_usuario, fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- PEDIDOS
-- ============================================================

CREATE TABLE pedidos (
    id_pedido BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    id_almacen BIGINT UNSIGNED NULL,
    id_cliente BIGINT UNSIGNED NOT NULL,
    id_direccion BIGINT UNSIGNED NOT NULL,
    id_usuario_registro BIGINT UNSIGNED NOT NULL,
    id_usuario_repartidor BIGINT UNSIGNED NULL,
    numero VARCHAR(30) NOT NULL,
    origen ENUM('LLAMADA','WHATSAPP','OFICINA','APP') NOT NULL DEFAULT 'LLAMADA',
    prioridad ENUM('NORMAL','URGENTE') NOT NULL DEFAULT 'NORMAL',
    disponible_repartidores TINYINT(1) NOT NULL DEFAULT 0,
    fecha_pedido DATETIME NOT NULL,
    fecha_asignacion DATETIME NULL,
    fecha_en_ruta DATETIME NULL,
    fecha_entrega DATETIME NULL,
    observaciones TEXT NULL,
    estado ENUM('PENDIENTE','ASIGNADO','EN_RUTA','ENTREGADO','PARCIAL','ANULADO') NOT NULL DEFAULT 'PENDIENTE',
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_pedido_numero (id_sucursal, numero),
    KEY idx_pedido_estado (estado, fecha_pedido),
    KEY idx_pedido_repartidor (id_usuario_repartidor, estado),
    CONSTRAINT fk_pedido_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_pedido_almacen FOREIGN KEY (id_almacen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_pedido_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_pedido_direccion_cliente FOREIGN KEY (id_direccion, id_cliente) REFERENCES clientes_direcciones(id_direccion, id_cliente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_pedido_usuario_registro FOREIGN KEY (id_usuario_registro) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_pedido_repartidor FOREIGN KEY (id_usuario_repartidor) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE pedidos_detalle (
    id_detalle BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_pedido BIGINT UNSIGNED NOT NULL,
    id_producto BIGINT UNSIGNED NOT NULL,
    cantidad_solicitada DECIMAL(12,2) NOT NULL,
    cantidad_entregada DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    precio DECIMAL(12,2) NOT NULL,
    subtotal_solicitado DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    observacion VARCHAR(255) NULL,
    UNIQUE KEY uk_pedido_producto (id_pedido, id_producto),
    CONSTRAINT fk_pd_pedido FOREIGN KEY (id_pedido) REFERENCES pedidos(id_pedido)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_pd_producto FOREIGN KEY (id_producto) REFERENCES productos(id_producto)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE pedido_historial (
    id_historial BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_pedido BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    estado_anterior VARCHAR(30) NULL,
    estado_nuevo VARCHAR(30) NOT NULL,
    observacion VARCHAR(255) NULL,
    fecha DATETIME NOT NULL,
    CONSTRAINT fk_ph_pedido FOREIGN KEY (id_pedido) REFERENCES pedidos(id_pedido)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_ph_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- OPERACIONES / PAGOS / CREDITOS
-- ============================================================

CREATE TABLE operaciones (
    id_operacion BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    id_almacen BIGINT UNSIGNED NULL,
    id_jornada BIGINT UNSIGNED NULL,
    id_pedido BIGINT UNSIGNED NULL,
    id_cliente BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    numero VARCHAR(30) NOT NULL,
    tipo_operacion ENUM('VENTA','COBRO','DEVOLUCION_ENVASE','AJUSTE') NOT NULL,
    origen ENUM('OFICINA','DELIVERY','SISTEMA') NOT NULL DEFAULT 'OFICINA',
    fecha_operacion DATETIME NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    descuento DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    igv_porcentaje DECIMAL(5,2) NOT NULL DEFAULT 18.00,
    igv DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    estado ENUM('PROCESADA','ANULADA') NOT NULL DEFAULT 'PROCESADA',
    observaciones TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_operacion_numero (id_sucursal, numero),
    KEY idx_operacion_fecha (fecha_operacion),
    KEY idx_operacion_usuario (id_usuario, fecha_operacion),
    CONSTRAINT fk_operacion_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_operacion_almacen FOREIGN KEY (id_almacen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_operacion_jornada FOREIGN KEY (id_jornada) REFERENCES jornadas_repartidor(id_jornada)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_operacion_pedido FOREIGN KEY (id_pedido) REFERENCES pedidos(id_pedido)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_operacion_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_operacion_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE operaciones_detalle (
    id_detalle BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_operacion BIGINT UNSIGNED NOT NULL,
    id_pedido_detalle BIGINT UNSIGNED NULL,
    id_producto BIGINT UNSIGNED NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    precio DECIMAL(12,2) NOT NULL,
    descuento DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    subtotal DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_od_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_od_pedido_detalle FOREIGN KEY (id_pedido_detalle) REFERENCES pedidos_detalle(id_detalle)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_od_producto FOREIGN KEY (id_producto) REFERENCES productos(id_producto)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE operaciones_pagos (
    id_pago BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_operacion BIGINT UNSIGNED NOT NULL,
    metodo_pago ENUM('EFECTIVO','YAPE','TRANSFERENCIA','CREDITO') NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    referencia VARCHAR(150) NULL,
    fecha_pago DATETIME NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_pago_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE cuenta_corriente_cliente (
    id_movimiento BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_cliente BIGINT UNSIGNED NOT NULL,
    id_operacion BIGINT UNSIGNED NULL,
    tipo_movimiento ENUM('CARGO','ABONO','AJUSTE_CARGO','AJUSTE_ABONO') NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    fecha_vencimiento DATE NULL,
    observacion VARCHAR(255) NULL,
    fecha_movimiento DATETIME NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_cc_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_cc_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- COMPRAS
-- ============================================================

CREATE TABLE compras (
    id_compra BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    id_almacen BIGINT UNSIGNED NOT NULL,
    id_proveedor BIGINT UNSIGNED NOT NULL,
    numero VARCHAR(30) NOT NULL,
    fecha_compra DATETIME NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    igv DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    estado ENUM('REGISTRADA','ANULADA') NOT NULL DEFAULT 'REGISTRADA',
    observaciones TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_compra_numero (id_sucursal, numero),
    CONSTRAINT fk_compra_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_compra_almacen FOREIGN KEY (id_almacen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_compra_proveedor FOREIGN KEY (id_proveedor) REFERENCES proveedores(id_proveedor)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE compras_detalle (
    id_detalle BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_compra BIGINT UNSIGNED NOT NULL,
    id_producto BIGINT UNSIGNED NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    costo_unitario DECIMAL(12,2) NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_cd_compra FOREIGN KEY (id_compra) REFERENCES compras(id_compra)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_cd_producto FOREIGN KEY (id_producto) REFERENCES productos(id_producto)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- INVENTARIO MULTI-ALMACEN
-- ============================================================

CREATE TABLE transferencias_almacen (
    id_transferencia BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    id_almacen_origen BIGINT UNSIGNED NOT NULL,
    id_almacen_destino BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    numero VARCHAR(30) NOT NULL,
    fecha DATETIME NOT NULL,
    estado ENUM('PENDIENTE','PROCESADA','ANULADA') NOT NULL DEFAULT 'PROCESADA',
    observacion VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_ta_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_ta_origen FOREIGN KEY (id_almacen_origen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_ta_destino FOREIGN KEY (id_almacen_destino) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_ta_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY uk_transferencia_numero (id_sucursal, numero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE transferencias_detalle (
    id_detalle BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_transferencia BIGINT UNSIGNED NOT NULL,
    id_producto BIGINT UNSIGNED NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    CONSTRAINT fk_td_transferencia FOREIGN KEY (id_transferencia) REFERENCES transferencias_almacen(id_transferencia)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_td_producto FOREIGN KEY (id_producto) REFERENCES productos(id_producto)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE movimientos_inventario (
    id_movimiento BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_almacen BIGINT UNSIGNED NOT NULL,
    id_producto BIGINT UNSIGNED NOT NULL,
    id_compra BIGINT UNSIGNED NULL,
    id_operacion BIGINT UNSIGNED NULL,
    id_transferencia BIGINT UNSIGNED NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    tipo_movimiento ENUM('COMPRA','VENTA','DEVOLUCION','AJUSTE_ENTRADA','AJUSTE_SALIDA','TRASLADO_ENTRADA','TRASLADO_SALIDA') NOT NULL,
    cantidad DECIMAL(12,2) NOT NULL,
    fecha_movimiento DATETIME NOT NULL,
    observacion VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    KEY idx_mi_producto_almacen (id_producto, id_almacen),
    KEY idx_mi_fecha (fecha_movimiento),
    CONSTRAINT fk_mi_almacen FOREIGN KEY (id_almacen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_mi_producto FOREIGN KEY (id_producto) REFERENCES productos(id_producto)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_mi_compra FOREIGN KEY (id_compra) REFERENCES compras(id_compra)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_mi_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_mi_transferencia FOREIGN KEY (id_transferencia) REFERENCES transferencias_almacen(id_transferencia)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_mi_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- ENVASES: UNA SOLA TABLA DE MOVIMIENTOS PARA CLIENTES/PROVEEDORES
-- ============================================================

CREATE TABLE movimientos_envases (
    id_movimiento_envase BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_tipo_envase BIGINT UNSIGNED NOT NULL,
    id_almacen BIGINT UNSIGNED NULL,
    id_cliente BIGINT UNSIGNED NULL,
    id_proveedor BIGINT UNSIGNED NULL,
    id_operacion BIGINT UNSIGNED NULL,
    id_compra BIGINT UNSIGNED NULL,
    id_jornada BIGINT UNSIGNED NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    tipo_contraparte ENUM('CLIENTE','PROVEEDOR','INTERNO') NOT NULL,
    tipo_movimiento ENUM('SALIDA_LLENO_CLIENTE','RECUPERACION_VACIO_CLIENTE','PRESTAMO_VACIO_CLIENTE','VENTA_ENVASE_CLIENTE','RECEPCION_PROVEEDOR','DEVOLUCION_A_PROVEEDOR','AJUSTE_ENTRADA','AJUSTE_SALIDA','TRASLADO') NOT NULL,
    estado_origen ENUM('LLENO','VACIO','PRESTADO','BAJA','EXTERNO') NULL,
    estado_destino ENUM('LLENO','VACIO','PRESTADO','VENDIDO','BAJA','EXTERNO') NULL,
    cantidad INT NOT NULL,
    fecha_movimiento DATETIME NOT NULL,
    observacion VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    KEY idx_me_cliente (id_cliente, id_tipo_envase, fecha_movimiento),
    KEY idx_me_proveedor (id_proveedor, id_tipo_envase, fecha_movimiento),
    KEY idx_me_envase_estado (id_tipo_envase, estado_origen, estado_destino),
    CONSTRAINT fk_me_envase FOREIGN KEY (id_tipo_envase) REFERENCES tipos_envase(id_tipo_envase)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_me_almacen FOREIGN KEY (id_almacen) REFERENCES almacenes(id_almacen)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_proveedor FOREIGN KEY (id_proveedor) REFERENCES proveedores(id_proveedor)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_compra FOREIGN KEY (id_compra) REFERENCES compras(id_compra)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_jornada FOREIGN KEY (id_jornada) REFERENCES jornadas_repartidor(id_jornada)
        ON UPDATE CASCADE ON DELETE SET NULL,
    CONSTRAINT fk_me_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT chk_me_contraparte CHECK (
        (tipo_contraparte = 'CLIENTE' AND id_cliente IS NOT NULL AND id_proveedor IS NULL) OR
        (tipo_contraparte = 'PROVEEDOR' AND id_proveedor IS NOT NULL AND id_cliente IS NULL) OR
        (tipo_contraparte = 'INTERNO' AND id_cliente IS NULL AND id_proveedor IS NULL)
    )
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- CAJA / MOVIMIENTOS
-- ============================================================

CREATE TABLE caja_movimientos (
    id_movimiento BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_apertura BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    id_operacion BIGINT UNSIGNED NULL,
    tipo_movimiento ENUM('INGRESO','EGRESO') NOT NULL,
    medio_pago ENUM('EFECTIVO','YAPE','TRANSFERENCIA','OTRO') NOT NULL DEFAULT 'EFECTIVO',
    concepto VARCHAR(200) NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    fecha_movimiento DATETIME NOT NULL,
    observacion VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_cm_apertura FOREIGN KEY (id_apertura) REFERENCES aperturas_caja(id_apertura)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_cm_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_cm_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE cierres_caja (
    id_cierre BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_apertura BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    fecha_cierre DATETIME NOT NULL,
    monto_inicial DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingresos_efectivo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingresos_yape DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ingresos_transferencia DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    egresos_efectivo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    monto_efectivo_sistema DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    monto_efectivo_real DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    diferencia_efectivo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    observacion TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_cierre_apertura FOREIGN KEY (id_apertura) REFERENCES aperturas_caja(id_apertura)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_cierre_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY uk_cierre_apertura (id_apertura)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- RRHH
-- ============================================================

CREATE TABLE asistencias (
    id_asistencia BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_trabajador BIGINT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    hora_entrada DATETIME NULL,
    hora_salida DATETIME NULL,
    estado ENUM('ASISTIO','FALTA','TARDANZA','PERMISO') NOT NULL DEFAULT 'ASISTIO',
    observaciones VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_asistencia (id_trabajador, fecha),
    CONSTRAINT fk_asistencia_trabajador FOREIGN KEY (id_trabajador) REFERENCES trabajadores(id_trabajador)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE adelantos_trabajador (
    id_adelanto BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_trabajador BIGINT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    motivo VARCHAR(255) NULL,
    estado ENUM('PENDIENTE','DESCONTADO','ANULADO') NOT NULL DEFAULT 'PENDIENTE',
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_adelanto_trabajador FOREIGN KEY (id_trabajador) REFERENCES trabajadores(id_trabajador)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE descuentos_trabajador (
    id_descuento BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_trabajador BIGINT UNSIGNED NOT NULL,
    fecha DATE NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    motivo VARCHAR(255) NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_descuento_trabajador FOREIGN KEY (id_trabajador) REFERENCES trabajadores(id_trabajador)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE vacaciones_trabajador (
    id_vacacion BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_trabajador BIGINT UNSIGNED NOT NULL,
    fecha_inicio DATE NOT NULL,
    fecha_fin DATE NOT NULL,
    observaciones VARCHAR(255) NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_vacacion_trabajador FOREIGN KEY (id_trabajador) REFERENCES trabajadores(id_trabajador)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- LIQUIDACION REPARTIDORES
-- ============================================================

CREATE TABLE gastos_repartidor (
    id_gasto BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_jornada BIGINT UNSIGNED NOT NULL,
    tipo_gasto ENUM('COMBUSTIBLE','PEAJE','ALIMENTACION','MOVILIDAD','MANTENIMIENTO','OTROS') NOT NULL,
    descripcion VARCHAR(255) NOT NULL,
    monto DECIMAL(12,2) NOT NULL,
    descuenta_rendicion TINYINT(1) NOT NULL DEFAULT 1,
    fecha_gasto DATETIME NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_gr_jornada FOREIGN KEY (id_jornada) REFERENCES jornadas_repartidor(id_jornada)
        ON UPDATE CASCADE ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE liquidaciones_repartidor (
    id_liquidacion BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_jornada BIGINT UNSIGNED NOT NULL,
    id_usuario_cierre BIGINT UNSIGNED NOT NULL,
    fecha_liquidacion DATETIME NOT NULL,
    ventas_total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    cobrado_efectivo DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    cobrado_yape DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    cobrado_transferencia DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    ventas_credito DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    gastos_total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    importe_a_entregar DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    monto_entregado DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    diferencia DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    observaciones TEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_liq_jornada FOREIGN KEY (id_jornada) REFERENCES jornadas_repartidor(id_jornada)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_liq_usuario FOREIGN KEY (id_usuario_cierre) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    UNIQUE KEY uk_liquidacion_jornada (id_jornada)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE liquidacion_repartidor_pagos (
    id_detalle BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_liquidacion BIGINT UNSIGNED NOT NULL,
    metodo_pago ENUM('EFECTIVO','YAPE','TRANSFERENCIA') NOT NULL,
    monto_esperado DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    monto_entregado DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    diferencia DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    observacion VARCHAR(255) NULL,
    CONSTRAINT fk_lrp_liquidacion FOREIGN KEY (id_liquidacion) REFERENCES liquidaciones_repartidor(id_liquidacion)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- FACTURACION / SUNAT
-- ============================================================

CREATE TABLE comprobantes (
    id_comprobante BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_sucursal BIGINT UNSIGNED NOT NULL,
    id_operacion BIGINT UNSIGNED NOT NULL,
    id_cliente BIGINT UNSIGNED NOT NULL,
    id_comprobante_referencia BIGINT UNSIGNED NULL,
    tipo_comprobante ENUM('BOLETA','FACTURA','NOTA_CREDITO','NOTA_DEBITO') NOT NULL,
    serie VARCHAR(10) NOT NULL,
    correlativo BIGINT UNSIGNED NOT NULL,
    numero_completo VARCHAR(30) NOT NULL,
    fecha_emision DATETIME NOT NULL,
    subtotal DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    igv DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    total DECIMAL(12,2) NOT NULL DEFAULT 0.00,
    motivo_nota VARCHAR(255) NULL,
    estado_sunat ENUM('PENDIENTE','ENVIADO','ACEPTADO','RECHAZADO','ANULADO') NOT NULL DEFAULT 'PENDIENTE',
    codigo_sunat VARCHAR(50) NULL,
    hash_sunat VARCHAR(255) NULL,
    xml_generado LONGTEXT NULL,
    cdr_generado LONGTEXT NULL,
    respuesta_sunat LONGTEXT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uk_comprobante_numero (id_sucursal, numero_completo),
    CONSTRAINT fk_comprobante_sucursal FOREIGN KEY (id_sucursal) REFERENCES sucursales(id_sucursal)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_comprobante_operacion FOREIGN KEY (id_operacion) REFERENCES operaciones(id_operacion)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_comprobante_cliente FOREIGN KEY (id_cliente) REFERENCES clientes(id_cliente)
        ON UPDATE CASCADE ON DELETE RESTRICT,
    CONSTRAINT fk_comprobante_referencia FOREIGN KEY (id_comprobante_referencia) REFERENCES comprobantes(id_comprobante)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- NOTIFICACIONES / APP
-- ============================================================

CREATE TABLE dispositivos_moviles (
    id_dispositivo BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_usuario BIGINT UNSIGNED NOT NULL,
    token_dispositivo VARCHAR(500) NOT NULL,
    plataforma ENUM('ANDROID','IOS') NOT NULL DEFAULT 'ANDROID',
    modelo VARCHAR(150) NULL,
    activo TINYINT(1) NOT NULL DEFAULT 1,
    fecha_registro DATETIME NOT NULL,
    ultimo_uso DATETIME NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_token_dispositivo (token_dispositivo),
    CONSTRAINT fk_dm_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE notificaciones (
    id_notificacion BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_pedido BIGINT UNSIGNED NULL,
    titulo VARCHAR(200) NOT NULL,
    mensaje TEXT NOT NULL,
    tipo ENUM('PEDIDO','COBRO','SISTEMA','ALERTA') NOT NULL,
    fecha_envio DATETIME NOT NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT fk_notif_pedido FOREIGN KEY (id_pedido) REFERENCES pedidos(id_pedido)
        ON UPDATE CASCADE ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE notificaciones_usuario (
    id_notificacion_usuario BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    id_notificacion BIGINT UNSIGNED NOT NULL,
    id_usuario BIGINT UNSIGNED NOT NULL,
    leido TINYINT(1) NOT NULL DEFAULT 0,
    fecha_lectura DATETIME NULL,
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    UNIQUE KEY uk_notif_usuario (id_notificacion, id_usuario),
    CONSTRAINT fk_nu_notificacion FOREIGN KEY (id_notificacion) REFERENCES notificaciones(id_notificacion)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT fk_nu_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id_usuario)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ============================================================
-- DATOS INICIALES
-- ============================================================

INSERT INTO empresa (ruc, razon_social, nombre_comercial, moneda, igv_porcentaje)
VALUES ('00000000000', 'EMPRESA DE DISTRIBUCION GAS Y AGUA', 'SIGDA', 'PEN', 18.00);

INSERT INTO sucursales (id_empresa, codigo, nombre, direccion)
VALUES (1, 'PRINC', 'Sucursal Principal', NULL);

INSERT INTO almacenes (id_sucursal, codigo, nombre)
VALUES (1, 'ALM001', 'Almacén Principal');

INSERT INTO zonas (codigo, nombre) VALUES
('CENTRO', 'Centro'),
('NORTE', 'Norte'),
('SUR', 'Sur'),
('ESTE', 'Este'),
('OESTE', 'Oeste');

INSERT INTO series (id_sucursal, tipo_documento, serie, correlativo) VALUES
(1, 'PEDIDO', 'P001', 0),
(1, 'OPERACION', 'OP01', 0),
(1, 'COBRO', 'COB01', 0),
(1, 'COMPRA', 'C001', 0),
(1, 'BOLETA', 'B001', 0),
(1, 'FACTURA', 'F001', 0),
(1, 'NOTA_CREDITO', 'BC01', 0),
(1, 'NOTA_DEBITO', 'BD01', 0),
(1, 'LIQUIDACION', 'LIQ01', 0);

INSERT INTO roles (nombre, descripcion) VALUES
('Administrador', 'Acceso total al sistema'),
('Supervisor', 'Supervisión general'),
('Operador', 'Atención de clientes y pedidos'),
('Cajero', 'Caja y cobranzas'),
('Repartidor', 'Operación de reparto');

INSERT INTO cargos (nombre, descripcion) VALUES
('Administrador', 'Administración del negocio'),
('Supervisor', 'Supervisión'),
('Operador', 'Atención y registro de pedidos'),
('Cajero', 'Manejo de caja'),
('Repartidor', 'Entrega y cobranza'),
('Almacenero', 'Gestión de almacén');

INSERT INTO permisos (modulo, accion, descripcion) VALUES
('dashboard','ver','Ver dashboard'),
('usuarios','ver','Ver usuarios'),
('usuarios','crear','Crear usuarios'),
('usuarios','editar','Editar usuarios'),
('usuarios','activar','Activar o desactivar usuarios'),
('roles','ver','Ver roles'),
('roles','gestionar','Gestionar roles y permisos'),
('clientes','ver','Ver clientes'),
('clientes','crear','Crear clientes'),
('clientes','editar','Editar clientes'),
('clientes','credito','Gestionar crédito'),
('clientes','cobrar','Registrar cobros'),
('pedidos','ver','Ver pedidos'),
('pedidos','crear','Crear pedidos'),
('pedidos','asignar','Asignar pedidos'),
('pedidos','anular','Anular pedidos'),
('reparto','ver','Ver reparto'),
('reparto','entregar','Registrar entregas'),
('reparto','cobrar','Registrar cobros en ruta'),
('reparto','gastos','Registrar gastos'),
('operaciones','ver','Ver operaciones'),
('operaciones','crear','Crear operaciones'),
('operaciones','anular','Anular operaciones'),
('caja','ver','Ver caja propia'),
('caja','gestionar','Gestionar caja'),
('envases','ver','Ver envases'),
('envases','movimientos','Registrar movimientos de envases'),
('inventario','ver','Ver inventario'),
('inventario','movimientos','Registrar movimientos de inventario'),
('compras','ver','Ver compras'),
('compras','crear','Registrar compras'),
('reportes','ver','Ver reportes'),
('rrhh','ver','Ver personal'),
('rrhh','gestionar','Gestionar personal'),
('liquidacion','ver','Ver liquidaciones'),
('liquidacion','cerrar','Cerrar liquidaciones'),
('facturacion','emitir','Emitir comprobantes'),
('facturacion','anular','Anular comprobantes'),
('configuracion','gestionar','Gestionar configuración');

INSERT INTO tipos_envase (codigo, nombre, capacidad, unidad_medida) VALUES
('BALON10', 'Balón 10kg', 10, 'KG'),
('BALON40', 'Balón 40kg', 40, 'KG'),
('BIDON12', 'Bidón 12L', 12, 'LT'),
('BIDON20', 'Bidón 20L', 20, 'LT');

INSERT INTO productos (id_tipo_envase, codigo, nombre, tipo_producto, unidad_medida, precio_compra, precio_venta, afecta_igv, controla_stock) VALUES
(1, 'GAS10', 'Gas 10kg Recarga', 'RECARGA_GAS', 'UND', 0.00, 0.00, 1, 1),
(2, 'GAS40', 'Gas 40kg Recarga', 'RECARGA_GAS', 'UND', 0.00, 0.00, 1, 1),
(3, 'AGUA12', 'Agua 12L Recarga', 'RECARGA_AGUA', 'UND', 0.00, 0.00, 1, 1),
(4, 'AGUA20', 'Agua 20L Recarga', 'RECARGA_AGUA', 'UND', 0.00, 0.00, 1, 1),
(1, 'ENVBAL10', 'Balón 10kg Vacío', 'ENVASE', 'UND', 0.00, 0.00, 1, 1),
(2, 'ENVBAL40', 'Balón 40kg Vacío', 'ENVASE', 'UND', 0.00, 0.00, 1, 1),
(3, 'ENVBID12', 'Bidón 12L Vacío', 'ENVASE', 'UND', 0.00, 0.00, 1, 1),
(4, 'ENVBID20', 'Bidón 20L Vacío', 'ENVASE', 'UND', 0.00, 0.00, 1, 1);

-- Trabajador y usuario administrador inicial.
INSERT INTO trabajadores (id_cargo, tipo_documento, numero_documento, nombres, apellidos, fecha_ingreso, sueldo_base)
VALUES (1, 'DNI', '00000000', 'Administrador', 'Sistema', CURRENT_DATE, 0.00);

INSERT INTO usuarios (id_trabajador, id_sucursal, usuario, clave, nombres, apellidos, estado)
VALUES (
    1,
    1,
    'admin',
    '$2y$12$WSZgCKE73RTOX0qeOKPByuNH/0FKXArvZZBIrMlq7g9yjvKbFFIgK',
    'Administrador',
    'Sistema',
    'ACTIVO'
);

INSERT INTO usuarios_roles (id_usuario, id_rol)
SELECT 1, id_rol FROM roles WHERE nombre = 'Administrador';

INSERT INTO roles_permisos (id_rol, id_permiso)
SELECT r.id_rol, p.id_permiso
FROM roles r
CROSS JOIN permisos p
WHERE r.nombre = 'Administrador';

INSERT INTO cajas (id_usuario, id_sucursal, codigo, nombre)
VALUES (1, 1, 'CAJ001', 'Caja Administrador');

-- ============================================================
-- VISTAS
-- ============================================================

CREATE OR REPLACE VIEW v_stock_productos AS
SELECT
    mi.id_almacen,
    a.nombre AS almacen,
    mi.id_producto,
    p.codigo AS codigo_producto,
    p.nombre AS producto,
    SUM(
        CASE
            WHEN mi.tipo_movimiento IN ('COMPRA','DEVOLUCION','AJUSTE_ENTRADA','TRASLADO_ENTRADA') THEN mi.cantidad
            WHEN mi.tipo_movimiento IN ('VENTA','AJUSTE_SALIDA','TRASLADO_SALIDA') THEN -mi.cantidad
            ELSE 0
        END
    ) AS stock_actual
FROM movimientos_inventario mi
INNER JOIN almacenes a ON a.id_almacen = mi.id_almacen
INNER JOIN productos p ON p.id_producto = mi.id_producto
GROUP BY mi.id_almacen, a.nombre, mi.id_producto, p.codigo, p.nombre;

CREATE OR REPLACE VIEW v_patrimonio_envases AS
SELECT
    te.id_tipo_envase,
    te.codigo,
    te.nombre,
    COALESCE(SUM(CASE WHEN me.tipo_movimiento IN ('RECEPCION_PROVEEDOR','AJUSTE_ENTRADA') THEN me.cantidad ELSE 0 END),0) AS adquiridos,
    COALESCE(SUM(CASE WHEN me.estado_destino = 'LLENO' THEN me.cantidad ELSE 0 END),0)
      - COALESCE(SUM(CASE WHEN me.estado_origen = 'LLENO' THEN me.cantidad ELSE 0 END),0) AS llenos,
    COALESCE(SUM(CASE WHEN me.estado_destino = 'VACIO' THEN me.cantidad ELSE 0 END),0)
      - COALESCE(SUM(CASE WHEN me.estado_origen = 'VACIO' THEN me.cantidad ELSE 0 END),0) AS vacios,
    COALESCE(SUM(CASE WHEN me.estado_destino = 'PRESTADO' THEN me.cantidad ELSE 0 END),0)
      - COALESCE(SUM(CASE WHEN me.estado_origen = 'PRESTADO' THEN me.cantidad ELSE 0 END),0) AS prestados,
    COALESCE(SUM(CASE WHEN me.tipo_movimiento = 'VENTA_ENVASE_CLIENTE' THEN me.cantidad ELSE 0 END),0) AS vendidos,
    COALESCE(SUM(CASE WHEN me.estado_destino = 'BAJA' THEN me.cantidad ELSE 0 END),0) AS bajas
FROM tipos_envase te
LEFT JOIN movimientos_envases me ON me.id_tipo_envase = te.id_tipo_envase
GROUP BY te.id_tipo_envase, te.codigo, te.nombre;

CREATE OR REPLACE VIEW v_deuda_clientes AS
SELECT
    c.id_cliente,
    c.codigo,
    c.nombres,
    c.numero_documento,
    c.limite_credito,
    c.credito_habilitado,
    COALESCE(SUM(CASE WHEN cc.tipo_movimiento IN ('CARGO','AJUSTE_CARGO') THEN cc.monto ELSE -cc.monto END),0) AS deuda_total,
    c.limite_credito - COALESCE(SUM(CASE WHEN cc.tipo_movimiento IN ('CARGO','AJUSTE_CARGO') THEN cc.monto ELSE -cc.monto END),0) AS credito_disponible
FROM clientes c
LEFT JOIN cuenta_corriente_cliente cc ON cc.id_cliente = c.id_cliente
GROUP BY c.id_cliente, c.codigo, c.nombres, c.numero_documento, c.limite_credito, c.credito_habilitado;

CREATE OR REPLACE VIEW v_deuda_envases_clientes AS
SELECT
    c.id_cliente,
    c.codigo,
    c.nombres,
    te.id_tipo_envase,
    te.codigo AS codigo_envase,
    te.nombre AS envase,
    COALESCE(SUM(
        CASE
            WHEN me.tipo_movimiento IN ('SALIDA_LLENO_CLIENTE','PRESTAMO_VACIO_CLIENTE') THEN me.cantidad
            WHEN me.tipo_movimiento = 'RECUPERACION_VACIO_CLIENTE' THEN -me.cantidad
            ELSE 0
        END
    ),0) AS cantidad_debe
FROM clientes c
INNER JOIN movimientos_envases me ON me.id_cliente = c.id_cliente
INNER JOIN tipos_envase te ON te.id_tipo_envase = me.id_tipo_envase
GROUP BY c.id_cliente, c.codigo, c.nombres, te.id_tipo_envase, te.codigo, te.nombre
HAVING cantidad_debe > 0;

CREATE OR REPLACE VIEW v_deuda_proveedores_envases AS
SELECT
    p.id_proveedor,
    p.codigo,
    p.razon_social,
    te.id_tipo_envase,
    te.codigo AS codigo_envase,
    te.nombre AS envase,
    COALESCE(SUM(
        CASE
            WHEN me.tipo_movimiento = 'RECEPCION_PROVEEDOR' THEN me.cantidad
            WHEN me.tipo_movimiento = 'DEVOLUCION_A_PROVEEDOR' THEN -me.cantidad
            ELSE 0
        END
    ),0) AS cantidad_debe_entregar
FROM proveedores p
INNER JOIN movimientos_envases me ON me.id_proveedor = p.id_proveedor
INNER JOIN tipos_envase te ON te.id_tipo_envase = me.id_tipo_envase
GROUP BY p.id_proveedor, p.codigo, p.razon_social, te.id_tipo_envase, te.codigo, te.nombre
HAVING cantidad_debe_entregar > 0;

CREATE OR REPLACE VIEW v_ventas_diarias AS
SELECT
    DATE(o.fecha_operacion) AS fecha,
    o.id_sucursal,
    COUNT(*) AS operaciones,
    SUM(o.total) AS total_vendido
FROM operaciones o
WHERE o.tipo_operacion = 'VENTA' AND o.estado = 'PROCESADA'
GROUP BY DATE(o.fecha_operacion), o.id_sucursal;

CREATE OR REPLACE VIEW v_ventas_mensuales AS
SELECT
    YEAR(o.fecha_operacion) AS anio,
    MONTH(o.fecha_operacion) AS mes,
    o.id_sucursal,
    COUNT(*) AS operaciones,
    SUM(o.total) AS total_vendido
FROM operaciones o
WHERE o.tipo_operacion = 'VENTA' AND o.estado = 'PROCESADA'
GROUP BY YEAR(o.fecha_operacion), MONTH(o.fecha_operacion), o.id_sucursal;

CREATE OR REPLACE VIEW v_ventas_repartidores AS
SELECT
    u.id_usuario,
    CONCAT(TRIM(u.nombres), ' ', TRIM(COALESCE(u.apellidos,''))) AS repartidor,
    COUNT(o.id_operacion) AS operaciones,
    COALESCE(SUM(o.total),0) AS total_vendido
FROM operaciones o
INNER JOIN usuarios u ON u.id_usuario = o.id_usuario
WHERE o.tipo_operacion = 'VENTA'
  AND o.origen = 'DELIVERY'
  AND o.estado = 'PROCESADA'
GROUP BY u.id_usuario, u.nombres, u.apellidos;

CREATE OR REPLACE VIEW v_frecuencia_clientes AS
SELECT
    c.id_cliente,
    c.codigo,
    c.nombres,
    COUNT(o.id_operacion) AS total_compras,
    COALESCE(SUM(o.total),0) AS total_comprado,
    MIN(o.fecha_operacion) AS primera_compra,
    MAX(o.fecha_operacion) AS ultima_compra,
    CASE
        WHEN COUNT(o.id_operacion) >= 15 THEN 'PREFERENTE'
        WHEN COUNT(o.id_operacion) >= 4 THEN 'FRECUENTE'
        ELSE 'OCASIONAL'
    END AS frecuencia_calculada
FROM clientes c
LEFT JOIN operaciones o
    ON o.id_cliente = c.id_cliente
   AND o.tipo_operacion = 'VENTA'
   AND o.estado = 'PROCESADA'
GROUP BY c.id_cliente, c.codigo, c.nombres;

CREATE OR REPLACE VIEW v_resumen_caja AS
SELECT
    ac.id_apertura,
    ac.id_caja,
    c.codigo AS caja,
    c.nombre AS nombre_caja,
    ac.id_usuario,
    CONCAT(TRIM(u.nombres), ' ', TRIM(COALESCE(u.apellidos,''))) AS usuario,
    ac.fecha_apertura,
    ac.monto_inicial,
    COALESCE(SUM(CASE WHEN cm.tipo_movimiento='INGRESO' AND cm.medio_pago='EFECTIVO' THEN cm.monto ELSE 0 END),0) AS ingresos_efectivo,
    COALESCE(SUM(CASE WHEN cm.tipo_movimiento='INGRESO' AND cm.medio_pago='YAPE' THEN cm.monto ELSE 0 END),0) AS ingresos_yape,
    COALESCE(SUM(CASE WHEN cm.tipo_movimiento='INGRESO' AND cm.medio_pago='TRANSFERENCIA' THEN cm.monto ELSE 0 END),0) AS ingresos_transferencia,
    COALESCE(SUM(CASE WHEN cm.tipo_movimiento='EGRESO' THEN cm.monto ELSE 0 END),0) AS egresos
FROM aperturas_caja ac
INNER JOIN cajas c ON c.id_caja = ac.id_caja
INNER JOIN usuarios u ON u.id_usuario = ac.id_usuario
LEFT JOIN caja_movimientos cm ON cm.id_apertura = ac.id_apertura
GROUP BY ac.id_apertura, ac.id_caja, c.codigo, c.nombre, ac.id_usuario, u.nombres, u.apellidos, ac.fecha_apertura, ac.monto_inicial;

CREATE OR REPLACE VIEW v_resumen_liquidaciones_repartidor AS
SELECT
    lr.id_liquidacion,
    jr.id_jornada,
    jr.fecha,
    jr.id_usuario,
    CONCAT(TRIM(u.nombres), ' ', TRIM(COALESCE(u.apellidos,''))) AS repartidor,
    lr.ventas_total,
    lr.cobrado_efectivo,
    lr.cobrado_yape,
    lr.cobrado_transferencia,
    lr.ventas_credito,
    lr.gastos_total,
    lr.importe_a_entregar,
    lr.monto_entregado,
    lr.diferencia,
    lr.fecha_liquidacion
FROM liquidaciones_repartidor lr
INNER JOIN jornadas_repartidor jr ON jr.id_jornada = lr.id_jornada
INNER JOIN usuarios u ON u.id_usuario = jr.id_usuario;

CREATE OR REPLACE VIEW v_pedidos_pendientes AS
SELECT
    p.id_pedido,
    p.numero,
    p.fecha_pedido,
    p.prioridad,
    p.estado,
    p.disponible_repartidores,
    c.id_cliente,
    c.nombres AS cliente,
    d.direccion,
    z.nombre AS zona,
    p.id_usuario_repartidor
FROM pedidos p
INNER JOIN clientes c ON c.id_cliente = p.id_cliente
INNER JOIN clientes_direcciones d ON d.id_direccion = p.id_direccion
LEFT JOIN zonas z ON z.id_zona = d.id_zona
WHERE p.estado IN ('PENDIENTE','ASIGNADO','EN_RUTA');

-- ============================================================
-- NOTA DE IMPLEMENTACIÓN
-- ============================================================
-- El usuario inicial es:
-- usuario: admin
-- clave: Admin123!
-- Cambiarla inmediatamente en producción.
-- ============================================================

SET FOREIGN_KEY_CHECKS = 1;
