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 <<
{htmlspecialchars(\$message)}
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
/********************************************************************/
?>
| Concepto | Valor |
| Mensaje: |
message ?> |
| Total de abonos: |
data->totalCargos) ?> |
| Total de cargos: |
data->totalCargos) ?> |
| Total de cuentas calculadas: |
data->totalCuentas ?> |
| Descargar archivo XML: |
|
| Descargar archivo CSV: |
|
| Descargar archivo ZIP: |
|
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
?>
| Concepto |
Valor |
| Descargar archivo XML: |
|
| Descargar archivo ZIP: |
|
| Descargar archivo CSV: |
|
| Total de registros: |
|
'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 ===
?>
| Concepto |
Valor |
| Descargar archivo CSV: |
|
| Descargar archivo XML: |
|
| Descargar archivo ZIP: |
|
| Total de folios: |
|
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
/********************************************************************/
?>
| Concepto | Valor |
| Cantidad de cuentas acreedoras: |
data->cantidadAcreedoras?> |
| Cantidad de cuentas deudoras: |
data->cantidadDeudoras?> |
| Total de cuentas: |
data->cantidadCuentas?> |
| Descargar archivo XML: |
|
| Descargar archivo ZIP: |
|
', $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
?>