34849-vm/includes/tipo_paquete.php
2026-06-10 16:19:28 +00:00

137 lines
4.8 KiB
PHP

<?php
if (!function_exists('tipoPaqueteValidValues')) {
function tipoPaqueteValidValues(): array
{
return [
'RUTA',
'CONTRAENTREGA',
'NO CONTESTA, VOLVER A LLAMAR',
'PENDIENTE A RETORNO',
'COMPLETADO',
'PREPARADO',
'RETORNADO',
'ANULADO',
];
}
}
if (!function_exists('tipoPaquetePrimarySelectorValues')) {
function tipoPaquetePrimarySelectorValues(): array
{
return [
'PREPARADO',
'RUTA',
'ANULADO',
'PENDIENTE A RETORNO',
'RETORNADO',
'COMPLETADO',
];
}
}
if (!function_exists('normalizeTipoPaqueteValue')) {
function normalizeTipoPaqueteValue($value): ?string
{
if ($value === null || is_array($value)) {
return null;
}
$value = (string) $value;
$value = preg_replace('/[\x{00A0}\x{200B}-\x{200D}\x{FEFF}]+/u', ' ', $value);
$value = preg_replace('/[\x00-\x1F\x7F]+/u', ' ', $value);
$value = preg_replace('/\s+/u', ' ', trim($value));
if ($value === '') {
return null;
}
$normalized = function_exists('mb_strtoupper') ? mb_strtoupper($value, 'UTF-8') : strtoupper($value);
$match = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $normalized);
if ($match === false || $match === null || $match === '') {
$match = $normalized;
}
$canonicalKey = preg_replace('/[^A-Z]+/', '', strtoupper($match));
$aliases = [
'RUTA' => '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;
}
}