'RUTA', 'CONTRAENTREGA' => 'CONTRAENTREGA', 'NOCONTESTAVOLVERALLAMAR' => 'NO CONTESTA, VOLVER A LLAMAR', 'PENDIENTEARETORNO' => 'PENDIENTE A RETORNO', 'COMPLETADO' => 'COMPLETADO', 'EMPAQUETADO' => 'PREPARADO', 'PREPARADO' => 'PREPARADO', 'EMPACADO' => 'PREPARADO', 'EMPAQUETARDO' => 'PREPARADO', 'RETORNADO' => 'RETORNADO', 'ANULADO' => 'ANULADO', ]; return $aliases[$canonicalKey] ?? $normalized; } } if (!function_exists('tipoPaqueteIsValid')) { function tipoPaqueteIsValid(?string $value): bool { return $value === null || in_array($value, tipoPaqueteValidValues(), true); } } if (!function_exists('ensureTipoPaqueteEnumDefinition')) { function ensureTipoPaqueteEnumDefinition(PDO $pdo, bool $force = false): void { static $checked = false; if ($checked && !$force) { return; } $stmt = $pdo->query("SHOW COLUMNS FROM pedidos LIKE 'tipo_paquete'"); $column = $stmt ? $stmt->fetch(PDO::FETCH_ASSOC) : false; if (!$column || empty($column['Type'])) { $checked = true; return; } $currentType = (string) $column['Type']; $validValues = tipoPaqueteValidValues(); $missingRequiredValue = false; foreach ($validValues as $value) { if (strpos($currentType, "'" . str_replace("'", "''", $value) . "'") === false) { $missingRequiredValue = true; break; } } $hasLegacyPendiente = strpos($currentType, "'PENDIENTE'") !== false; $hasLegacyEmpaquetado = strpos($currentType, "'EMPAQUETADO'") !== false; if ($force || $missingRequiredValue || $hasLegacyPendiente || $hasLegacyEmpaquetado) { $quotedValues = array_map(static function (string $value) use ($pdo): string { return $pdo->quote($value); }, $validValues); $enumValuesSql = implode(', ', $quotedValues); $transitionValues = array_values(array_unique(array_merge( $validValues, ['EMPAQUETADO', 'PENDIENTE', 'NO CONTESTA', 'VOLVER A LLAMAR'] ))); $quotedTransitionValues = array_map(static function (string $value) use ($pdo): string { return $pdo->quote($value); }, $transitionValues); $transitionValuesSql = implode(', ', $quotedTransitionValues); $pdo->exec("ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM($transitionValuesSql) DEFAULT NULL"); $pdo->exec("UPDATE pedidos SET tipo_paquete = 'PREPARADO' WHERE tipo_paquete = 'EMPAQUETADO'"); $pdo->exec("UPDATE pedidos SET tipo_paquete = 'NO CONTESTA, VOLVER A LLAMAR' WHERE tipo_paquete IN ('NO CONTESTA', 'VOLVER A LLAMAR')"); $pdo->exec("UPDATE pedidos SET tipo_paquete = NULL WHERE tipo_paquete = 'PENDIENTE'"); $pdo->exec("UPDATE pedidos SET tipo_paquete = NULL WHERE tipo_paquete IS NOT NULL AND tipo_paquete NOT IN ($enumValuesSql)"); $pdo->exec("ALTER TABLE pedidos MODIFY COLUMN tipo_paquete ENUM($enumValuesSql) DEFAULT NULL"); } $checked = true; } }