er":"vbenavides@arochilindner.com"} [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:04) - Tokens generados: 1000.ee0fdd5fd1969c34fbfec0fc0b4c52e7.3acf7b75fdecc7848776888faa6c0764 [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:04) - Intento 0 el registro no contiene foto asociada [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:04) - ERROR al obtener imagen, intento: 1 , respuesta: null [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:06) - Intento 1 el registro no contiene foto asociada [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:06) - ERROR al obtener imagen, intento: 2 , respuesta: null [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:09) - Intento 2 el registro no contiene foto asociada [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:09) - ERROR al obtener imagen, intento: 3 , respuesta: null [5252a870-0f57-4c6e-84c1-556d49313d21](2025-06-03 11:45:11) - No se pudo encontrar una imagen asociada a registro de CRM \n [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:25) - Proceso de subida de imagen iniciado, data: {"source":"webhook","RefAL":"MAR-130161","MarcaId":"4597192000262261484","user":"bmeza@arochilindner.com"} [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:32) - Tokens generados: 1000.ee0fdd5fd1969c34fbfec0fc0b4c52e7.3acf7b75fdecc7848776888faa6c0764 [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:32) - Intento 0 el registro no contiene foto asociada [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:32) - ERROR al obtener imagen, intento: 1 , respuesta: null [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:35) - Intento 1 el registro no contiene foto asociada [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:35) - ERROR al obtener imagen, intento: 2 , respuesta: null [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:37) - Intento 2 el registro no contiene foto asociada [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:37) - ERROR al obtener imagen, intento: 3 , respuesta: null [6c98a963-3967-46ab-9770-b2b15c0357e0](2025-06-03 12:27:39) - No se pudo encontrar una imagen asociada a registro de CRM \n [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:28:57) - Proceso de subida de imagen iniciado, data: {"source":"webhook","RefAL":"MAR-130161","MarcaId":"4597192000262261484","user":"bmeza@arochilindner.com"} [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:29:04) - Tokens generados: 1000.ee0fdd5fd1969c34fbfec0fc0b4c52e7.3acf7b75fdecc7848776888faa6c0764 [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:29:05) - Intento 0 para obtener imagen de marca de CRM, respuesta: 200 [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:29:05) - Imagen guardada localmente de manera exitosa [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:29:06) - Intento 0 para actualizar CRM con datos de url de marca: { "data": [ { "code": "SUCCESS", "details": { "Modified_Time": "2025-06-03T13:29:06-04:00", "Modified_By": { "name": "Aptus Legal Administrator", "id": "4597192000000287001" }, "Created_Time": "2025-06-03T13:27:24-04:00", "id": "4597192000262261484", "Created_By": { "name": "Bryan Meza Guzm\u00e1n", "id": "4597192000239638001" } }, "message": "record updated", "status": "success" } ] } [1ae5bbe9-6b36-4735-9dd3-277478b5aa28](2025-06-03 12:29:06) - Proceso finalizado exitosamente, URL: https://aptuslegal.app/imagenesAptusLegal/arochi/LogosArochi/MAR-130161.png [332bdb92-3be0-434b-be4c-0038bafff540](2025-06-03 12:33:24) - Proceso de subida de imagen iniciado, data: {"source":"webhook","RefAL":"MAR-130162","MarcaId":"4597192000262261563","user":"bmeza@arochilindner.com"} [332bdb92-3be0-434b-be4c-0038bafff540](2025-06-03 12:33:31) - Tokens generados: 1000.ee0fdd5fd1969c34fbfec0fc0b4c52e7.3acf7b75fdecc7848776888faa6c0764 [332bdb92-3be0-434b- function formatMoney(string $amount): string { $clean = preg_replace('/[^0-9.]/', '', $amount); return '$ ' . number_format((float)$clean, 2, '.', ','); } # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # MODAL PARA MOSTRAR ERRORES # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ --> function showMessage(string $title, string $message): void { // Generar el HTML del modal echo << HTML; } # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # OBTENGO EL TOKEN DE BOOKS # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ function GetToken(){ $sOrganiZB = ""; if (isset($_REQUEST['pOrganiZB'])) { $sOrganiZB = $_REQUEST['pOrganiZB']; } else { echo 'Por favor introduzca el ID de la Organización de Zoho Books.'; return; } #---------------------------------------------------------------- # Creamos la conexión a la base de datos #---------------------------------------------------------------- $conn = mysqli_connect("127.0.0.1", "aptuslegal", "#Aptus2021#", "vendorbills"); if (!$conn) { echo "Error: No se pudo conectar a MySQL." . PHP_EOL; echo "errno de depuración: " . mysqli_connect_errno() . PHP_EOL; exit; } #---------------------------------------------------------------- # Traemos los valores de conexión utilizando el organizationId #---------------------------------------------------------------- $sql = 'SELECT * FROM conndetails WHERE organization_id = "' . $sOrganiZB.'"'; if($result = $conn->query($sql)) { $row = $result->fetch_assoc(); } else exit('No se ejecuto la consulta'); #---------------------------------------------------------------- # RFC de la Organización #---------------------------------------------------------------- $regFeCa = $row['rfc']; #---------------------------------------------------------------- # Variables para Zoho Books #---------------------------------------------------------------- $appOwner = $row['appOwner']; $boa_RefreshToken = $row['zbooks_rtoken']; $boa_ClientId = $row['zbooksclient_id']; $boa_ClientSecret = $row['zbooksclient_secret']; $boa_RedirectUri = $row['RedirectUri']; $boa_AuthUrl = 'https://accounts.zoho.com/oauth/v2/token'; $boa_GrantType = "refresh_token"; #---------------------------------------------------------------- # Cerramos la conexión #---------------------------------------------------------------- mysqli_close($conn); #---------------------------------------------------------------- # Obtengo el Token de Books #---------------------------------------------------------------- return oauth($appOwner, 'ZBooks', $boa_RefreshToken, $boa_ClientId, $boa_ClientSecret, $boa_RedirectUri, $boa_GrantType, $boa_AuthUrl); } # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # USUARIO ACTIVO # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ function getUser($zbToken){ if (isset($_REQUEST['pOrganiZB'])) { $sOrganiZB = $_REQUEST['pOrganiZB']; } else { echo "Es necesario introducir el ID de la organización en Zoho Books"; } $request_url = "https://www.zohoapis.com/books/v3/users/me?organization_id=".$sOrganiZB; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $request_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Zoho-oauthtoken ' . $zbToken)); $r = curl_exec($ch); $array = json_decode($r); $user = $array->user; curl_close ($ch); //var_dump($array->user); echo ''; echo "

Usuario activo: " . $user->name."

"; echo "

Rol activo: " . $user->user_role."

"; echo "

eMail: ".$user->email."

"; echo "

Estatus: " . $user->status."

"; } # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ # BALANZA DE COMPROBACIÓN # ------------------------------------------------------------------------------------------------------------------------------------------------------------------ function getBalCom($zbToken){ $sOrganiZB = ""; if (isset($_REQUEST['pOrganiZB'])) { $sOrganiZB = $_REQUEST['pOrganiZB']; } $sAnioCat = $_POST['anio']; $sMesCat = $_POST['mes']; $sTipoEnv = $_POST['tipo']; $file_name = basename($_FILES["fileToUpload"]["name"]); $file_name = str_replace(' ', '_', $file_name); $temp_file = $_FILES["fileToUpload"]["tmp_name"]; $target_dir = "archs_csv/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $target_file = str_replace(' ', '_', $target_file); $uploadOk = 1; $imageFileType = strtolower(pathinfo($target_file,PATHINFO_EXTENSION)); if(empty($_POST['anio'])) { echo 'Por favor introduzca el Año para el proceso.'; } else if(empty($_POST['mes'])) { echo 'Por favor introduzca el Mes para el proceso.'; } else if(empty($_POST['tipo'])) { echo 'Por favor introduzca el Tipo para el proceso.'; } else if(empty($file_name)) { showMessage($title = 'Información faltante', $message = 'Por favor seleccione el archivo a procesar.'); return; } else if($sOrganiZB == "") { showMessage($title = 'Información erronea', $message = 'Por favor introduzca el ID de la Organización de Zoho Books.'); return; } else { // Check if file already exists if (file_exists($target_file)) { # showMessage($title = 'Información', $message = 'Se eliminó un archivo pre-existente con el mismo nombre.'); } // Allow certain file formats if($imageFileType != "csv" ) { showMessage($title = 'Información erronea', $message = 'El archivos debe contener el libro mayor y ser tipo CSV.'); return; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { ?>message . '
'; if (curl_errno($ch)) { $error_msg = curl_error($ch); } curl_close ($ch); if (isset($error_msg)) { $j_array = array('code' => $JsonResponse->code, 'message' => "Error al procesar la balanza: " . $JsonResponse->message); $Resultado = json_encode($j_array); echo $Resultado; return; } else { /********************************************************************/ // LINKS DE DESCARGA /********************************************************************/ $linkXML = ''.$JsonResponse->data->xmlFileName.''; $linkCSV = ''.$JsonResponse->data->csvFileName.''; $linkZIP = ''.$JsonResponse->data->zipFileName.''; /********************************************************************/ // MODAL /********************************************************************/ ?> true, CURLOPT_FOLLOWLOCATION => true, // GET es el método por defecto, no es necesario CURLOPT_POST = false ]); $r = curl_exec($ch); if (curl_errno($ch)) { $error_msg = curl_error($ch); curl_close($ch); echo json_encode(['code'=>'666','message'=>"Error en la llamada curl: $error_msg"]); return; } curl_close($ch); // 4. Parsear JSON de respuesta $resp = json_decode($r, true); if (!$resp || !isset($resp['code'])) { echo 'Respuesta inválida del servicio.'; return; } if ($resp['code'] !== '200') { // Mostrar el mensaje de error que regresa el servicio echo 'Error al generar Auxiliar: ' . ($resp['message'] ?? 'Desconocido'); return; } // 5. Construir enlaces de descarga con los nombres reales $XML_Path = 'https://aptuslegal.app/aptusContaElec/archs_xml/'; $ZIP_Path = 'https://aptuslegal.app/aptusContaElec/archs_zip/'; $xmlFileName = $resp['xml_file']; // viene, por ejemplo, "RFC202504AC.xml" $zipFileName = $resp['zip_file']; // viene, p.ej., "RFC202504AC.zip" $fileXmlUrl = sprintf( '%s', $XML_Path, $xmlFileName, $xmlFileName, 'Auxiliar de Cuentas XML' ); $fileZipUrl = sprintf( '%s', $ZIP_Path, $zipFileName, $zipFileName, 'Auxiliar de Cuentas ZIP' ); // 6. Renderizar tu modal con los enlaces ?> '666', 'message' => "Error en la llamada curl: " . $error_msg ]; echo json_encode($j_array); return; } // Decodificar la respuesta JSON del servicio $data = json_decode($r, true); if ($data === null) { echo 'La respuesta del servicio no es un JSON válido.'; return; } // Verificar que el servicio haya devuelto código 200 if (!isset($data['code']) || $data['code'] !== '200') { // Si devuelve mensaje de error, mostrarlo $msg = $data['message'] ?? 'Error desconocido al generar folios.'; echo '
Error: ' . htmlspecialchars($msg) . '
'; return; } // === Preparar rutas base para descarga de archivos === // Ajusta estas rutas si tu servidor usa otra carpeta pública $baseURL_XML = 'https://aptuslegal.app/aptusContaElec/archs_xml/'; $baseURL_ZIP = 'https://aptuslegal.app/aptusContaElec/archs_zip/'; $baseURL_CSV = 'https://aptuslegal.app/aptusContaElec/archs_csv/'; // === Extraer nombres de archivo del JSON de respuesta === // wsFoliosFiscales.php debe devolver al menos: xml_file_name, zip_file_name y Total de Folios. $xmlName = $data['xml_file_name'] ?? ''; $zipName = $data['zip_file_name'] ?? ''; $csvName = $data['csv_file_name'] ?? ''; // Si wsFoliosFiscales ya genera CSV; si no existe, este valor quedará vacío. $totalFolios = $data['Total de Folios'] ?? $data['total_folios'] ?? 0; // Validar que existan los nombres de archivo esperados if ($xmlName === '' || $zipName === '') { echo '
No se recibió el nombre de los archivos XML o ZIP.
'; return; } // Construir enlaces de descarga $xmlURL = $baseURL_XML . urlencode($xmlName); $zipURL = $baseURL_ZIP . urlencode($zipName); // Si no hay CSV devuelto, asumimos el mismo nombre que el XML pero con extensión .csv if ($csvName === '') { // Reemplazamos la extensión .xml por .csv $csvName = preg_replace('/\.xml$/i', '.csv', $xmlName); } $csvURL = $baseURL_CSV . urlencode($csvName); // Etiquetas “download” extraen sólo el basename para el atributo download $xmlBasename = basename($xmlName); $zipBasename = basename($zipName); $csvBasename = basename($csvName); $fileXmlLink = 'Auxiliar de folios XML
'; $fileZipLink = 'Auxiliar de folios ZIP
'; $fileCsvLink = 'Auxiliar de folios CSV
'; // === Mostrar Modal con resultados === ?> message; if (curl_errno($ch)) { $error_msg = curl_error($ch); } curl_close ($ch); if (isset($error_msg)) { $j_array = array('code' => '500', 'message' => "Error en la llamada curl: " . $error_msg); $Resultado = json_encode($j_array); //echo $Resultado; return; } else { /********************************************************************/ // LINKS DE DESCARGA /********************************************************************/ $linkXML = ''.$JsonResponse->data->xmlFileName.''; $linkZIP = ''.$JsonResponse->data->zipFileName.''; /********************************************************************/ // MODAL /********************************************************************/ ?> ', $errors); return; } $queryParams = http_build_query([ 'Anio' => $anio, 'Mes' => $mes, 'pOrganiZB' => $organiZB, 'pOrganiAnalytics' => '722699151', 'RFC' => 'AML9605085V8', 'workspace' => '2296733000000004013', 'view' => '2296733000030848002', 'appOwner' => 'arochiylindner.aptus', 'txbNumeroOrden' => $txbNumeroOrden, 'TipoSolicitud' => $TipoSolicitud ]); $url = "https://aptuslegal.app/aptusContaElec/wsPolizasAnalytics.php?$queryParams"; echo implode('
', $url); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'GET', )); $response = curl_exec($curl); curl_close($curl); // Decodificar la respuesta del servicio $data = json_decode($response, true); if (!$data || $data['code'] !== "200") { echo "Ocurrió un error al generar las pólizas: " . ($data['message'] ?? 'Respuesta inválida del servicio.'); return; } $xmlFileName = $data['xml_file_name']; $zipFileName = $data['zip_file_name']; $csvFileName = $data['csv_file_name'] ?? null; $XML_file = "https://aptuslegal.app/aptusContaElec/archs_xml/$xmlFileName"; $ZIP_file = "https://aptuslegal.app/aptusContaElec/archs_zip/$zipFileName"; $CSV_file = "https://aptuslegal.app/aptusContaElec/archs_csv/$csvFileName"; // Output con HTML ?>