-- =====================================================
-- MIGRACIÓN: Tabla de Arqueos de Caja
-- Descripción: Registro de aperturas y cierres de caja
-- =====================================================

USE `cio96247_sistema_pos`;

-- =====================================================
-- TABLA: arqueos_caja
-- =====================================================
CREATE TABLE IF NOT EXISTS `arqueos_caja` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `sesion_id` int(11) NOT NULL COMMENT 'Relación con la sesión del cajero',
  `cajero_id` int(11) NOT NULL,
  `sucursal_id` int(11) NOT NULL,
  `tipo` enum('apertura','cierre') NOT NULL,

  -- Datos de apertura
  `monto_inicial` decimal(10,2) DEFAULT 0.00 COMMENT 'Efectivo inicial en caja',
  `fecha_apertura` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

  -- Datos de cierre
  `fecha_cierre` timestamp NULL DEFAULT NULL,
  `monto_esperado_sistema` decimal(10,2) DEFAULT 0.00 COMMENT 'Total esperado según ventas',
  `monto_efectivo_contado` decimal(10,2) DEFAULT 0.00 COMMENT 'Efectivo físico contado',
  `monto_tarjetas` decimal(10,2) DEFAULT 0.00 COMMENT 'Total en tarjetas',
  `monto_transferencias` decimal(10,2) DEFAULT 0.00 COMMENT 'Total en transferencias',
  `diferencia` decimal(10,2) DEFAULT 0.00 COMMENT 'Diferencia entre esperado y contado',

  -- Resumen de ventas
  `total_ventas` int(11) DEFAULT 0 COMMENT 'Cantidad de ventas realizadas',
  `productos_vendidos` int(11) DEFAULT 0 COMMENT 'Total productos vendidos',
  `total_ingresos` decimal(10,2) DEFAULT 0.00 COMMENT 'Total facturado',

  -- Observaciones y estado
  `observaciones` text DEFAULT NULL COMMENT 'Notas del cajero sobre el arqueo',
  `estado` enum('abierto','cerrado','revisado') DEFAULT 'abierto',
  `revisado_por` int(11) DEFAULT NULL COMMENT 'ID del supervisor que revisó',
  `fecha_revision` timestamp NULL DEFAULT NULL,

  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (`id`),
  KEY `idx_sesion` (`sesion_id`),
  KEY `idx_cajero` (`cajero_id`),
  KEY `idx_sucursal` (`sucursal_id`),
  KEY `idx_fecha_apertura` (`fecha_apertura`),
  KEY `idx_estado` (`estado`),

  CONSTRAINT `fk_arqueo_sesion` FOREIGN KEY (`sesion_id`) REFERENCES `sesiones` (`id`),
  CONSTRAINT `fk_arqueo_cajero` FOREIGN KEY (`cajero_id`) REFERENCES `usuarios` (`id`),
  CONSTRAINT `fk_arqueo_sucursal` FOREIGN KEY (`sucursal_id`) REFERENCES `sucursales` (`id`),
  CONSTRAINT `fk_arqueo_revisor` FOREIGN KEY (`revisado_por`) REFERENCES `usuarios` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- =====================================================
-- MODIFICAR TABLA sesiones: agregar campo arqueo_id
-- =====================================================
ALTER TABLE `sesiones`
ADD COLUMN `arqueo_id` int(11) DEFAULT NULL COMMENT 'ID del arqueo asociado a esta sesión',
ADD COLUMN `cerrada` tinyint(1) DEFAULT 0 COMMENT 'Indica si la sesión fue cerrada correctamente',
ADD COLUMN `fecha_cierre` timestamp NULL DEFAULT NULL COMMENT 'Fecha de cierre de sesión';

-- Agregar índice para búsqueda rápida
ALTER TABLE `sesiones` ADD KEY `idx_arqueo` (`arqueo_id`);
ALTER TABLE `sesiones` ADD KEY `idx_cerrada` (`cerrada`);

-- =====================================================
-- VISTA: resumen_arqueos
-- =====================================================
CREATE OR REPLACE VIEW `resumen_arqueos` AS
SELECT
    a.id,
    a.cajero_id,
    u.nombre_completo as cajero_nombre,
    u.username as cajero_username,
    a.sucursal_id,
    s.nombre as sucursal_nombre,
    a.fecha_apertura,
    a.fecha_cierre,
    a.monto_inicial,
    a.monto_esperado_sistema,
    a.monto_efectivo_contado,
    a.diferencia,
    a.total_ventas,
    a.total_ingresos,
    a.estado,
    CASE
        WHEN a.diferencia = 0 THEN 'exacto'
        WHEN ABS(a.diferencia) <= 5 THEN 'aceptable'
        ELSE 'revisar'
    END as clasificacion_diferencia,
    TIMESTAMPDIFF(HOUR, a.fecha_apertura, a.fecha_cierre) as horas_trabajadas
FROM arqueos_caja a
INNER JOIN usuarios u ON a.cajero_id = u.id
INNER JOIN sucursales s ON a.sucursal_id = s.id;

COMMIT;
