ndividual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 558.0382370003499 ms 2025-04-30 11:51:33.067 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:51:33.071 [info] [streamChoices] request done: headerRequestId: [3382164f-5c83-4df9-be8e-6fb7316aba2f] model deployment ID: [] 2025-04-30 11:51:33.187 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 249.0792660000734 ms 2025-04-30 11:51:33.189 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:51:33.191 [info] [streamChoices] request done: headerRequestId: [fb5ecdd3-7d9b-4020-b263-5f1d06344792] model deployment ID: [] 2025-04-30 11:51:48.119 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 282.05312400031835 ms 2025-04-30 11:51:48.120 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:51:48.122 [info] [streamChoices] request done: headerRequestId: [657364a5-c7fa-4ee2-a71a-73d6022f6789] model deployment ID: [] 2025-04-30 11:53:06.842 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 379.8533350001089 ms 2025-04-30 11:53:06.843 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:06.846 [info] [streamChoices] request done: headerRequestId: [0b208618-32ab-4518-ae5f-925bbb86c596] model deployment ID: [] 2025-04-30 11:53:07.079 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 241.629995000083 ms 2025-04-30 11:53:07.082 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:07.084 [info] [streamChoices] request done: headerRequestId: [3225a84c-8da0-4513-becb-d97169ac1a3d] model deployment ID: [] 2025-04-30 11:53:08.986 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 321.58495400007814 ms 2025-04-30 11:53:08.989 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:08.990 [info] [streamChoices] request done: headerRequestId: [198ea876-9582-47cb-9b75-2417f751c250] model deployment ID: [] 2025-04-30 11:53:15.097 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 276.44553299993277 ms 2025-04-30 11:53:15.100 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:15.101 [info] [streamChoices] request done: headerRequestId: [816ac38a-1788-4f9a-93c2-0edb59ce3175] model deployment ID: [] 2025-04-30 11:53:21.926 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 777.19458999997 ms 2025-04-30 11:53:21.928 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:21.930 [info] [streamChoices] request done: headerRequestId: [15280f19-83bf-4ba9-8188-b3345c85fcd3] model deployment ID: [] 2025-04-30 11:53:21.965 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 391.32707999972627 ms 2025-04-30 11:53:21.967 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:21.968 [info] [streamChoices] request done: headerRequestId: [7639fb1c-1627-49cc-bdfc-93389fdfa7f4] model deployment ID: [] 2025-04-30 11:53:22.114 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 270.2463870001957 ms 2025-04-30 11:53:22.116 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:22.117 [info] [streamChoices] request done: headerRequestId: [9f08e104-88bd-47ed-ac73-92250eb71232] model deployment ID: [] 2025-04-30 11:53:23.122 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 216.25599499978125 ms 2025-04-30 11:53:23.124 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:53:23.124 [info] [streamChoices] request done: headerRequestId: [ea023eb9-7d4e-4e7c-b21c-97ccaefa0a11] model deployment ID: [] 2025-04-30 11:54:17.522 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 641.3438859996386 ms 2025-04-30 11:54:17.525 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:17.527 [info] [streamChoices] request done: headerRequestId: [ab16868d-e0c9-4d60-94f2-25d725bd2ab2] model deployment ID: [] 2025-04-30 11:54:18.074 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 888.2056080000475 ms 2025-04-30 11:54:18.076 [info] [streamChoices] request done: headerRequestId: [a86f5081-6000-4b69-bf9b-11771523ae5d] model deployment ID: [] 2025-04-30 11:54:18.992 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 936.362935999874 ms 2025-04-30 11:54:18.996 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:19.000 [info] [streamChoices] request done: headerRequestId: [0db52441-1fc4-4ddd-b8b7-4585eb87711c] model deployment ID: [] 2025-04-30 11:54:20.608 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 1453.6099310000427 ms 2025-04-30 11:54:20.772 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:20.774 [info] [streamChoices] request done: headerRequestId: [136d30a8-f156-4854-b7a5-dfbc8cb7028c] model deployment ID: [] 2025-04-30 11:54:27.271 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 685.1476690000854 ms 2025-04-30 11:54:27.275 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:27.278 [info] [streamChoices] request done: headerRequestId: [f2ee80f6-7cc9-4b81-9632-9a193dae83aa] model deployment ID: [] 2025-04-30 11:54:28.741 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 982.3993829996325 ms 2025-04-30 11:54:28.743 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:28.746 [info] [streamChoices] request done: headerRequestId: [2646d355-ac4d-459e-ba80-5f986fd914a1] model deployment ID: [] 2025-04-30 11:54:29.948 [info] [ghostText] Filtered out solution matching next line 2025-04-30 11:54:29.949 [info] [ghostText] Filtered out solution matching next line 2025-04-30 11:54:30.264 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 313.4441499998793 ms 2025-04-30 11:54:30.266 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:30.270 [info] [streamChoices] request done: headerRequestId: [77201a41-1165-4e36-a446-2df952306709] model deployment ID: [] 2025-04-30 11:54:45.274 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 575.5839370000176 ms 2025-04-30 11:54:45.276 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:45.280 [info] [streamChoices] request done: headerRequestId: [7db77a4e-e9fa-4726-9d5a-c9213fac86d0] model deployment ID: [] 2025-04-30 11:54:52.323 [info] [fetchCompletions] request.response: [https://proxy.individual.githubcopilot.com/v1/engines/gpt-4o-copilot/completions] took 607.6204950003885 ms 2025-04-30 11:54:52.325 [info] [streamChoices] solution 0 returned. finish reason: [stop] 2025-04-30 11:54:52.327 [info] [streamChoices] request done: headerRequestId: [57ac3b91-0697-4616-bfa4-8cbbbe12c321] model deployment ID: [] 2025-04-30 11:54:53.424 [info] [fetc "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); 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.'-01%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("PLZ:Polizas"); $root = $xml->appendChild($root); #== Se crea e inserta el primer nodo donde se declaran los namespaces ====== cargaAttNodo( $root, array("xsi:schemaLocation"=>"http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/PolizasPeriodo/PolizasPeriodo_1_3.xsd", "xmlns:PLZ"=>"http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/PolizasPeriodo", "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; $array = array_reverse($responseData['data']); foreach ($array 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']; $UUID = $item['UUID']; $rfc = $item['RFC'];, $monto = $item['Monto Total']; // Cuando detectas una nueva transacción (nueva póliza) if($transaccion != $polizaControl){ // Crear una nueva póliza $polizaControl = $transaccion; $Poliza = $xml->createElement("PLZ: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("PLZ:Transaccion"); $nodo = $Poliza->appendChild($transaccion); cargaAttNodo($nodo, array( "NumCta" => $numCta, "DesCta" => $nombre, "Concepto" => $concepto, "Debe" => $debe, "Haber" => $haber )); // Crear nodo PLZ:CompNal y agregarlo dentro del nodo Transaccion si existe alguno de estos valores, de lo contrario no se agrega if($uuid != "" || $rfc != "" || $monto != ""){ $compNal = $xml->createElement("PLZ:CompNal"); $compNal = $nodo->appendChild($compNal); cargaAttNodo($compNal, array( "UUID_CFDI" => $uuid, "RFC" => $rfc, "MontoTotal" => $monto )); } // 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; }