FUNCION UPDATE STATUS

This commit is contained in:
2025-06-04 12:26:27 -06:00
parent bf3c2d19a3
commit 4fdb47beb3
5 changed files with 226 additions and 9 deletions

View File

@@ -774,30 +774,223 @@ function ajax_lista()
}
function update_status() {
header('Content-Type: application/json; charset=utf-8');
if (!($_SESSION['usuario_id'] ?? false)) {
http_response_code(401);
echo json_encode(['error'=>'No autorizado']);
exit;
http_response_code(401);
echo json_encode(['error' => 'No autorizado']);
exit;
}
$id = intval($_POST['id'] ?? 0);
$status = intval($_POST['status'] ?? 0);
// 1) Conexión a la BD
$conn = getConnection();
// 2) Actualizar el status en la tabla solicitud_importacion_factura
$sql = "UPDATE dbo.solicitud_importacion_factura
SET status=?
WHERE id_solicitud=? AND id_importador=?";
$params = [$status, $id, $_SESSION['usuario_id']];
$stmt = sqlsrv_query($conn, $sql, $params);
if ($stmt === false) {
http_response_code(500);
echo json_encode(['error'=>'Error al actualizar status']);
exit;
http_response_code(500);
echo json_encode(['error' => 'Error al actualizar status']);
exit;
}
echo json_encode(['success'=>true]);
// 3) Si el status actualizado es 2, hacer POST a /pedimentos/crearPedimento
if ($status === 2) {
// 3.1) Obtener o renovar el token de la API
$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;
}
// 3.2) Leer de la BD todos los campos de la cabecera de la solicitud
$sqlSel = "
SELECT
s.id_solicitud,
s.id_importador,
s.aduana,
s.numero_pedimento,
s.anexo22_apendice,
s.numero_factura,
s.fecha_factura,
s.incoterm,
s.pais_proveedor,
s.tipo_moneda,
s.valor_factura,
s.vinculacion,
s.transportista_id,
s.chofer_id,
s.foto_solicitud_url,
s.proveedor_clave,
s.created_at,
s.updated_at
-- Si existe columna patente agréga aquí:
, s.patente
FROM dbo.solicitud_importacion_factura s
WHERE s.id_solicitud = ? AND s.id_importador = ?
";
$stmtSel = sqlsrv_query($conn, $sqlSel, [$id, $_SESSION['usuario_id']]);
if ($stmtSel === false) {
error_log("[update_status] Error al consultar solicitud: " . print_r(sqlsrv_errors(), true));
echo json_encode(['success' => true, 'warning' => 'Status actualizado, fallo al leer datos para pedimento']);
exit;
}
$solicitud = sqlsrv_fetch_array($stmtSel, SQLSRV_FETCH_ASSOC);
sqlsrv_free_stmt($stmtSel);
if (!$solicitud) {
error_log("[update_status] No se encontró la solicitud para id={$id}");
echo json_encode(['success' => true, 'warning' => 'Status actualizado, solicitud no encontrada para pedimento']);
exit;
}
// 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
}
$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'];
}
$updatedAt = null;
if ($solicitud['updated_at'] instanceof DateTime) {
$updatedAt = $solicitud['updated_at']->format('Y-m-d\TH:i:s');
} else {
$updatedAt = $solicitud['updated_at'];
}
// 3.4) Obtener todas las partidas asociadas a esta solicitud
$sqlPart = "
SELECT
p.id_partida,
p.id_solicitud,
p.descripcion,
p.creado_en,
p.cantidad_comercial,
p.cantidad_tarifa,
p.valor_factura,
p.peso_bruto,
p.unidad_comercial_id,
p.tasa_preferencial
FROM dbo.solicitud_importacion_partidas p
WHERE p.id_solicitud = ?
ORDER BY p.id_partida
";
$stmtPart = sqlsrv_query($conn, $sqlPart, [$id]);
if ($stmtPart === false) {
error_log("[update_status] Error al consultar partidas: " . print_r(sqlsrv_errors(), true));
echo json_encode(['success' => true, 'warning' => 'Status actualizado, fallo al leer partidas para pedimento']);
exit;
}
$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']);
$partidas[] = $row;
}
sqlsrv_free_stmt($stmtPart);
// 3.5) Construir el arreglo PHP con la misma estructura JSON que envías
$payload = [
"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']) : "",
"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'])
: "",
"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
$apiBase = rtrim($_ENV['API_URL'] ?? '', '/');
$urlPed = $apiBase . '/pedimentos/crearPedimento';
$ch = curl_init($urlPed);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => [
"Authorization: $token",
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => $jsonPayload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$respPed = curl_exec($ch);
$httpPed = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlErr = curl_error($ch);
curl_close($ch);
// 3.8) Verificar respuesta del endpoint pedimentos
if ($httpPed === 201 || $httpPed === 200) {
// Suponiendo que el endpoint devuelve 201 o 200 cuando se crea correctamente
error_log("[update_status] Pedimento creado con éxito para solicitud $id → HTTP $httpPed$respPed");
echo json_encode(['success' => true, 'pedimento' => json_decode($respPed, true)]);
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)"
]);
exit;
}
}
// 4) Si el status no es 2, devolvemos normal
echo json_encode(['success' => true]);
exit;
}
// Función para generar el PDF
use Dompdf\Dompdf;
use Dompdf\Options;