137 lines
4.8 KiB
PHP
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;
|
|
}
|
|
}
|