From 17c381597c25b8591e4126fcaa3f75c9bbdce0b0 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 7 Jul 2026 03:05:06 +0000 Subject: [PATCH] Autosave: 20260707-030605 --- completados.php | 10 +++++-- listos_para_recojo.php | 10 +++++-- pedido_form.php | 24 +++++++++++++--- pedidos.php | 10 +++++-- pedidos_en_transito.php | 37 ++++++++++++++++++------ save_pedido.php | 27 ++++++++++++------ shalom_api.php | 62 ++++++++++++++++++++--------------------- 7 files changed, 122 insertions(+), 58 deletions(-) diff --git a/completados.php b/completados.php index 5e596135..997f9025 100644 --- a/completados.php +++ b/completados.php @@ -206,8 +206,14 @@ include 'layout_header.php'; } ?> - - Ver + + + Ver + + No disponible N/A diff --git a/listos_para_recojo.php b/listos_para_recojo.php index b1f817ea..64b94177 100644 --- a/listos_para_recojo.php +++ b/listos_para_recojo.php @@ -234,8 +234,14 @@ include 'layout_header.php'; - - Ver + + + Ver + + No disponible N/A diff --git a/pedido_form.php b/pedido_form.php index 4d6ee9b8..519309c1 100644 --- a/pedido_form.php +++ b/pedido_form.php @@ -323,18 +323,34 @@ include 'layout_header.php';
- + + + +
+ Voucher no disponible (archivo no encontrado).
- + + + +
+ Voucher no disponible (archivo no encontrado).
diff --git a/pedidos.php b/pedidos.php index c219cc69..4b093bf2 100644 --- a/pedidos.php +++ b/pedidos.php @@ -235,8 +235,14 @@ include 'layout_header.php'; - - Ver + + + Ver + + No disponible N/A diff --git a/pedidos_en_transito.php b/pedidos_en_transito.php index aaf94910..4e1da209 100644 --- a/pedidos_en_transito.php +++ b/pedidos_en_transito.php @@ -274,10 +274,16 @@ include 'layout_header.php'; - - Ver - N/A + + + Ver + + No disponible + + N/A @@ -565,16 +571,27 @@ document.addEventListener('DOMContentLoaded', function() { fetch(`shalom_api.php?orderNumber=${encodeURIComponent(orderNumber)}&orderCode=${encodeURIComponent(orderCode)}`) .then(async response => { + let rawText = ''; + try { rawText = await response.text(); } catch (e) { /* ignore */ } + let data = null; - try { data = await response.json(); } catch (e) { /* ignore */ } + if (rawText) { + try { data = JSON.parse(rawText); } catch (e) { /* ignore */ } + } if (!response.ok) { - const msg = (data && data.error) ? data.error : `HTTP ${response.status}`; - const details = (data && data.details) ? data.details : ''; + const msg = + (data && data.error) ? data.error : + rawText ? (rawText.length > 140 ? rawText.slice(0, 140) + '…' : rawText) : + `HTTP ${response.status}`; + let detailsText = ''; - if (details) { + if (data && Object.prototype.hasOwnProperty.call(data, 'details') && data.details !== undefined && data.details !== null && data.details !== '') { + const details = data.details; detailsText = typeof details === 'string' ? details : JSON.stringify(details); + } else if (rawText) { + detailsText = rawText; } // Devolvemos el error dentro de JSON para que el siguiente then lo pinte como Error @@ -607,8 +624,12 @@ document.addEventListener('DOMContentLoaded', function() { badgeText = `Shalom ${codeMatch2[1]}`; } else { const isTimeout = /timed out|timeout/i.test(errText) || /timed out|timeout/i.test(details); + const httpMatch = errText.match(/HTTP\s*(\d{3})/i); + if (isTimeout) { badgeText = 'Shalom timeout'; + } else if (httpMatch) { + badgeText = `Shalom HTTP ${httpMatch[1]}`; } else if (/comunicaci[oó]n/i.test(errText)) { badgeText = 'Error API Shalom'; } else { diff --git a/save_pedido.php b/save_pedido.php index c64b0593..93d3089e 100644 --- a/save_pedido.php +++ b/save_pedido.php @@ -9,23 +9,32 @@ require_once 'db/config.php'; function handle_upload($file_key, $current_path = null) { if (isset($_FILES[$file_key]) && $_FILES[$file_key]['error'] === UPLOAD_ERR_OK) { - $upload_dir = 'assets/uploads/vouchers/'; - if (!is_dir($upload_dir)) { - mkdir($upload_dir, 0775, true); - } + $upload_dir_rel = 'assets/uploads/vouchers/'; + $upload_dir_abs = __DIR__ . '/' . $upload_dir_rel; - if ($current_path && file_exists($current_path)) { - unlink($current_path); + if (!is_dir($upload_dir_abs)) { + mkdir($upload_dir_abs, 0775, true); } $filename = uniqid() . '-' . basename($_FILES[$file_key]['name']); - $path = $upload_dir . $filename; + $path_abs = $upload_dir_abs . $filename; + $path_rel = $upload_dir_rel . $filename; - if (move_uploaded_file($_FILES[$file_key]['tmp_name'], $path)) { - return $path; + // Move first; only delete the previous file after a successful upload. + if (move_uploaded_file($_FILES[$file_key]['tmp_name'], $path_abs)) { + if (!empty($current_path)) { + $current_abs = __DIR__ . '/' . $current_path; + if (file_exists($current_abs)) { + unlink($current_abs); + } + } + return $path_rel; } + + // Upload failed: keep the previous path (if any) return $current_path; } + return $current_path; } diff --git a/shalom_api.php b/shalom_api.php index 2dd3f5c4..538d753b 100644 --- a/shalom_api.php +++ b/shalom_api.php @@ -1,14 +1,26 @@ 'Número de orden y código de orden son requeridos.']); - exit; + respond_json(400, ['error' => 'Número de orden y código de orden son requeridos.'], $jsonOptions); } // Load env from executor/.env (helps when Apache/PHP doesn't export .env vars) @@ -36,7 +48,6 @@ function load_dotenv_if_needed(array $keys): void { // Strip potential surrounding quotes $v = trim($v, "\"' "); - // Do not override existing process env if (getenv($k) === false || getenv($k) === '') { putenv("{$k}={$v}"); @@ -70,11 +81,9 @@ if (!$apiKey) { } if (!$apiKey) { - http_response_code(500); - echo json_encode([ + respond_json(500, [ 'error' => 'Falta SHALOM_API_KEY. Configura la clave en Configuración General (Administrador) o en tu .env para poder consultar el tracking.', - ]); - exit; + ], $jsonOptions); } $url = 'https://shalom-api.lat/api/track'; @@ -86,9 +95,7 @@ $postData = [ $jsonData = json_encode($postData, JSON_UNESCAPED_UNICODE); if ($jsonData === false) { - http_response_code(500); - echo json_encode(['error' => 'Error serializando la solicitud a Shalom.']); - exit; + respond_json(500, ['error' => 'Error serializando la solicitud a Shalom.'], $jsonOptions); } $ch = curl_init(); @@ -116,27 +123,21 @@ $curlError = curl_error($ch); curl_close($ch); if ($curlError) { - http_response_code(502); - echo json_encode([ + respond_json(502, [ 'error' => 'Error en la comunicación con la API de Shalom', 'details' => $curlError, - ]); - exit; + ], $jsonOptions); } if ($response === false || $response === null || $response === '') { - http_response_code(502); - echo json_encode([ + respond_json(502, [ 'error' => 'Shalom no devolvió respuesta', 'http_code' => $httpCode ?: null, - ]); - exit; + ], $jsonOptions); } // Error HTTP del proveedor if ($httpCode >= 400) { - http_response_code($httpCode); - $errorBody = json_decode($response, true); $shMessage = null; @@ -145,20 +146,19 @@ if ($httpCode >= 400) { } if ($shMessage) { - echo json_encode([ + respond_json($httpCode, [ 'error' => "Error de la API de Shalom: {$shMessage}", 'http_code' => $httpCode, 'details' => $errorBody ?: $response, - ]); - } else { - echo json_encode([ - 'error' => "Error de la API de Shalom (código {$httpCode}).", - 'http_code' => $httpCode, - 'details' => $response, - ]); + ], $jsonOptions); } - exit; + + respond_json($httpCode, [ + 'error' => "Error de la API de Shalom (código {$httpCode}).", + 'http_code' => $httpCode, + 'details' => $response, + ], $jsonOptions); } -// OK: devolvemos tal cual lo que responde Shalom (la UI espera JSON con search/statuses) +// OK: devolvemos tal cual lo que responde Shalom (la UI espera JSON) echo $response;