diff --git a/app/controllers/solicitud_importacion.php b/app/controllers/solicitud_importacion.php index a8b6ef3..64c2eab 100644 --- a/app/controllers/solicitud_importacion.php +++ b/app/controllers/solicitud_importacion.php @@ -820,7 +820,6 @@ function update_status() { $token = getApiToken(); if (!$token) { error_log("[update_status] No se pudo obtener token para crearPedimento"); - // Podemos optar por responder con éxito local y solo loguear el error: echo json_encode(['success' => true, 'warning' => 'No se generó pedimento: sin token']); exit; } @@ -845,9 +844,8 @@ function update_status() { s.foto_solicitud_url, s.proveedor_clave, s.created_at, - s.updated_at - -- Si existe columna ‘patente’ agréga aquí: - , s.patente + s.updated_at, + '9999' as patente FROM dbo.solicitud_importacion_factura s WHERE s.id_solicitud = ? AND s.id_importador = ? "; @@ -867,28 +865,17 @@ function update_status() { } // 3.3) Formatear fechas (si vienen como DateTime) antes de construir JSON - // La API espera "YYYY-MM-DD" para fecha_factura y tipo ISO 8601 para created_at/updated_at. - $fechaFactura = null; - if ($solicitud['fecha_factura'] instanceof DateTime) { - $fechaFactura = $solicitud['fecha_factura']->format('Y-m-d'); - } else { - $fechaFactura = $solicitud['fecha_factura']; // en caso de que ya venga como string - } + $fechaFactura = ($solicitud['fecha_factura'] instanceof DateTime) + ? $solicitud['fecha_factura']->format('Y-m-d') + : $solicitud['fecha_factura']; - $createdAt = null; - if ($solicitud['created_at'] instanceof DateTime) { - // Por ejemplo: "2025-05-16T07:48:15" - $createdAt = $solicitud['created_at']->format('Y-m-d\TH:i:s'); - } else { - $createdAt = $solicitud['created_at']; - } + $createdAt = ($solicitud['created_at'] instanceof DateTime) + ? $solicitud['created_at']->format('Y-m-d\TH:i:s') + : $solicitud['created_at']; - $updatedAt = null; - if ($solicitud['updated_at'] instanceof DateTime) { - $updatedAt = $solicitud['updated_at']->format('Y-m-d\TH:i:s'); - } else { - $updatedAt = $solicitud['updated_at']; - } + $updatedAt = ($solicitud['updated_at'] instanceof DateTime) + ? $solicitud['updated_at']->format('Y-m-d\TH:i:s') + : $solicitud['updated_at']; // 3.4) Obtener todas las partidas asociadas a esta solicitud $sqlPart = " @@ -915,16 +902,14 @@ function update_status() { } $partidas = []; while ($row = sqlsrv_fetch_array($stmtPart, SQLSRV_FETCH_ASSOC)) { - // Formatear creado_en si es DateTime if ($row['creado_en'] instanceof DateTime) { $row['creado_en'] = $row['creado_en']->format('Y-m-d\TH:i:s'); } - // Asegurarnos de que los valores numéricos sean del tipo correcto - $row['cantidad_comercial'] = floatval($row['cantidad_comercial']); - $row['cantidad_tarifa'] = floatval($row['cantidad_tarifa']); - $row['valor_factura'] = floatval($row['valor_factura']); - $row['peso_bruto'] = floatval($row['peso_bruto']); - $row['unidad_comercial_id']= intval($row['unidad_comercial_id']); + $row['cantidad_comercial'] = floatval($row['cantidad_comercial']); + $row['cantidad_tarifa'] = floatval($row['cantidad_tarifa']); + $row['valor_factura'] = floatval($row['valor_factura']); + $row['peso_bruto'] = floatval($row['peso_bruto']); + $row['unidad_comercial_id'] = intval($row['unidad_comercial_id']); $partidas[] = $row; } sqlsrv_free_stmt($stmtPart); @@ -934,36 +919,29 @@ function update_status() { "id_solicitud" => intval($solicitud['id_solicitud']), "id_importador" => intval($solicitud['id_importador']), "aduana" => strval($solicitud['aduana']), - // Si en tu tabla tienes “patente”, la incluyes; si no, puedes dejar cadena vacía o null - "patente" => isset($solicitud['patente']) ? strval($solicitud['patente']) : "", + "patente" => strval($solicitud['patente']), "anexo22_apendice" => strval($solicitud['anexo22_apendice']), "numero_factura" => strval($solicitud['numero_factura']), "fecha_factura" => $fechaFactura, - // Si tu tabla tiene columna "numero_pedimento", úsala directamente - "numero_pedimento" => isset($solicitud['numero_pedimento']) - ? strval($solicitud['numero_pedimento']) - : "", + "numero_pedimento" => "", // La API lo rellenará "incoterm" => strval($solicitud['incoterm']), "pais_proveedor" => strval($solicitud['pais_proveedor']), "tipo_moneda" => strval($solicitud['tipo_moneda']), "valor_factura" => floatval($solicitud['valor_factura']), "vinculacion" => intval($solicitud['vinculacion']), "transportista_id" => intval($solicitud['transportista_id']), - "status" => intval($solicitud['status']), // =2 + "created_at" => $createdAt, "updated_at" => $updatedAt, - // Si en BD se usa “transporte_id” en lugar de “transportista_id”, ajústalo. Aquí lo ponemos null si no existe. "transporte_id" => null, "chofer_id" => intval($solicitud['chofer_id']), "foto_solicitud_url"=> strval($solicitud['foto_solicitud_url']), "proveedor_clave" => strval($solicitud['proveedor_clave']), "partidas" => $partidas ]; - - // 3.6) Convertir a JSON $jsonPayload = json_encode($payload); - // 3.7) Preparar cURL para hacer POST a /pedimentos/crearPedimento + // 3.6) Preparar cURL para hacer POST a /pedimentos/crearPedimento $apiBase = rtrim($_ENV['API_URL'] ?? '', '/'); $urlPed = $apiBase . '/pedimentos/crearPedimento'; @@ -983,15 +961,39 @@ function update_status() { $curlErr = curl_error($ch); curl_close($ch); - // 3.8) Verificar respuesta del endpoint pedimentos + // 3.7) Verificar respuesta del endpoint pedimentos if ($httpPed === 201 || $httpPed === 200) { - // Suponiendo que el endpoint devuelve 201 o 200 cuando se crea correctamente + $decoded = json_decode($respPed, true); + // Si existe PEDIMENTO dentro de la clave 'pedimento' + if (isset($decoded['pedimento']['PEDIMENTO'])) { + $numeroPedimento = $decoded['pedimento']['PEDIMENTO']; + + // 3.8) Actualizar localmente el campo numero_pedimento + $sqlUpdPed = " + UPDATE dbo.solicitud_importacion_factura + SET numero_pedimento = ? + WHERE id_solicitud = ? + AND id_importador = ? + "; + $stmtUpdPed = sqlsrv_query( + $conn, + $sqlUpdPed, + [$numeroPedimento, $id, $_SESSION['usuario_id']] + ); + if ($stmtUpdPed === false) { + error_log("[update_status] Error al actualizar numero_pedimento en BD: " . print_r(sqlsrv_errors(), true)); + } + } + error_log("[update_status] Pedimento creado con éxito para solicitud $id → HTTP $httpPed → $respPed"); - echo json_encode(['success' => true, 'pedimento' => json_decode($respPed, true)]); + echo json_encode([ + 'success' => true, + 'pedimento' => $decoded['pedimento'], + 'numeroPedimentoLocal' => $numeroPedimento + ]); exit; } else { error_log("[update_status] Error al crear pedimento (HTTP $httpPed): $respPed · cURL error: $curlErr"); - // Devolvemos estado local ok, pero avisamos que falló el POST echo json_encode([ 'success' => true, 'warning' => "Status actualizado, pero fallo al crear pedimento (HTTP $httpPed)" diff --git a/views/solicitud_importacion/editar.php b/views/solicitud_importacion/editar.php index b3712a8..454f88b 100644 --- a/views/solicitud_importacion/editar.php +++ b/views/solicitud_importacion/editar.php @@ -233,7 +233,7 @@
- > + >
@@ -269,6 +269,7 @@ // ✅ 2. FUNCIÓN PARA CARGAR PROVEEDORES (CON PROMESA) function cargarProveedores() { const proveedorEl = document.getElementById('proveedor_id'); + // Obtenemos la cadena con la ID del proveedor guardado const proveedorActual = ''; return fetch('/IMPORTADORES/solicitud_importacion/ajax_proveedores') @@ -287,8 +288,8 @@ opt.value = item.id; opt.textContent = item.text; - // ✅ Pre-seleccionar si coincide con el proveedor actual - if (item.id === proveedorActual && proveedorActual !== '') { + // Comparar forzando a cadena para que coincida con proveedorActual + if (String(item.id) === proveedorActual && proveedorActual !== '') { opt.selected = true; } @@ -395,4 +396,4 @@ - \ No newline at end of file + diff --git a/views/solicitud_importacion/lista.php b/views/solicitud_importacion/lista.php index 41b5347..d9cc413 100644 --- a/views/solicitud_importacion/lista.php +++ b/views/solicitud_importacion/lista.php @@ -151,29 +151,42 @@ // $row.find('.status-select').prop('disabled', disable); } - // Al cambiar el select de status - $('#tabla-solicitudes').on('change', '.status-select', function () { - const $sel = $(this); - const id = $sel.data('id'); - const status = $sel.val(); - const $row = $sel.closest('tr'); - // Bloquear botones localmente - updateRowStatus($row, status); +// Al cambiar el select de status +$('#tabla-solicitudes').on('change', '.status-select', function () { + const $sel = $(this); + const id = $sel.data('id'); + const status = $sel.val(); + const $row = $sel.closest('tr'); + // Bloquear botones localmente + updateRowStatus($row, status); + + // Llamada AJAX + $.post( + '/IMPORTADORES/solicitud_importacion/update_status', + { id: id, status: status }, + null, + 'json' + ) + .done(function(res) { + if (!res.success) { + Swal.fire('Error', 'No se pudo actualizar status', 'error'); + } else if (res.numeroPedimentoLocal) { + // Si vino numeroPedimentoLocal, mostramos alerta específica + Swal.fire( + 'Importación solicitada', + 'Se generó el número de pedimento: ' + res.numeroPedimentoLocal, + 'success' + ); + // Además podrías actualizar en la tabla la celda de "Pedimento" si quieres: + $row.find('td:nth-child(4)').text(res.numeroPedimentoLocal); + } + // Si success pero no viene numeroPedimentoLocal, no hacemos nada especial. + }) + .fail(function() { + Swal.fire('Error', 'No se pudo conectar al servidor', 'error'); + }); +}); - // Llamada AJAX - $.post( - '/IMPORTADORES/solicitud_importacion/update_status', - { id: id, status: status }, - function(res) { - if (!res.success) { - Swal.fire('Error','No se pudo actualizar status','error'); - } - }, - 'json' - ).fail(() => { - Swal.fire('Error','No se pudo conectar al servidor','error'); - }); - }); // Al cargar, aplica bloqueo si ya está en “Solicitar importación” $('#tabla-solicitudes tbody tr').each(function () {