diff --git a/app/controllers/solicitud_importacion.php b/app/controllers/solicitud_importacion.php index 15f65cc..7a45b8a 100644 --- a/app/controllers/solicitud_importacion.php +++ b/app/controllers/solicitud_importacion.php @@ -1,6 +1,70 @@ $user, 'password' => $pass]); + + error_log("[getApiToken] POST $url → $body"); + + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_HTTPHEADER => ['Content-Type: application/json'], + CURLOPT_POSTFIELDS => $body, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5, + ]); + $resp = curl_exec($ch); + $http = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + error_log("[getApiToken] HTTP $http → $resp"); + + if ($http === 200 && ($data = json_decode($resp, true)) && !empty($data['token'])) { + // 3) Guardamos token y tiempo actual + $_SESSION['api_token'] = $data['token']; + $_SESSION['api_token_time'] = time(); + return $data['token']; + } + + // 4) Si no se pudo obtener, devolvemos null + error_log('[getApiToken] No se pudo obtener token de la API'); + return null; +} + + /** * Listado de solicitudes de importación (facturas) del importador logueado @@ -76,6 +140,13 @@ function crear() { $stmtI = sqlsrv_query($conn, "SELECT INCOTERM,DESCESPANOL FROM dbo.gIncoterms ORDER BY INCOTERM"); while ($r = sqlsrv_fetch_array($stmtI, SQLSRV_FETCH_ASSOC)) { $incoterms[] = $r; } + $unidades_medida = []; + $stmtU = sqlsrv_query($conn, "SELECT id, descripcion FROM dbo.unidades_medida_apendice7 ORDER BY id"); + while ($r = sqlsrv_fetch_array($stmtU, SQLSRV_FETCH_ASSOC)) { + $unidades_medida[] = $r; + } + + include __DIR__ . '/../../views/solicitud_importacion/crear.php'; } @@ -115,11 +186,7 @@ function guardar() { } $conn = getConnection(); - $sql = "INSERT INTO dbo.solicitud_importacion_factura - (id_importador,aduana,anexo22_apendice,numero_factura,fecha_factura, - numero_pedimento,incoterm,pais_proveedor,tipo_moneda, - valor_factura,vinculacion,transportista_id,chofer_id,foto_solicitud_url,status) - VALUES(?,?,?,?,?,NULL,?,?,?,?,?,?,?,?,?)"; + $params=[ $id_importador, $aduana_seccion, @@ -135,27 +202,71 @@ function guardar() { (int)$chofer_id, $fotoUrl, $status - ]; - $stmt=sqlsrv_query($conn,$sql,$params); - if($stmt===false) die("Error en guardar():".print_r(sqlsrv_errors(),true)); + ]; - // Obtener nuevo ID - $idRow=sqlsrv_query($conn,'SELECT SCOPE_IDENTITY() AS id'); - $new=sqlsrv_fetch_array($idRow,SQLSRV_FETCH_ASSOC); - $id_solicitud=(int)$new['id']; +$sql = "INSERT INTO dbo.solicitud_importacion_factura + (id_importador, aduana, anexo22_apendice, numero_factura, fecha_factura, + numero_pedimento, incoterm, pais_proveedor, tipo_moneda, + valor_factura, vinculacion, transportista_id, chofer_id, foto_solicitud_url, status) + OUTPUT INSERTED.id_solicitud + VALUES (?, ?, ?, ?, ?, NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; - // Partidas - if(!empty($_POST['partidas'])&&is_array($_POST['partidas'])){ - $sqlP="INSERT INTO dbo.solicitud_importacion_partidas - (id_solicitud,descripcion,precio_unitario) - VALUES(?,?,?)"; - foreach($_POST['partidas'] as $p){ - $d=trim($p['descripcion']??''); - $u=floatval($p['precio_unitario']??0); - if($d!==''&&$u>0) sqlsrv_query($conn,$sqlP,[$id_solicitud,$d,$u]); +$stmt = sqlsrv_query($conn, $sql, $params, ['Scrollable' => SQLSRV_CURSOR_KEYSET]); +if ($stmt === false) { + die("❌ Error ejecutando INSERT con OUTPUT: " . print_r(sqlsrv_errors(), true)); +} + +$new = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); +if (!$new || empty($new['id_solicitud'])) { + die("❌ No se pudo recuperar el ID insertado de la factura."); +} + +$id_solicitud = (int)$new['id_solicitud']; + + + +// Partidas +if(!empty($_POST['partidas'])&&is_array($_POST['partidas'])){ + + $sqlP = "INSERT INTO dbo.solicitud_importacion_partidas + (id_solicitud, descripcion, cantidad_comercial, cantidad_tarifa, valor_factura, peso_bruto, unidad_comercial_id, tasa_preferencial) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + + $partidas_insertadas = 0; // ← contador + + foreach ($_POST['partidas'] as $i => $p) { + error_log("Partida $i: " . print_r($p, true)); + $params = [ + $id_solicitud, + trim($p['descripcion'] ?? ''), + + floatval($p['cantidad_comercial'] ?? 0), + floatval($p['cantidad_tarifa'] ?? 0), + floatval($p['valor_factura'] ?? 0), + floatval($p['peso_bruto'] ?? 0), + intval($p['unidad_comercial_id'] ?? 0) ?: null, + + trim($p['tasa_preferencial'] ?? '') + ]; + + if ($params[1] !== '' && $params[2] > 0) { + $stmtPartida = sqlsrv_query($conn, $sqlP, $params); + if ($stmtPartida === false) { + die("❌ Error insertando partida $i: " . print_r(sqlsrv_errors(), true)); + } else { + $partidas_insertadas++; + } } } + if ($partidas_insertadas === 0) { + ///header('Location: /IMPORTADORES/solicitud_importacion/crear?error_partidas=1'); + // exit; + + } +} + + header('Location: /IMPORTADORES/solicitud_importacion/lista?created=ok'); exit; } @@ -243,3 +354,110 @@ function eliminar() { header('Location: /IMPORTADORES/solicitud_importacion/lista?deleted=ok'); exit; } +/** + * GET /IMPORTADORES/solicitud_importacion/ajax_proveedores + * Devuelve JSON para poblar el select de Proveedor + */ +function ajax_proveedores() +{ + // 1) Asegura que la respuesta sea JSON + header('Content-Type: application/json; charset=utf-8'); + + // 2) Obtén o renueva tu token (usa tu función existente) + $token = getApiToken(); + if (!$token) { + echo json_encode(['results' => []]); + return; + } + + // 3) Llama al endpoint de la API de proveedores + $apiBase = rtrim($_ENV['API_URL'] ?? '', '/'); + $url = $apiBase . '/proveedores'; + + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_HTTPHEADER => ["Authorization: $token", 'Accept: application/json'], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5, + ]); + $resp = curl_exec($ch); + $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + // 4) Parsear y transformar al formato { results: [ {id,text}, … ] } + $out = ['results' => []]; + if ($status === 200 && ($json = json_decode($resp, true)) && is_array($json)) { + foreach ($json as $p) { + $out['results'][] = [ + 'id' => $p['Clave'] ?? '', + 'text' => $p['Nombre'] ?? '' + ]; + } + } + + // 5) Devolver JSON + echo json_encode($out); + exit; +} + + + + + +function ajax_lista() +{ + // 1) Fijamos el header JSON + header('Content-Type: application/json; charset=utf-8'); + + // 2) Obtener o renovar token + $token = getApiToken(); + if (!$token) { + error_log('[ajax_lista] Sin token válido'); + // Devolvemos estructura vacía + echo json_encode(['data' => []]); + return; + } + + // 3) Construimos la URL de la API + $apiBase = rtrim($_ENV['API_URL'] ?? '', '/'); + $url = $apiBase . '/proveedores'; + error_log("[ajax_lista] GET $url"); + + // 4) Ejecutamos cURL + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_HTTPHEADER => ["Authorization: $token", 'Accept: application/json'], + CURLOPT_RETURNTRANSFER => true, + CURLOPT_TIMEOUT => 5, + ]); + $resp = curl_exec($ch); + $status = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + error_log("[ajax_lista] HTTP $status → $resp"); + + // 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); + $dataList[] = [ + $clave, + htmlspecialchars($p['Nombre'] ?? '', ENT_QUOTES), + htmlspecialchars($p['RFC'] ?? '', ENT_QUOTES), + htmlspecialchars($p['Ciudad'] ?? '', ENT_QUOTES), + htmlspecialchars($p['Telefono']?? '', ENT_QUOTES), + // Acciones + "✏️ + " + ]; + } + } else { + error_log('[ajax_lista] Respuesta inválida o status != 200'); + } + + // 6) Devolvemos siempre HTTP 200 con data (posiblemente vacío) + echo json_encode(['data' => $dataList]); +} + + diff --git a/public/uploads/solicitud_682607050f254.jpg b/public/uploads/solicitud_682607050f254.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_682607050f254.jpg differ diff --git a/public/uploads/solicitud_682607fbdea70.JPG b/public/uploads/solicitud_682607fbdea70.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_682607fbdea70.JPG differ diff --git a/public/uploads/solicitud_682608ae85f77.jpg b/public/uploads/solicitud_682608ae85f77.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_682608ae85f77.jpg differ diff --git a/public/uploads/solicitud_68260955a3f7b.jpg b/public/uploads/solicitud_68260955a3f7b.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260955a3f7b.jpg differ diff --git a/public/uploads/solicitud_68260a67a7fd4.jpg b/public/uploads/solicitud_68260a67a7fd4.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260a67a7fd4.jpg differ diff --git a/public/uploads/solicitud_68260a7b905c2.jpg b/public/uploads/solicitud_68260a7b905c2.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260a7b905c2.jpg differ diff --git a/public/uploads/solicitud_68260ac172d75.jpg b/public/uploads/solicitud_68260ac172d75.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260ac172d75.jpg differ diff --git a/public/uploads/solicitud_68260aefd6a6b.jpg b/public/uploads/solicitud_68260aefd6a6b.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260aefd6a6b.jpg differ diff --git a/public/uploads/solicitud_68260b16ee0a6.jpg b/public/uploads/solicitud_68260b16ee0a6.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260b16ee0a6.jpg differ diff --git a/public/uploads/solicitud_68260b2f44292.jpg b/public/uploads/solicitud_68260b2f44292.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260b2f44292.jpg differ diff --git a/public/uploads/solicitud_68260b60d499f.jpg b/public/uploads/solicitud_68260b60d499f.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260b60d499f.jpg differ diff --git a/public/uploads/solicitud_68260b6866ad9.jpg b/public/uploads/solicitud_68260b6866ad9.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68260b6866ad9.jpg differ diff --git a/public/uploads/solicitud_68260baf2f4b2.JPG b/public/uploads/solicitud_68260baf2f4b2.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_68260baf2f4b2.JPG differ diff --git a/public/uploads/solicitud_68260c1ea84f6.JPG b/public/uploads/solicitud_68260c1ea84f6.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_68260c1ea84f6.JPG differ diff --git a/public/uploads/solicitud_68260c44c38af.JPG b/public/uploads/solicitud_68260c44c38af.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_68260c44c38af.JPG differ diff --git a/public/uploads/solicitud_68260fbd4b1e6.JPG b/public/uploads/solicitud_68260fbd4b1e6.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_68260fbd4b1e6.JPG differ diff --git a/public/uploads/solicitud_68260fdb457a6.JPG b/public/uploads/solicitud_68260fdb457a6.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_68260fdb457a6.JPG differ diff --git a/public/uploads/solicitud_6826249518e99.JPG b/public/uploads/solicitud_6826249518e99.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_6826249518e99.JPG differ diff --git a/public/uploads/solicitud_682624b518655.JPG b/public/uploads/solicitud_682624b518655.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_682624b518655.JPG differ diff --git a/public/uploads/solicitud_682625c0e0410.JPG b/public/uploads/solicitud_682625c0e0410.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_682625c0e0410.JPG differ diff --git a/public/uploads/solicitud_6826269a8efe0.JPG b/public/uploads/solicitud_6826269a8efe0.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_6826269a8efe0.JPG differ diff --git a/public/uploads/solicitud_682627a1f0f18.JPG b/public/uploads/solicitud_682627a1f0f18.JPG new file mode 100644 index 0000000..e4a6276 Binary files /dev/null and b/public/uploads/solicitud_682627a1f0f18.JPG differ diff --git a/public/uploads/solicitud_68263deebe4d9.jpg b/public/uploads/solicitud_68263deebe4d9.jpg new file mode 100644 index 0000000..54008b1 Binary files /dev/null and b/public/uploads/solicitud_68263deebe4d9.jpg differ diff --git a/public/uploads/solicitud_68263f38bc87e.png b/public/uploads/solicitud_68263f38bc87e.png new file mode 100644 index 0000000..3bf7515 Binary files /dev/null and b/public/uploads/solicitud_68263f38bc87e.png differ diff --git a/public/uploads/solicitud_6826405aebfcc.png b/public/uploads/solicitud_6826405aebfcc.png new file mode 100644 index 0000000..c16e299 Binary files /dev/null and b/public/uploads/solicitud_6826405aebfcc.png differ diff --git a/public/uploads/solicitud_682640ff866b3.png b/public/uploads/solicitud_682640ff866b3.png new file mode 100644 index 0000000..20d9121 Binary files /dev/null and b/public/uploads/solicitud_682640ff866b3.png differ diff --git a/public/uploads/solicitud_6826414b95919.png b/public/uploads/solicitud_6826414b95919.png new file mode 100644 index 0000000..20d9121 Binary files /dev/null and b/public/uploads/solicitud_6826414b95919.png differ diff --git a/public/uploads/solicitud_682642069dcf8.png b/public/uploads/solicitud_682642069dcf8.png new file mode 100644 index 0000000..fed9ad8 Binary files /dev/null and b/public/uploads/solicitud_682642069dcf8.png differ diff --git a/public/uploads/solicitud_682643cc087e9.png b/public/uploads/solicitud_682643cc087e9.png new file mode 100644 index 0000000..fed9ad8 Binary files /dev/null and b/public/uploads/solicitud_682643cc087e9.png differ diff --git a/public/uploads/solicitud_682644c1ecc4d.png b/public/uploads/solicitud_682644c1ecc4d.png new file mode 100644 index 0000000..4f1ef09 Binary files /dev/null and b/public/uploads/solicitud_682644c1ecc4d.png differ diff --git a/views/solicitud_importacion/crear.php b/views/solicitud_importacion/crear.php index 154fca0..2fae7d2 100644 --- a/views/solicitud_importacion/crear.php +++ b/views/solicitud_importacion/crear.php @@ -5,6 +5,7 @@ ➕ Nueva Solicitud de Importación + @@ -77,24 +53,32 @@

➕ Nueva Solicitud de Importación

-
+
-
+
-
+
-
+
+ + +
+
- - +
@@ -104,25 +88,27 @@
- - +
- - +
- 'Peso Mexicano','USD'=>'Dólar USD','EUR'=>'Euro','CNY'=>'Yuan','GBP'=>'Libra GBP','JPY'=>'Yen'] as $code=>$label): ?> @@ -134,11 +120,11 @@
- +
- @@ -150,19 +136,19 @@
- - +
- - +
@@ -177,12 +163,42 @@
📦 Partidas
- + + + + + + + + + + + + - + + + + + + + + @@ -202,21 +218,93 @@ + + + + + + + +
DescripciónPrecio Unitario
DescripciónCantidad ComercialCantidad de TarifaUnidad ComercialValor FacturaPeso BrutoTasa PreferencialPrecio UnitarioOMA (Factura)
+ + + +