QUEST['pOrganiZB']; } ## Validamos que se cumpla con los parámetros obligatorios if($anioCat == "") { $j_array = array('code' => "302", "message" => "ERROR - [wsCatalogoCuentas_v13] Parametros incompletos para el Servicio Web, faltan el Anio de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($mesCata == "") { $j_array = array('code' => "303", "message" => "ERROR - [wsCatalogoCuentas_v13] Parametros incompletos para el Servicio Web, faltan el Mes de vigencia"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } if($organi_id_ZB == "") { $j_array = array('code' => "304", "message" => "ERROR - [wsCatalogoCuentas_v13] Parametros incompletos para el Servicio Web, faltan el Organization ID de Books"); $Resultado = json_encode($j_array); echo $Resultado; return $Resultado; } $dirBase = realpath("../"); ### DEFINICIÓN DE CONSTANTES ################################################### $SendaPEM = "archs_pem/"; $SendaXML = "archs_xml/"; $SendaZIP = "archs_zip/"; #---------------------------------------------------------------- # 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 = ' . $organi_id_ZB; if($result = $conn->query($sql)) { $row = $result->fetch_assoc(); } else exit('No se ejecuto la consulta'); #---------------------------------------------------------------- # Cerramos la conexión #---------------------------------------------------------------- mysqli_close($conn); #---------------------------------------------------------------- # 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"; #---------------------------------------------------------------- # Variables para Zoho Workdrive #---------------------------------------------------------------- $wdrv_parent_id = $row['zworkdrvcatcue_id']; $woa_RefreshToken = $row['zworkdrv_rtoken']; $woa_ClientId = $row['zworkdrvclient_id']; $woa_ClientSecret = $row['zworkdrvclient_secret']; $woa_RedirectUri = $row['RedirectUri']; $woa_AuthUrl = 'https://accounts.zoho.com/oauth/v2/token'; $woa_GrantType = "refresh_token"; #---------------------------------------------------------------- # RFC de la Organización #---------------------------------------------------------------- $regFeCa = $row['rfc']; // echo "Variables: ".$appOwner.', ZBooks'.", ".$boa_RefreshToken.", ".$boa_ClientId." ".$boa_ClientSecret.", ".$boa_RedirectUri.", ".$boa_GrantType.", boa_AuthUrl: ".$boa_AuthUrl."
"; $boa_access_token = oauth($appOwner, 'ZBooks', $boa_RefreshToken, $boa_ClientId, $boa_ClientSecret, $boa_RedirectUri, $boa_GrantType, $boa_AuthUrl); $request_url = "https://www.zohoapis.com/books/v3/chartofaccounts?filter_by=AccountType.All&sort_column=account_name&organization_id=".$organi_id_ZB; $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 ' . $boa_access_token)); $r = curl_exec($ch); $array = json_decode($r); $bdCtasCont = $array->chartofaccounts; curl_close ($ch); #== 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("catalogocuentas:Catalogo"); $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/CatalogoCuentas http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/CatalogoCuentas/CatalogoCuentas_1_3.xsd", "xmlns:catalogocuentas"=>"http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/CatalogoCuentas", "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance" ) ); #== Rutina de integración de nodos ========================================= cargaAttNodo($root, array( "Version"=>"1.3", "RFC"=>$regFeCa, "Mes"=>$mesCata, "Anio"=>$anioCat ) ); $cantidadDeudoras = 0; $cantidadAcreedoras = 0; #== Ciclo "for", recopilación de datos del catalogo de cuentas e integración de sus respectivos nodos == for ($i=0; $i < count($bdCtasCont); $i++) { if($bdCtasCont[$i]->account_code != "" && $bdCtasCont[$i]->cf_c_digo_del_sat != "") { $cantidadCuentas +=1; $naturCta = "A"; if($bdCtasCont[$i]->cf_naturaleza == "Deudora") { $naturCta = "D"; $cantidadDeudoras +=1; } else{ $cantidadAcreedoras +=1; } $nivelCta = "1"; if($bdCtasCont[$i]->depth == "1") { $nivelCta = "2"; } $cuentas = $xml->createElement("catalogocuentas:Ctas"); $cuenta = $root->appendChild($cuentas); if($bdCtasCont[$i]->parent_account_name == "") { cargaAttNodo($cuenta, array( "CodAgrup"=>$bdCtasCont[$i]->cf_c_digo_del_sat, "NumCta"=>$bdCtasCont[$i]->account_code, "Desc"=>utf8_decode(substr($bdCtasCont[$i]->account_name, 11)), "Nivel"=>$nivelCta, "Natur"=>$naturCta ) ); } else { cargaAttNodo($cuenta, array( "CodAgrup"=>$bdCtasCont[$i]->cf_c_digo_del_sat, "NumCta"=>$bdCtasCont[$i]->account_code, "Desc"=>utf8_decode(substr($bdCtasCont[$i]->account_name, 11)), "Nivel"=>$nivelCta, "Natur"=>$naturCta, "SubCtaDe"=>substr($bdCtasCont[$i]->parent_account_name, 0, 10) ) ); } } } #---------------------------------------------------------------- # Cerramos la conexión #---------------------------------------------------------------- mysqli_close($conn); #=== Se guarda el archivo .XML del Catalogo de Cuentas ======================= $file_name_with_full_path = '/var/www/html/aptusContaElec/archs_xml/'.$regFeCa.$anioCat.$mesCata."CT.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 ======================= $cfdi = $xml->saveXML(); $xml->formatOutput = true; $xml->save($file_name_with_full_path); unset($xml); #=== Se dan permisos de escritura al archivo .xml. ========================= chmod($SendaXML.$regFeCa.$anioCat.$mesCata."CT.xml", 0777); #=== Se procede a crear el archivo ZIP del Catalogo de Cuentas ========================= $zip = new ZipArchive(); $nombreArchivoZip = '/var/www/html/aptusContaElec/archs_zip/'.$regFeCa.$anioCat.$mesCata."CT.zip"; $nameArchZip = $regFeCa.$anioCat.$mesCata."CT.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) { echo "Error creando archivo"; exit("Error creando archivo ZIP"); } #---------------------------------------------------------------- # 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 ======================= $xmlFilesPath = 'https://aptuslegal.app/aptusContaElec/archs_xml/'; $zipFilesPath = 'https://aptuslegal.app/aptusContaElec/archs_zip/'; $resultData = array('xmlFilesPath'=>$xmlFilesPath, 'xmlFileName'=>$regFeCa.$anioCat.$mesCata."CT.xml", 'zipFilesPath'=>$zipFilesPath, 'zipFileName' => $regFeCa.$anioCat.$mesCata."CT.zip", 'cantidadCuentas' => $cantidadCuentas, 'cantidadAcreedoras' => $cantidadAcreedoras, 'cantidadDeudoras' => $cantidadDeudoras); $j_array = array('code' => "200", 'message' => "Proceso de creacion de Archivo de Catalogo de Cuentas fue exitoso", "data"=>$resultData); $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); } } }