-- Catálogo de Categorías de Gasto
CREATE TABLE IF NOT EXISTS categorias_gastos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    codigo_cuenta_contable VARCHAR(50), -- Para integración contable
    activo BOOLEAN DEFAULT TRUE,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Catálogo de Proveedores
CREATE TABLE IF NOT EXISTS proveedores (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(200) NOT NULL,
    nit_dui VARCHAR(50), -- Identificación fiscal
    activo BOOLEAN DEFAULT TRUE,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Cabecera de Caja Chica
CREATE TABLE IF NOT EXISTS cajas_chicas (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL, -- Ej. "Caja Chica Administración"
    responsable_usuario_id BIGINT NOT NULL, -- FK a Usuarios
    monto_asignado DECIMAL(10,2) NOT NULL, -- El fondo fijo (ej. $500)
    saldo_actual DECIMAL(10,2) NOT NULL, -- Efectivo disponible
    estado VARCHAR(20) NOT NULL DEFAULT 'ABIERTA', -- ABIERTA, CERRADA, ARQUEO
    fecha_apertura DATE NOT NULL,
    fecha_cierre DATE,
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    actualizado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT chk_saldo_positivo CHECK (saldo_actual >= 0),
    CONSTRAINT fk_caja_responsable FOREIGN KEY (responsable_usuario_id) REFERENCES usuarios(id)
);

-- Movimientos (Ingresos, Egresos, Reembolsos)
CREATE TABLE IF NOT EXISTS caja_chica_movimientos (
    id BIGSERIAL PRIMARY KEY,
    caja_chica_id INT NOT NULL REFERENCES cajas_chicas(id),
    tipo_movimiento VARCHAR(20) NOT NULL, -- GASTO, APERTURA, REPOSICION, AUMENTO_FONDO, DISMINUCION_FONDO, AJUSTE
    fecha_movimiento DATE NOT NULL,
    monto DECIMAL(10,2) NOT NULL,
    descripcion TEXT NOT NULL,
    categoria_gasto_id INT REFERENCES categorias_gastos(id), -- Null si no es gasto
    proveedor_id INT REFERENCES proveedores(id), -- Null si no aplica
    usuario_registro_id BIGINT NOT NULL, -- Auditoría: Quién registró
    estado_reembolso VARCHAR(20) DEFAULT 'PENDIENTE', -- PENDIENTE, REEMBOLSADO, ANULADO
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT chk_monto_positivo CHECK (monto > 0),
    CONSTRAINT fk_movimiento_usuario FOREIGN KEY (usuario_registro_id) REFERENCES usuarios(id)
);

-- Documentos de Soporte (Adjuntos)
CREATE TABLE IF NOT EXISTS documentos_soporte (
    id BIGSERIAL PRIMARY KEY,
    movimiento_id BIGINT NOT NULL REFERENCES caja_chica_movimientos(id) ON DELETE CASCADE,
    tipo_documento VARCHAR(50) NOT NULL, -- FACTURA, RECIBO, VALE
    numero_documento VARCHAR(50),
    ruta_archivo TEXT, -- Path al archivo físico o URL
    creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Índices Recomendados
CREATE INDEX IF NOT EXISTS idx_movimientos_caja ON caja_chica_movimientos(caja_chica_id);
CREATE INDEX IF NOT EXISTS idx_movimientos_fecha ON caja_chica_movimientos(fecha_movimiento);
CREATE INDEX IF NOT EXISTS idx_movimientos_estado ON caja_chica_movimientos(estado_reembolso);
