nPol="2340388000037639671" Concepto="04-05-2023 - VENDOR_PAYMENT 11172" Debe="0.00" Haber="39441.97"/>
"400", "message" => "ERROR - [wsBalanzaComp_v14] Parametros incompletos para el Servicio Web, faltan el Anio de vigencia.");
$Resultado = json_encode($j_array);
// echo $Resultado;
return;
}
if($mesCata == "")
{
$j_array = array('code' => "400", "message" => "ERROR - [wsBalanzaComp_v14] Parametros incompletos para el Servicio Web, faltan el Mes de vigencia.");
$Resultado = json_encode($j_array);
// echo $Resultado;
return;
}
if($tipoEnvio == "")
{
$j_array = array('code' => "400", "message" => "ERROR - [wsBalanzaComp_v14] Parametros incompletos para el Servicio Web, faltan el Tipo de Envio.");
$Resultado = json_encode($j_array);
// echo $Resultado;
return;
}
if($csvFileName == "")
{
$j_array = array('code' => "400", "message" => "ERROR - [wsBalanzaComp_v14] Parametros incompletos para el Servicio Web, faltan el Nombre del Archivo CSV a procesar.");
$Resultado = json_encode($j_array);
// echo $Resultado;
return $Resultado;
}
if($organi_id_ZB == "")
{
$j_array = array('code' => "306", "message" => "ERROR - [wsBalanzaComp_v14] 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 ###################################################
$SendaCVS = "archs_csv/";
$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 Workdrive
#----------------------------------------------------------------
$wdrv_parent_id = $row['zworkdrvbalcom_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'];
#== 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("BCE:Balanza");
$root = $xml->appendChild($root);
#== Apertura, lectura y conversión de CSV a JSON.
$fileName = $SendaCVS.$csvFileName;
$csvToJson = csvToJson($fileName);
$arrayJson = json_decode( $csvToJson, true );
// Invertimos el orden del arreglo para los calculos.
$jsonArray = array_reverse($arrayJson, true);
#== Se procesan las cuentas y se obtienen los totales por subcuentas ======
$salIniNivTres = 0.00;
$debitoNivTres = 0.00;
$creditNivTres = 0.00;
$SalFinNivTres = 0.00;
$counNivTres = 0;
$salIniNivTrex = 0.00;
$debitoNivTrex = 0.00;
$creditNivTrex = 0.00;
$SalFinNivTrex = 0.00;
$salIniNivDos = 0.00;
$debitoNivDos = 0.00;
$creditNivDos = 0.00;
$SalFinNivDos = 0.00;
$counNivDos = 0;
$salIniNivUno = 0.00;
$debitoNivUno = 0.00;
$creditNivUno = 0.00;
$SalFinNivUno = 0.00;
$counNivUno = 0;
$totalCargos = 0;
$totalAbonos = 0;
$arrayDetalle = Array();
$Account1count = 0;
foreach($arrayJson as $item => $value)
{
$codCue = substr($value['account_code'],0,3);
if(is_numeric($codCue))
{
if($value['account.CF.Codigo del SAT'] != "")
{
$clave = array_search($value['account_code'], array_column($arrayDetalle, 'NumCta'));
if ($clave == NULL)
{
$arrayDetalle[] = array(
"ClaveSat"=>$value['account.CF.Codigo del SAT'],
"NumCta"=>$value['account_code'],
"SaldoIni"=>0.00,
"Debe"=>0.00,
"Haber"=>0.00,
"SaldoFin"=>0.00
);
}
$Account1count +=1;
}
}
}
foreach($jsonArray as $item => $value)
{
$codCue = substr($value['account_code'],0,3);
$cuePas = "";
$cueNivTre = "";
if(is_numeric($codCue))
{
$AccCod = $value['account_code'];
//echo "Código de cuenta: " . $AccCod ."
";
if(substr($AccCod, 4,2) != "00" && substr($AccCod, -3) != "000")
{
//echo "Cuenta: ".$AccCod." ".$value['opening_balance']." ".$value['debit_total']." ".$value['credit_total']." ".$value['closing_balance']." ".PHP_EOL;
//Nivel tres, se acumula
$totalCargos = $totalCargos + floatval($value['debit_total']);
$totalAbonos = $totalAbonos + floatval($value['credit_total']);
$salIniNivTres = $salIniNivTres + floatval($value['opening_balance']);
$debitoNivTres = $debitoNivTres + floatval($value['debit_total']);
$creditNivTres = $creditNivTres + floatval($value['credit_total']);
$SalFinNivTres = $SalFinNivTres + floatval($value['closing_balance']);
$counNivTres = $counNivTres + 1;
$salIniNivTrex = $salIniNivTrex + floatval($value['opening_balance']);
$debitoNivTrex = $debitoNivTrex + floatval($value['debit_total']);
$creditNivTrex = $creditNivTrex + floatval($value['credit_total']);
$SalFinNivTrex = $SalFinNivTrex + floatval($value['closing_balance']);
// Actualizamos el nivel 3
$sValBus = $AccCod;
$clave = array_search($sValBus, array_column($arrayDetalle, 'NumCta'));
if ($clave !== NULL)
{
//echo "Nivel Tres: ".$sValBus . " ==> ".$value['account.CF.Codigo del SAT']. " ID: ".$clave;
//echo "
";
$arrayDetalle[$clave]['SaldoIni'] = $arrayDetalle[$clave]['SaldoIni'] + number_format($salIniNivTrex,2, '.', '');
$arrayDetalle[$clave]['Debe'] = $arrayDetalle[$clave]['Debe'] + number_format($debitoNivTrex,2, '.', '');
$arrayDetalle[$clave]['Haber'] = $arrayDetalle[$clave]['Haber'] + number_format($creditNivTrex,2, '.', '');
$arrayDetalle[$clave]['SaldoFin'] = $arrayDetalle[$clave]['SaldoFin'] + number_format($SalFinNivTrex,2, '.', '');
// Inicializamos Nivel Tres
$salIniNivTrex = 0.00;
$debitoNivTrex = 0.00;
$creditNivTrex = 0.00;
$SalFinNivTrex = 0.00;
}
}
if(substr($AccCod, 4,2) != "00" && substr($AccCod, -3) == "000")
{
// Nivel Dos, se acumula
if($counNivTres > 0)
{
$salIniNivDos = $salIniNivDos + $salIniNivTres;
$debitoNivDos = $debitoNivDos + $debitoNivTres;
$creditNivDos = $creditNivDos + $creditNivTres;
$SalFinNivDos = $SalFinNivDos + $SalFinNivTres;
}
else
{
$salIniNivDos = $salIniNivDos + floatval($value['opening_balance']);
$debitoNivDos = $debitoNivDos + floatval($value['debit_total']);
$creditNivDos = $creditNivDos + floatval($value['credit_total']);
$SalFinNivDos = $SalFinNivDos + floatval($value['closing_balance']);
$cuePas = substr($AccCod, 0,6);
}
$counNivDos = $counNivDos + 1;
// Actualizamos el Nivel Dos
$jsonArray[$item]['opening_balance'] = number_format($salIniNivDos,2, '.', '');
$jsonArray[$item]['debit_total'] = number_format($debitoNivDos,2, '.', '');
$jsonArray[$item]['credit_total'] = number_format($creditNivDos,2, '.', '');
$jsonArray[$item]['closing_balance'] = number_format($SalFinNivDos,2, '.', '');
// Actualizamos el nivel 2
$sValBus = $AccCod;
$clave = array_search($sValBus, array_column($arrayDetalle, 'NumCta'));
//echo "Nivel Dos: ".$sValBus . " ==> ".$value['account.CF.Codigo del SAT']. " ID: ".$clave;
//echo "
";
if ($clave !== NULL)
{
$arrayDetalle[$clave]['SaldoIni'] = $arrayDetalle[$clave]['SaldoIni'] + number_format($salIniNivDos,2, '.', '');
$arrayDetalle[$clave]['Debe'] = $arrayDetalle[$clave]['Debe'] + number_format($debitoNivDos,2, '.', '');
$arrayDetalle[$clave]['Haber'] = $arrayDetalle[$clave]['Haber'] + number_format($creditNivDos,2, '.', '');
$arrayDetalle[$clave]['SaldoFin'] = $arrayDetalle[$clave]['SaldoFin'] + number_format($SalFinNivDos,2, '.', '');
}
// Nivel Uno, se acumula
$salIniNivUno = $salIniNivUno + $salIniNivDos;
$debitoNivUno = $debitoNivUno + $debitoNivDos;
$creditNivUno = $creditNivUno + $creditNivDos;
$SalFinNivUno = $SalFinNivUno + $SalFinNivDos;
$counNivUno = $counNivUno + 1;
// Inicializamos Nivel Dos
$salIniNivDos = 0.00;
$debitoNivDos = 0.00;
$creditNivDos = 0.00;
$SalFinNivDos = 0.00;
$counNivDos = 0;
// Inicializamos Nivel Tres
$salIniNivTres = 0.00;
$debitoNivTres = 0.00;
$creditNivTres = 0.00;
$SalFinNivTres = 0.00;
$counNivTres = 0;
}
if(substr($AccCod, 4,2) == "00" && substr($AccCod, -3) == "000")
{
if($counNivUno > 0)
{
$jsonArray[$item]['opening_balance'] = number_format($salIniNivUno,2, '.', '');
$jsonArray[$item]['debit_total'] = number_format($debitoNivUno,2, '.', '');
$jsonArray[$item]['credit_total'] = number_format($creditNivUno,2, '.', '');
$jsonArray[$item]['closing_balance'] = number_format($SalFinNivUno,2, '.', '');
// Actualizamos el nivel 1
$sValBus = $AccCod;
$clave = array_search($sValBus, array_column($arrayDetalle, 'NumCta'));
//echo "Nivel Uno: ".$sValBus . " ==> ".$value['account.CF.Codigo del SAT']. " ID: ".$clave;
//echo "
";
if ($clave !== NULL)
{
$arrayDetalle[$clave]['SaldoIni'] = number_format($salIniNivUno,2, '.', '');
$arrayDetalle[$clave]['Debe'] = number_format($debitoNivUno,2, '.', '');
$arrayDetalle[$clave]['Haber'] = number_format($creditNivUno,2, '.', '');
$arrayDetalle[$clave]['SaldoFin'] = number_format($SalFinNivUno,2, '.', '');
}
}
// Inicializamos Nivel Dos
$salIniNivDos = 0.00;
$debitoNivDos = 0.00;
$creditNivDos = 0.00;
$SalFinNivDos = 0.00;
$counNivDos = 0;
// Inicializamos Nivel Tres
$salIniNivTres = 0.00;
$debitoNivTres = 0.00;
$creditNivTres = 0.00;
$SalFinNivTres = 0.00;
$counNivTres = 0;
// Inicializamos Nivel Uno
$salIniNivUno = 0.00;
$debitoNivUno = 0.00;
$creditNivUno = 0.00;
$SalFinNivUno = 0.00;
$counNivUno = 0;
}
}
}
#== Se crea e inserta el primer nodo donde se declaran los namespaces ======
cargaAttNodo($root, array("Version"=>"1.3", "RFC"=>$regFeCa, "Mes"=>$mesCata, "Anio"=>$anioCat, "TipoEnvio"=>$tipoEnvio,"xsi:schemaLocation"=>"http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/BalanzaComprobacion http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/BalanzaComprobacion/BalanzaComprobacion_1_3.xsd", "xmlns:xsi"=>"http://www.w3.org/2001/XMLSchema-instance", "xmlns:BCE"=>"http://www.sat.gob.mx/esquemas/ContabilidadE/1_3/BalanzaComprobacion")
);
$arrayToCSV = Array();
$arrayToCSV[] = array('NumCta','SaldoIni', 'Debe', 'Haber', 'SaldoFin', 'ClaveSat');
foreach($arrayDetalle as $item => $value) {
if($value['ClaveSat'] != "")
{
$codCue = substr($value['NumCta'],0,3);
if(is_numeric($codCue))
{
$cuentas = $xml->createElement("BCE:Ctas");
$cuenta = $root->appendChild($cuentas);
cargaAttNodo($cuenta, array(
"SaldoFin"=>$value['SaldoFin'],
"Haber"=>$value['Haber'],
"Debe"=>$value['Debe'],
"SaldoIni"=>$value['SaldoIni'],
"NumCta"=>$value['NumCta']
)
);
// Creamos el array para el archivo CSV
$arrayToCSV[] = array($value['NumCta'],$value['SaldoIni'], $value['Debe'], $value['Haber'], $value['SaldoFin'], $value['ClaveSat']);
}
}
}
#=== Se guarda el archivo .XML de la Balanza de Comprobación =======================
$xmlFilesPath = '/var/www/html/aptusContaElec/archs_xml/';
$csvFilesPath = '/var/www/html/aptusContaElec/archs_csv/';
if($tipoEnvio == "N")
{
$file_name_with_full_path = $xmlFilesPath.$regFeCa.$anioCat.$mesCata."BN.xml";
$file_name_csv_full_path = $cvsFilesPath.$regFeCa.$anioCat.$mesCata."BN.csv";
}
else
{
$file_name_with_full_path = $xmlFilesPath.$regFeCa.$anioCat.$mesCata."BC.xml";
$file_name_csv_full_path = $cvsFilesPath.$regFeCa.$anioCat.$mesCata."BC.csv";
}
#=== Si existe el archivo CSV se elimina para crear el nuevo =======================
if(!file_exists($file_name_csv_full_path)){
unlink($file_name_csv_full_path);
}
$fp = fopen($file_name_csv_full_path, 'w');
foreach ($arrayToCSV as $fields) {
fputcsv($fp, $fields);
}
fclose($fp);
#=== 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. =========================
if($tipoEnvio == "N")
{
chmod($SendaXML.$regFeCa.$anioCat.$mesCata."BN.xml", 0777);
}
else
{
chmod($SendaXML.$regFeCa.$anioCat.$mesCata."BC.xml", 0777);
}
#=== Se procede a crear el archivo ZIP del Catalogo de Cuentas =========================
$zip = new ZipArchive();
$zipFilesPath = '/var/www/html/aptusContaElec/archs_zip/';
if($tipoEnvio == "N")
{
$nombreArchivoZip = $zipFilesPath.$regFeCa.$anioCat.$mesCata."BN.zip";
$nameArchZip = $regFeCa.$anioCat.$mesCata."BN.zip";
}
else
{
$nombreArchivoZip = $zipFilesPath.$regFeCa.$anioCat.$mesCata."BC.zip";
$nameArchZip = $regFeCa.$anioCat.$mesCata."BC.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");
}
#=== FIN DEL PROCESO =======================
$resultData = array(
'xmlFilesPath' => $xmlFilesPath,
'xmlFileName' => $regFeCa.$anioCat.$mesCata."BN.xml",
'csvFilesPath' => $csvFilesPath,
'csvFileName' => $regFeCa.$anioCat.$mesCata."BN.csv",
'zipFilesPath' => $zipFilesPath,
'zipFileName' => $regFeCa.$anioCat.$mesCata."BN.zip",
'totalCargos' => round($totalCargos,2),
'totalAbonos' => round($totalAbonos,2),
'totalCuentas' => $Account1count,
'cantidadDeudoras' => 333);
if($tipoEnvio == "N")
{
$j_array = array('code' => "200", 'message' => 'Proceso de creacion de Archivo (NORMAL) de Balanza de Comprobacion fue exitoso', 'data' => $resultData);
}
else
{
$j_array = array('code' => "200", 'message' => "Proceso de creacion de Archivo (COMPLEMENTARIO) de Balanza de Comprobacion fue exitoso", 'data' => $resultData);
}
$Resultado = json_encode($j_array);
echo $Resultado;
return $Resultado;
### FUNCIONES DEL MÓDULO #########################################################
# Funcion para convertir CSV a formato JSON
function csvToJson($fname) {
if (!($fp = fopen($fname, 'r'))) {
die("No se pudo abrir el arcivo CSV...");
}
$key = fgetcsv($fp,"1024",",");
$json = array();
while ($row = fgetcsv($fp,"1024",",")) {
$json[] = array_combine($key, $row);
}
fclose($fp);
return json_encode($json);
}
# 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);
}
}
}