-- =====================================================
-- Script de Migración Manual - Dispatch Baskets
-- =====================================================
-- Fecha: 18 de Octubre 2025
-- Propósito: Agregar campos de capacidad a dispatch_baskets
-- Uso: Solo si php artisan migrate falla
-- =====================================================

USE smartpos_cloud; -- Cambiar por el nombre de tu base de datos

-- =====================================================
-- 1. AGREGAR COLUMNAS NUEVAS
-- =====================================================

-- CRÍTICO: Hacer batch_id nullable para permitir puntos independientes
ALTER TABLE `dispatch_baskets` 
MODIFY COLUMN `batch_id` INT(11) NULL 
COMMENT 'ID del lote de despacho (nullable para puntos independientes)';

-- Hacer cliente_nombre nullable también
ALTER TABLE `dispatch_baskets` 
MODIFY COLUMN `cliente_nombre` VARCHAR(192) NULL 
COMMENT 'Nombre del cliente (nullable para puntos independientes)';

-- Capacidad máxima en kilogramos
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `capacidad_kg` DECIMAL(10,2) NOT NULL DEFAULT 0 
COMMENT 'Capacidad máxima en kilogramos del punto de alistamiento' 
AFTER `codigo_canasta`;

-- Capacidad máxima en unidades
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `capacidad_unidades` INT(11) NOT NULL DEFAULT 0 
COMMENT 'Capacidad máxima en unidades del punto de alistamiento' 
AFTER `capacidad_kg`;

-- Peso actual en kilogramos
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `peso_actual_kg` DECIMAL(10,2) NOT NULL DEFAULT 0 
COMMENT 'Peso actual en kilogramos del punto de alistamiento' 
AFTER `capacidad_unidades`;

-- Unidades actuales
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `unidades_actuales` INT(11) NOT NULL DEFAULT 0 
COMMENT 'Unidades actuales en el punto de alistamiento' 
AFTER `peso_actual_kg`;

-- Porcentaje de progreso
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `progreso` DECIMAL(5,2) NOT NULL DEFAULT 0 
COMMENT 'Porcentaje de progreso del punto de alistamiento (0-100)' 
AFTER `unidades_actuales`;

-- Descripción adicional
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `descripcion` VARCHAR(500) NULL 
COMMENT 'Descripción adicional del punto de alistamiento' 
AFTER `observaciones`;

-- Usuario creador
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `user_id` INT(10) UNSIGNED NULL 
COMMENT 'ID del usuario que creó el punto de alistamiento' 
AFTER `descripcion`;

-- Estado específico de canasta
ALTER TABLE `dispatch_baskets` 
ADD COLUMN `estado_canasta` ENUM('pending','picking','complete','maintenance') 
NOT NULL DEFAULT 'pending' 
COMMENT 'Estado específico del punto de alistamiento' 
AFTER `estado`;

-- =====================================================
-- 2. CREAR ÍNDICES PARA RENDIMIENTO
-- =====================================================

-- Índice para búsquedas por usuario
ALTER TABLE `dispatch_baskets` 
ADD INDEX `idx_dispatch_baskets_user_id` (`user_id`);

-- Índice para filtros por estado de canasta
ALTER TABLE `dispatch_baskets` 
ADD INDEX `idx_dispatch_baskets_estado_canasta` (`estado_canasta`);

-- =====================================================
-- 3. VERIFICAR CAMBIOS
-- =====================================================

-- Mostrar estructura actualizada
DESCRIBE `dispatch_baskets`;

-- Verificar índices creados
SHOW INDEXES FROM `dispatch_baskets`;

-- =====================================================
-- 4. SCRIPT DE ROLLBACK (Por si necesitas revertir)
-- =====================================================

/*
-- DESHACER CAMBIOS (ejecutar solo si es necesario)

-- Eliminar índices
ALTER TABLE `dispatch_baskets` DROP INDEX `idx_dispatch_baskets_user_id`;
ALTER TABLE `dispatch_baskets` DROP INDEX `idx_dispatch_baskets_estado_canasta`;

-- Eliminar columnas
ALTER TABLE `dispatch_baskets` 
DROP COLUMN `capacidad_kg`,
DROP COLUMN `capacidad_unidades`,
DROP COLUMN `peso_actual_kg`,
DROP COLUMN `unidades_actuales`,
DROP COLUMN `progreso`,
DROP COLUMN `descripcion`,
DROP COLUMN `user_id`,
DROP COLUMN `estado_canasta`;

-- Revertir batch_id a NOT NULL (solo si no hay registros con batch_id NULL)
ALTER TABLE `dispatch_baskets` 
MODIFY COLUMN `batch_id` INT(11) NOT NULL;

-- Revertir cliente_nombre a NOT NULL
ALTER TABLE `dispatch_baskets` 
MODIFY COLUMN `cliente_nombre` VARCHAR(192) NOT NULL;

-- Verificar que se eliminaron
DESCRIBE `dispatch_baskets`;
*/

-- =====================================================
-- 5. INSERTAR REGISTRO DE MIGRACIÓN
-- =====================================================

-- Registrar que la migración se ejecutó manualmente
INSERT INTO `migrations` (`migration`, `batch`) 
VALUES ('2025_10_18_195043_add_capacity_fields_to_dispatch_baskets_table', 
        (SELECT IFNULL(MAX(batch), 0) + 1 FROM migrations AS m));

-- Verificar registro
SELECT * FROM `migrations` 
WHERE migration LIKE '%dispatch_baskets%' 
ORDER BY id DESC;

-- =====================================================
-- 6. DATOS DE PRUEBA (Opcional)
-- =====================================================

/*
-- Insertar puntos de alistamiento de prueba

INSERT INTO `dispatch_baskets` (
    `codigo_canasta`, 
    `capacidad_kg`, 
    `capacidad_unidades`, 
    `peso_actual_kg`, 
    `unidades_actuales`, 
    `progreso`, 
    `descripcion`, 
    `estado_canasta`, 
    `user_id`,
    `ubicacion_fisica`,
    `cliente_nombre`,
    `estado`,
    `batch_id`,
    `created_at`, 
    `updated_at`
) VALUES 
(
    'PTO-001', 
    100.00, 
    1000, 
    0.00, 
    0, 
    0.00, 
    'Punto de alistamiento principal', 
    'pending', 
    1,
    'Bodega A - Zona 1',
    'Cliente Test',
    'pendiente',
    1,
    NOW(), 
    NOW()
),
(
    'PTO-002', 
    150.00, 
    1500, 
    0.00, 
    0, 
    0.00, 
    'Punto de alistamiento secundario', 
    'pending', 
    1,
    'Bodega A - Zona 2',
    'Cliente Test',
    'pendiente',
    1,
    NOW(), 
    NOW()
);

-- Verificar datos insertados
SELECT * FROM `dispatch_baskets` 
WHERE codigo_canasta IN ('PTO-001', 'PTO-002');
*/

-- =====================================================
-- 7. VERIFICACIÓN FINAL
-- =====================================================

-- Contar registros actuales
SELECT COUNT(*) as total_baskets FROM `dispatch_baskets`;

-- Verificar estructura final
SELECT 
    COLUMN_NAME, 
    DATA_TYPE, 
    IS_NULLABLE, 
    COLUMN_DEFAULT,
    COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
  AND TABLE_NAME = 'dispatch_baskets'
ORDER BY ORDINAL_POSITION;

-- =====================================================
-- FIN DEL SCRIPT
-- =====================================================

-- Notas:
-- 1. Cambiar 'smartpos_cloud' por el nombre real de tu DB
-- 2. Este script es equivalente a la migración Laravel
-- 3. Solo usar si 'php artisan migrate' falla
-- 4. Hacer backup de la DB antes de ejecutar
-- 5. Ejecutar línea por línea y verificar cada paso

-- Tiempo estimado de ejecución: 1-2 minutos
-- Compatible con: MySQL 5.7+, MariaDB 10.2+
