This commit is contained in:
2025-06-09 08:50:28 -06:00
3 changed files with 88 additions and 72 deletions

View File

@@ -820,7 +820,6 @@ function update_status() {
$token = getApiToken(); $token = getApiToken();
if (!$token) { if (!$token) {
error_log("[update_status] No se pudo obtener token para crearPedimento"); 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']); echo json_encode(['success' => true, 'warning' => 'No se generó pedimento: sin token']);
exit; exit;
} }
@@ -845,9 +844,8 @@ function update_status() {
s.foto_solicitud_url, s.foto_solicitud_url,
s.proveedor_clave, s.proveedor_clave,
s.created_at, s.created_at,
s.updated_at s.updated_at,
-- Si existe columna patente agréga aquí: '9999' as patente
, s.patente
FROM dbo.solicitud_importacion_factura s FROM dbo.solicitud_importacion_factura s
WHERE s.id_solicitud = ? AND s.id_importador = ? 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 // 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 = ($solicitud['fecha_factura'] instanceof DateTime)
$fechaFactura = null; ? $solicitud['fecha_factura']->format('Y-m-d')
if ($solicitud['fecha_factura'] instanceof DateTime) { : $solicitud['fecha_factura'];
$fechaFactura = $solicitud['fecha_factura']->format('Y-m-d');
} else {
$fechaFactura = $solicitud['fecha_factura']; // en caso de que ya venga como string
}
$createdAt = null; $createdAt = ($solicitud['created_at'] instanceof DateTime)
if ($solicitud['created_at'] instanceof DateTime) { ? $solicitud['created_at']->format('Y-m-d\TH:i:s')
// Por ejemplo: "2025-05-16T07:48:15" : $solicitud['created_at'];
$createdAt = $solicitud['created_at']->format('Y-m-d\TH:i:s');
} else {
$createdAt = $solicitud['created_at'];
}
$updatedAt = null; $updatedAt = ($solicitud['updated_at'] instanceof DateTime)
if ($solicitud['updated_at'] instanceof DateTime) { ? $solicitud['updated_at']->format('Y-m-d\TH:i:s')
$updatedAt = $solicitud['updated_at']->format('Y-m-d\TH:i:s'); : $solicitud['updated_at'];
} else {
$updatedAt = $solicitud['updated_at'];
}
// 3.4) Obtener todas las partidas asociadas a esta solicitud // 3.4) Obtener todas las partidas asociadas a esta solicitud
$sqlPart = " $sqlPart = "
@@ -915,16 +902,14 @@ function update_status() {
} }
$partidas = []; $partidas = [];
while ($row = sqlsrv_fetch_array($stmtPart, SQLSRV_FETCH_ASSOC)) { while ($row = sqlsrv_fetch_array($stmtPart, SQLSRV_FETCH_ASSOC)) {
// Formatear creado_en si es DateTime
if ($row['creado_en'] instanceof DateTime) { if ($row['creado_en'] instanceof DateTime) {
$row['creado_en'] = $row['creado_en']->format('Y-m-d\TH:i:s'); $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_comercial'] = floatval($row['cantidad_comercial']); $row['cantidad_tarifa'] = floatval($row['cantidad_tarifa']);
$row['cantidad_tarifa'] = floatval($row['cantidad_tarifa']); $row['valor_factura'] = floatval($row['valor_factura']);
$row['valor_factura'] = floatval($row['valor_factura']); $row['peso_bruto'] = floatval($row['peso_bruto']);
$row['peso_bruto'] = floatval($row['peso_bruto']); $row['unidad_comercial_id'] = intval($row['unidad_comercial_id']);
$row['unidad_comercial_id']= intval($row['unidad_comercial_id']);
$partidas[] = $row; $partidas[] = $row;
} }
sqlsrv_free_stmt($stmtPart); sqlsrv_free_stmt($stmtPart);
@@ -934,36 +919,29 @@ function update_status() {
"id_solicitud" => intval($solicitud['id_solicitud']), "id_solicitud" => intval($solicitud['id_solicitud']),
"id_importador" => intval($solicitud['id_importador']), "id_importador" => intval($solicitud['id_importador']),
"aduana" => strval($solicitud['aduana']), "aduana" => strval($solicitud['aduana']),
// Si en tu tabla tienes “patente”, la incluyes; si no, puedes dejar cadena vacía o null "patente" => strval($solicitud['patente']),
"patente" => isset($solicitud['patente']) ? strval($solicitud['patente']) : "",
"anexo22_apendice" => strval($solicitud['anexo22_apendice']), "anexo22_apendice" => strval($solicitud['anexo22_apendice']),
"numero_factura" => strval($solicitud['numero_factura']), "numero_factura" => strval($solicitud['numero_factura']),
"fecha_factura" => $fechaFactura, "fecha_factura" => $fechaFactura,
// Si tu tabla tiene columna "numero_pedimento", úsala directamente "numero_pedimento" => "", // La API lo rellenará
"numero_pedimento" => isset($solicitud['numero_pedimento'])
? strval($solicitud['numero_pedimento'])
: "",
"incoterm" => strval($solicitud['incoterm']), "incoterm" => strval($solicitud['incoterm']),
"pais_proveedor" => strval($solicitud['pais_proveedor']), "pais_proveedor" => strval($solicitud['pais_proveedor']),
"tipo_moneda" => strval($solicitud['tipo_moneda']), "tipo_moneda" => strval($solicitud['tipo_moneda']),
"valor_factura" => floatval($solicitud['valor_factura']), "valor_factura" => floatval($solicitud['valor_factura']),
"vinculacion" => intval($solicitud['vinculacion']), "vinculacion" => intval($solicitud['vinculacion']),
"transportista_id" => intval($solicitud['transportista_id']), "transportista_id" => intval($solicitud['transportista_id']),
"status" => intval($solicitud['status']), // =2
"created_at" => $createdAt, "created_at" => $createdAt,
"updated_at" => $updatedAt, "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, "transporte_id" => null,
"chofer_id" => intval($solicitud['chofer_id']), "chofer_id" => intval($solicitud['chofer_id']),
"foto_solicitud_url"=> strval($solicitud['foto_solicitud_url']), "foto_solicitud_url"=> strval($solicitud['foto_solicitud_url']),
"proveedor_clave" => strval($solicitud['proveedor_clave']), "proveedor_clave" => strval($solicitud['proveedor_clave']),
"partidas" => $partidas "partidas" => $partidas
]; ];
// 3.6) Convertir a JSON
$jsonPayload = json_encode($payload); $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'] ?? '', '/'); $apiBase = rtrim($_ENV['API_URL'] ?? '', '/');
$urlPed = $apiBase . '/pedimentos/crearPedimento'; $urlPed = $apiBase . '/pedimentos/crearPedimento';
@@ -983,15 +961,39 @@ function update_status() {
$curlErr = curl_error($ch); $curlErr = curl_error($ch);
curl_close($ch); curl_close($ch);
// 3.8) Verificar respuesta del endpoint pedimentos // 3.7) Verificar respuesta del endpoint pedimentos
if ($httpPed === 201 || $httpPed === 200) { 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"); 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; exit;
} else { } else {
error_log("[update_status] Error al crear pedimento (HTTP $httpPed): $respPed · cURL error: $curlErr"); 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([ echo json_encode([
'success' => true, 'success' => true,
'warning' => "Status actualizado, pero fallo al crear pedimento (HTTP $httpPed)" 'warning' => "Status actualizado, pero fallo al crear pedimento (HTTP $httpPed)"

View File

@@ -233,7 +233,7 @@
<!-- Activo --> <!-- Activo -->
<div class="form-check mb-4"> <div class="form-check mb-4">
<input id="status" name="status" type="checkbox" class="hide form-check-input" <?= $factura['status']==1?'checked':'' ?>> <input id="status" value=1 name="status" type="checkbox" class="hide form-check-input" <?= $factura['status']==1?'checked':'' ?>>
<label for="status" class="hide form-check-label">Activo</label> <label for="status" class="hide form-check-label">Activo</label>
</div> </div>
@@ -269,6 +269,7 @@
// ✅ 2. FUNCIÓN PARA CARGAR PROVEEDORES (CON PROMESA) // ✅ 2. FUNCIÓN PARA CARGAR PROVEEDORES (CON PROMESA)
function cargarProveedores() { function cargarProveedores() {
const proveedorEl = document.getElementById('proveedor_id'); const proveedorEl = document.getElementById('proveedor_id');
// Obtenemos la cadena con la ID del proveedor guardado
const proveedorActual = '<?= htmlspecialchars($proveedor_clave_actual ?? '') ?>'; const proveedorActual = '<?= htmlspecialchars($proveedor_clave_actual ?? '') ?>';
return fetch('/IMPORTADORES/solicitud_importacion/ajax_proveedores') return fetch('/IMPORTADORES/solicitud_importacion/ajax_proveedores')
@@ -287,8 +288,8 @@
opt.value = item.id; opt.value = item.id;
opt.textContent = item.text; opt.textContent = item.text;
// ✅ Pre-seleccionar si coincide con el proveedor actual // Comparar forzando a cadena para que coincida con proveedorActual
if (item.id === proveedorActual && proveedorActual !== '') { if (String(item.id) === proveedorActual && proveedorActual !== '') {
opt.selected = true; opt.selected = true;
} }
@@ -395,4 +396,4 @@
</script> </script>
</body> </body>
</html> </html>

View File

@@ -151,29 +151,42 @@
// $row.find('.status-select').prop('disabled', disable); // $row.find('.status-select').prop('disabled', disable);
} }
// Al cambiar el select de status // Al cambiar el select de status
$('#tabla-solicitudes').on('change', '.status-select', function () { $('#tabla-solicitudes').on('change', '.status-select', function () {
const $sel = $(this); const $sel = $(this);
const id = $sel.data('id'); const id = $sel.data('id');
const status = $sel.val(); const status = $sel.val();
const $row = $sel.closest('tr'); const $row = $sel.closest('tr');
// Bloquear botones localmente // Bloquear botones localmente
updateRowStatus($row, status); 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” // Al cargar, aplica bloqueo si ya está en “Solicitar importación”
$('#tabla-solicitudes tbody tr').each(function () { $('#tabla-solicitudes tbody tr').each(function () {