1. {main}() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:0 [Fri Apr 11 09:15:45.593694 2025] [php7:notice] [pid 1819430] [client 3.22.251.217:41146] PHP 2. oauth() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:442 [Fri Apr 11 09:15:45.593697 2025] [php7:notice] [pid 1819430] [client 3.22.251.217:41146] PHP 3. get_access_token() /var/www/html/aptusContaElec/oauth.php:68 [Fri Apr 11 09:15:45.606917 2025] [php7:notice] [pid 1819430] [client 3.22.251.217:41146] PHP Notice: Undefined variable: wdrv_parent_id in /var/www/html/aptusContaElec/wsPolizasAnalytics.php on line 444 [Fri Apr 11 09:15:45.606935 2025] [php7:notice] [pid 1819430] [client 3.22.251.217:41146] PHP Stack trace: [Fri Apr 11 09:15:45.606942 2025] [php7:notice] [pid 1819430] [client 3.22.251.217:41146] PHP 1. {main}() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:0 [Fri Apr 11 09:15:46.648352 2025] [php7:notice] [pid 1817403] [client 187.189.163.145:30967] PHP Notice: Undefined variable: zbToken in /var/www/html/aptusContaElec/indexContabilidadElectronica.php on line 170, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:15:46.648382 2025] [php7:notice] [pid 1817403] [client 187.189.163.145:30967] PHP Stack trace:, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:15:46.648388 2025] [php7:notice] [pid 1817403] [client 187.189.163.145:30967] PHP 1. {main}() /var/www/html/aptusContaElec/indexContabilidadElectronica.php:0, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:15:58.129799 2025] [php7:notice] [pid 1817164] [client 187.189.163.145:30977] PHP Notice: Undefined variable: zbToken in /var/www/html/aptusContaElec/indexContabilidadElectronica.php on line 170, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:15:58.129835 2025] [php7:notice] [pid 1817164] [client 187.189.163.145:30977] PHP Stack trace:, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:15:58.129843 2025] [php7:notice] [pid 1817164] [client 187.189.163.145:30977] PHP 1. {main}() /var/www/html/aptusContaElec/indexContabilidadElectronica.php:0, referer: https://aptuslegal.app/aptusContaElec/indexContabilidadElectronica.php?pOrganiZB=722371903 [Fri Apr 11 09:16:09.127587 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Notice: Undefined variable: woa_RefreshToken in /var/www/html/aptusContaElec/wsPolizasAnalytics.php on line 442 [Fri Apr 11 09:16:09.127603 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Stack trace: [Fri Apr 11 09:16:09.127608 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP 1. {main}() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:0 [Fri Apr 11 09:16:09.127613 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Notice: Undefined variable: woa_ClientId in /var/www/html/aptusContaElec/wsPolizasAnalytics.php on line 442 [Fri Apr 11 09:16:09.127616 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Stack trace: [Fri Apr 11 09:16:09.127619 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP 1. {main}() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:0 [Fri Apr 11 09:16:09.127623 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Notice: Undefined variable: woa_ClientSecret in /var/www/html/aptusContaElec/wsPolizasAnalytics.php on line 442 [Fri Apr 11 09:16:09.127625 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Stack trace: [Fri Apr 11 09:16:09.127628 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP 1. {main}() /var/www/html/aptusContaElec/wsPolizasAnalytics.php:0 [Fri Apr 11 09:16:09.127632 2025] [php7:notice] [pid 1817162] [client 3.22.251.217:52678] PHP Notice: Undefined variable: woa_RedirectUri in /var/www/html/aptusContaElec/wsPolizasAnalytics.php on line 442 [F "301", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el appOwner"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($anio == "") { $j_array = array('code' => "302", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Anio de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($mes == "") { $j_array = array('code' => "303", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Mes de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($organi_id_Analytics == "") { $j_array = array('code' => "304", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Organization ID de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($RFC == "") { $j_array = array('code' => "305", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el RFC"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($idWorkspace == "") { $j_array = array('code' => "306", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el ID del workspace"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($idView == "") { $j_array = array('code' => "307", "message" => "ERROR - [wsPolizasAnalytics] Parametros incompletos para el Servicio Web, faltan el Organization ID de la vista"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } $dirBase = realpath("../"); ### DEFINICIÓN DE CONSTANTES ################################################### $SendaPEM = "archs_pem/"; $SendaXML = "archs_xml/"; $SendaZIP = "archs_zip/"; #---------------------------------------------------------------- #== Llamado para generar el token para donatello #---------------------------------------------------------------- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://donatello.aptuslegal.app/oauth/token/'.$organi_id_Analytics, 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', CURLOPT_HTTPHEADER => array( 'Authorization: Token e68d5a079f937ea29ad2ec5a5b105b75491a0e0c' ), )); $response = curl_exec($curl); curl_close($curl); // Decodificamos la respuesta JSON $data = json_decode($response, true); // Accedemos al valor de 'access_token de donatello' $access_token = $data['access_token']; #---------------------------------------------------------------- #== Hacemos el llamado para generar la obtención de los datos en la operación Bulk y obtenemos el Job ID. #---------------------------------------------------------------- $curl = curl_init(); // $dia = obtenerDiasDelMes($mes); $anio = "2025"; $mes = "04"; $dia = "09"; if($dia == "Formato de mes inválido."){ $j_array = array('code' => "309", "message" => "ERROR - [wsPolizasAnalytics] El formato del parámetro del mes no es valido"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } curl_setopt_array($curl, array( CURLOPT_URL => 'https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/'.$idWorkspace.'/views/'.$idView.'/data?CONFIG=%7B%22criteria%22%3A%22%5C%22Fecha%20de%20transaccion%5C%22%20between%20%27'.$anio.'-'.$mes.'-09%27%20and%20%27'.$anio.'-'.$mes.'-'.$dia.'%27%22%2C%20%22responseFormat%22%3A%22json%22%7D', 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', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token, 'Content-Type: application/json' ), )); $response = curl_exec($curl); curl_close($curl); $responseData = json_decode($response, true); ob_start(); echo '
'; print_r($responseData); echo ''; $debug_output = ob_get_clean(); // Acceder al 'jobId' $jobId = $responseData['data']['jobId']; #---------------------------------------------------------------- #== Obtenemos el status del JobId para saber si se puede descargar la respuesta #---------------------------------------------------------------- $jobStatus = "JOB IN PROGRESS"; while ($jobStatus === "JOB IN PROGRESS") { $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => 'https://analyticsapi.zoho.com/restapi/v2/bulk/workspaces/'.$idWorkspace.'/exportjobs/'.$jobId, 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', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token ), )); $response = curl_exec($curl); // Decodificar la respuesta JSON $responseData = json_decode($response, true); // Verificar el status del trabajo if (isset($responseData['data']['jobStatus'])) { $jobStatus = $responseData['data']['jobStatus']; } else { // Si no se encuentra jobStatus en la respuesta, salir del ciclo $j_array = array('code' => "311", "message" => "ERROR - [wsPolizasAnalytics] Error al esperar el Status de JobId de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } // Esperar 5 segundos antes de volver a consultar sleep(5); } //Si se obtiene un status diferente al esperado lo interpreta como error if($jobStatus != "JOB COMPLETED"){ $j_array = array('code' => "312", "message" => "ERROR - [wsPolizasAnalytics] Error el Status del JobId inesperado"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if (isset($responseData['data']['downloadUrl'])) { $downloadUrl = $responseData['data']['downloadUrl']; // echo "Download URL: " . $downloadUrl; } else { $j_array = array('code' => "313", "message" => "ERROR - [wsPolizasAnalytics] Error al obtener el downloadUrl de Analytics"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } #---------------------------------------------------------------- #== Llamado para la obtención de los datos en formato JSON de la vista de Analytics. #---------------------------------------------------------------- $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $downloadUrl, 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', CURLOPT_HTTPHEADER => array( 'ZANALYTICS-ORGID: '.$organi_id_Analytics, 'Authorization: Zoho-oauthtoken '.$access_token ), )); $response = curl_exec($curl); curl_close($curl); // Decodificar el JSON $responseData = json_decode($response, true); // Verificar si el campo 'data' existe if (isset($responseData['data'])) { #---------------------------------------------------------------- #== Creación de la variable de tipo DOM, aquí se conforma el XML a timbrar posteriormente. #---------------------------------------------------------------- $xml = new DOMdocument('1.0', 'UTF-8'); $root = $xml->createElement("Polizas"); $root = $xml->appendChild($root); #== Se crea e inserta el primer nodo donde se declaran los namespaces ====== cargaAttNodo( $root, array("xsi:schemaLocation"=>"www.sat.gob.mx/esquemas/ContabilidadE/1_1/PolizasPeriodo http://www.sat.gob.mx/esquemas/ContabilidadE/1_1/CatalogosParaEsqContE/CatalogosParaEsqContE.xsd", "xmlns:Polizas"=>"www.sat.gob.mx/esquemas/ContabilidadE/1_1/AuxiliarFolios", "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema") ); #== Rutina de integración de nodos ========================================= cargaAttNodo($root, array( "Version"=>"1.3", "RFC"=>$RFC, "Mes"=>$mes, "Anio"=>$anio ) ); $sumTotalDebe = 0; $sumTotalHaber = 0; $totalDebe = 0; $totalHaber = 0; $polizaControl = ""; $polizaNodo = null; // Variable para mantener la referencia al nodo Poliza $numeroTotalPolizas = 0; foreach ($responseData['data'] as $item) { // Asignar cada valor a variables $tipoPoliza = $item['Tipo Poliza']; $transaccion = $item['Transaccion']; $fechaTransaccion = str_replace('.', '-', $item['Fecha de transaccion']); $idCuenta = $item['ID de la cuenta']; $nombre = $item['Nombre']; $debe = $item['Debe']; $haber = $item['Haber']; $creditoDebitoTotal = $item['Credito-Debito - Total']; $debitoCreditoTotal = $item['Debito-Credito Total']; $concepto = $item['Concepto']; $numCta = $item['NumCta']; // Cuando detectas una nueva transacción (nueva póliza) if($transaccion != $polizaControl){ // Si ya hay una póliza en proceso, agregas el atributo MontoTotal a la póliza anterior if ($polizaNodo !== null) { $montoTotal = $totalDebe - $totalHaber; $polizaNodo->setAttribute("MontoTotal", number_format($montoTotal, 2, '.', '')); // Agregar MontoTotal } // Crear una nueva póliza $polizaControl = $transaccion; $Poliza = $xml->createElement("Poliza"); $polizaNodo = $root->appendChild($Poliza); cargaAttNodo($polizaNodo, array( "NumUnIdenPol" => $transaccion, "Fecha" => $fechaTransaccion, "Concepto" => $tipoPoliza )); // Reiniciar los totales para la nueva póliza $totalDebe = 0; $totalHaber = 0; } // Crear un nodo Transaccion y agregarlo a la póliza actual $transaccion = $xml->createElement("Transaccion"); $nodo = $Poliza->appendChild($transaccion); cargaAttNodo($nodo, array( "NumCta" => $numCta, "DesCta" => $nombre, "Concepto" => $concepto, "Debe" => $debe, "Haber" => $haber )); // Acumular los valores de Debe y Haber $totalDebe += (float)$debe; $totalHaber += (float)$haber; // Acumular los totales generales $sumTotalDebe += (float)$debe; $sumTotalHaber += (float)$haber; $numeroTotalPolizas += 1; } // Para la última póliza en el loop, también agregamos el MontoTotal if ($polizaNodo !== null) { $montoTotal = $totalDebe - $totalHaber; $polizaNodo->setAttribute("MontoTotal", number_format($montoTotal, 2, '.', '')); // Agregar MontoTotal al final } // Establecer el tipo de contenido a XML y devolver el contenido // header('Content-Type: application/xml; charset=utf-8'); // echo $xml->saveXML(); #=== Se guarda el archivo .XML del Catalogo de Cuentas ======================= $file_name_with_full_path = '/var/www/html/aptusContaElec/archs_xml/'.$RFC.$anio.$mes."PP.xml"; #=== Si existe el archivo XML se elimina para crear el nuevo ======================= if(!file_exists($file_name_with_full_path)){ unlink($file_name_with_full_path); } #=== Se guarda el archivo XML creado ======================= $polizaXML = $xml->saveXML(); $xml->formatOutput = true; $xml->save($file_name_with_full_path); unset($xml); #=== Se dan permisos de escritura al archivo .xml. ========================= chmod($file_name_with_full_path, 0777); #=== Se procede a crear el archivo ZIP del Catalogo de Cuentas ========================= $zip = new ZipArchive(); $nombreArchivoZip = '/var/www/html/aptusContaElec/archs_zip/'.$RFC.$anio.$mes."PP.zip"; $nameArchZip = $RFC.$anio.$mes."PP.zip"; #=== Si existe el archivo ZIP se elimina para crear el nuevo ======================= if(!file_exists($nombreArchivoZip)){ unlink($nombreArchivoZip); } if (!$zip->open($nombreArchivoZip, ZipArchive::CREATE | ZipArchive::OVERWRITE)) { exit("Error abriendo ZIP en $nombreArchivoZip"); } $nombre = basename($file_name_with_full_path); $zip->addFile($file_name_with_full_path, $nombre); $resultado = $zip->close(); if ($resultado) { } else { $j_array = array('code' => "318", "message" => "ERROR - [wsPolizasAnalytics] Error al crear el archivo ZIP"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } #---------------------------------------------------------------- # Se sube archivo ZIP a Workdrive #---------------------------------------------------------------- $woa_access_token = oauth($appOwner, 'ZWorkrdv', $woa_RefreshToken, $woa_ClientId, $woa_ClientSecret, $woa_RedirectUri, $woa_GrantType, $woa_AuthUrl); $urlWorkdrv = 'https://workdrive.zoho.com/api/v1/upload?parent_id='.$wdrv_parent_id.'&filename='.$nameArchZip.'&override-name-exist=true'; $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_URL => $urlWorkdrv, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => '', CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 0, CURLOPT_FOLLOWLOCATION => true, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POSTFIELDS => array('content'=> new CURLFILE($nombreArchivoZip)), CURLOPT_HTTPHEADER => array('Authorization: Zoho-oauthtoken '.$woa_access_token ), ) ); $response = curl_exec($curl); curl_close($curl); #=== FIN DEL PROCESO ======================= $j_array = array('code' => "200", 'message' => "Proceso de creacion de archivo de pólizas del periodo exitoso", 'xml_file_name' => $RFC.$anio.$mes."PP.xml", 'zip_file_name' => $RFC.$anio.$mes."PP.zip",'Total de Polizas' => $numeroTotalPolizas,'Total Debe' =>number_format($sumTotalDebe, 2, '.', ''),'Total Haber' => number_format($sumTotalHaber, 2, '.', '')); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } else { $j_array = array('code' => "315", "message" => "ERROR - [wsPolizasAnalytics] No se obtuvieron datos de la vista"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } ### FUNCIONES DEL MÓDULO ######################################################### # Función que integra los nodos al archivo .XML function cargaAttNodo(&$nodo, $attr){ global $xmldoc; foreach ($attr as $key => $val){ $val = preg_replace('/\s\s+/', ' ', $val); $val = trim($val); if (strlen($val)>0){ $val = utf8_encode(str_replace("|","/",$val)); $nodo->setAttribute($key,$val); } } } function obtenerDiasDelMes($mes) { // Validar que el parámetro sea una cadena con dos dígitos if (!preg_match('/^\d{2}$/', $mes)) { return "Formato de mes inválido."; } // Obtener el año actual $anio = date("Y"); // Usar la función `cal_days_in_month` para obtener la cantidad de días del mes $dias = cal_days_in_month(CAL_GREGORIAN, intval($mes), $anio); return $dias; }