Aprobación de Agencias

This commit is contained in:
2025-07-14 13:27:15 -06:00
parent e820f81d31
commit 0e88fea37e
36 changed files with 2807 additions and 1128 deletions

View File

@@ -1,4 +1,5 @@
<?php
// app/controllers/proveedores.php
require_once __DIR__ . '/../helpers/session.php';
require_once __DIR__ . '/../../config/database.php';
// 1) Composer autoload (phpdotenv y demás libs)
@@ -28,11 +29,11 @@ function getApiToken(): ?string
// 2) Sí o sí hacemos login en la API
$url = rtrim($_ENV['API_URL'] ?? '', '/') . '/auth/login';
$user = $_ENV['API_USER'] ?? '';
$pass = $_ENV['API_PASS'] ?? '';
$user = $_ENV['API_USER'] ?? '';
$pass = $_ENV['API_PASS'] ?? '';
$body = json_encode(['username' => $user, 'password' => $pass]);
error_log("[getApiToken] POST $url$body");
error_log("[getApiToken] POST $url");
$ch = curl_init($url);
curl_setopt_array($ch, [
@@ -46,7 +47,7 @@ function getApiToken(): ?string
$http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
error_log("[getApiToken] HTTP $http$resp");
error_log("[getApiToken] HTTP $http");
if ($http === 200 && ($data = json_decode($resp, true)) && !empty($data['token'])) {
// 3) Guardamos token y tiempo actual
@@ -87,62 +88,82 @@ function ajax_lista()
$token = getApiToken();
if (!$token) {
error_log('[ajax_lista] Sin token válido');
// Devolvemos estructura vacía
echo json_encode(['data' => []]);
echo json_encode(['data' => [], 'error' => 'No se pudo obtener token de autenticación']);
return;
}
// 3) Construimos la URL de la API
// CORRECCIÓN: Usar la misma estructura de URL que en otras funciones
$apiBase = rtrim($_ENV['API_URL'] ?? '', '/');
$url = $apiBase . '/proveedores';
$url = $apiBase . '/api/proveedores'; // Cambié para que sea consistente
error_log("[ajax_lista] GET $url");
// 4) Ejecutamos cURL
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ["Authorization: $token", 'Accept: application/json'],
// CORRECCIÓN: Agregar "Bearer" al token
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token", 'Accept: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
CURLOPT_TIMEOUT => 10, // Aumenté el timeout
]);
$resp = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_error($ch);
curl_close($ch);
error_log("[ajax_lista] HTTP $status$resp");
error_log("[ajax_lista] HTTP $status");
// MEJORA: Verificar errores de cURL
if ($curlError) {
error_log("[ajax_lista] cURL Error: $curlError");
echo json_encode(['data' => [], 'error' => 'Error de conexión con la API']);
return;
}
// MEJORA: Mejor manejo de errores
if ($status !== 200) {
error_log("[ajax_lista] Error HTTP $status: $resp");
echo json_encode(['data' => [], 'error' => "Error HTTP $status"]);
return;
}
$json = json_decode($resp, true);
if (!is_array($json)) {
error_log("[ajax_lista] Respuesta no es un array válido: $resp");
echo json_encode(['data' => [], 'error' => 'Respuesta inválida de la API']);
return;
}
error_log("[ajax_lista] Procesando " . count($json) . " proveedores");
// 5) Parseamos y formateamos
$dataList = [];
if ($status === 200 && ($json = json_decode($resp, true)) && is_array($json)) {
foreach ($json as $p) {
$clave = htmlspecialchars($p['Clave'] ?? '', ENT_QUOTES);
foreach ($json as $p) {
$clave = htmlspecialchars($p['Clave'] ?? '', ENT_QUOTES);
// Construir dirección
$direccion = trim(implode(', ', array_filter([
$p['Calles'] ?? '',
'Num. Ext: ' . ($p['NumExt'] ?? ''),
'Num. Int: ' . ($p['NumInt'] ?? ''),
$p['Colonia'] ?? '',
$p['Municipio'] ?? '',
$p['Ciudad'] ?? '',
'C.P. ' . ($p['CodigoPostal'] ?? ''),
$p['EntidadFederativa'] ?? '',
$p['Pais'] ?? ''
])));
// Construir dirección de forma más robusta
$direccionParts = array_filter([
$p['Calles'] ?? '',
($p['NumExt'] ?? '') ? 'Num. Ext: ' . $p['NumExt'] : '',
($p['NumInt'] ?? '') ? 'Num. Int: ' . $p['NumInt'] : '',
$p['Colonia'] ?? '',
$p['Municipio'] ?? '',
$p['Ciudad'] ?? '',
($p['CodigoPostal'] ?? '') ? 'C.P. ' . $p['CodigoPostal'] : '',
$p['EntidadFederativa'] ?? '',
$p['Pais'] ?? ''
]);
$direccion = implode(', ', $direccionParts);
$dataList[] = [
$clave,
htmlspecialchars($p['Nombre'] ?? '', ENT_QUOTES),
htmlspecialchars($p['RFC'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Ciudad'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Telefono'] ?? '', ENT_QUOTES),
htmlspecialchars($direccion ?? '', ENT_QUOTES),
// Acciones
"<a href=\"/IMPORTADORES/proveedores/editar?clave=" . rawurlencode($clave) . "\" class=\"btn btn-sm btn-primary\">✏️</a>
<button class=\"btn btn-sm btn-danger\" onclick=\"confirmDelete('{$clave}')\">🗑️</button>"
];
}
} else {
error_log('[ajax_lista] Respuesta inválida o status != 200');
$dataList[] = [
$clave,
htmlspecialchars($p['Nombre'] ?? '', ENT_QUOTES),
htmlspecialchars($p['RFC'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Ciudad'] ?? '', ENT_QUOTES),
htmlspecialchars($p['Telefono'] ?? '', ENT_QUOTES),
htmlspecialchars($direccion, ENT_QUOTES),
"<a href=\"/IMPORTADORES/proveedores/editar?clave=" . rawurlencode($clave) . "\" class=\"btn btn-sm btn-primary\">✏️</a>
<button class=\"btn btn-sm btn-danger\" onclick=\"confirmDelete('{$clave}')\">🗑️</button>"
];
}
// 6) Devolvemos siempre HTTP 200 con data (posiblemente vacío)
@@ -161,20 +182,24 @@ function eliminar()
exit;
}
// CORRECCIÓN: Usar la misma URL base y corregir el Authorization header
$url = rtrim($_ENV['API_URL'] ?? '', '/') . '/api/proveedores/' . urlencode($clave);
error_log("[eliminar] DELETE $url");
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_HTTPHEADER => ["Authorization: $token",'Accept: application/json'],
// CORRECCIÓN: Quitar el espacio extra y agregar Bearer
CURLOPT_HTTPHEADER => ["Authorization: Bearer $token", 'Accept: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
curl_exec($ch);
$resp = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
error_log("[eliminar] HTTP $status: $resp");
header('Location: /IMPORTADORES/proveedores?deleted=' . ($status===200||$status===204 ? 'ok':'error'));
exit;
}
@@ -203,16 +228,16 @@ function guardar()
// 2) Recoger datos del formulario
$payload = [
'Clave' => trim($_POST['Clave'] ?? ''),
'Nombre' => trim($_POST['Nombre'] ?? ''),
'RFC' => trim($_POST['RFC'] ?? ''),
'Ciudad' => trim($_POST['Ciudad'] ?? ''),
'Telefono' => trim($_POST['Telefono'] ?? ''),
'Pais' => trim($_POST['Pais'] ?? ''),
'Colonia' => trim($_POST['Colonia'] ?? ''),
'Municipio' => trim($_POST['Municipio'] ?? ''),
'CodigoPostal' => trim($_POST['CodigoPostal'] ?? ''),
'EntidadFederativa' => trim($_POST['EntidadFederativa'] ?? ''),
'Clave' => trim($_POST['Clave'] ?? ''),
'Nombre' => trim($_POST['Nombre'] ?? ''),
'RFC' => trim($_POST['RFC'] ?? ''),
'Ciudad' => trim($_POST['Ciudad'] ?? ''),
'Telefono' => trim($_POST['Telefono'] ?? ''),
'Pais' => trim($_POST['Pais'] ?? ''),
'Colonia' => trim($_POST['Colonia'] ?? ''),
'Municipio' => trim($_POST['Municipio'] ?? ''),
'CodigoPostal' => trim($_POST['CodigoPostal'] ?? ''),
'EntidadFederativa' => trim($_POST['EntidadFederativa'] ?? ''),
];
// 3) Validar campos obligatorios
@@ -232,7 +257,7 @@ function guardar()
// 5) Llamada a la API para crear el proveedor
$url = rtrim($_ENV['API_URL'] ?? '', '/') . '/api/proveedores';
$ch = curl_init($url);
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [