767 lines
30 KiB
PHP
767 lines
30 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace SmsNotifier\Facade;
|
|
|
|
use Exception;
|
|
use SmsNotifier\Factory\MessageTextFactory;
|
|
use SmsNotifier\Service\Logger;
|
|
use SmsNotifier\Service\SmsNumberProvider;
|
|
use GuzzleHttp\Client;
|
|
use GuzzleHttp\Exception\RequestException;
|
|
use Ubnt\UcrmPluginSdk\Service\UcrmApi;
|
|
use Ubnt\UcrmPluginSdk\Service\PluginConfigManager;
|
|
use Ubnt\UcrmPluginSdk\Service\PluginLogManager;
|
|
|
|
|
|
/*
|
|
* send message to client's number
|
|
*/
|
|
|
|
abstract class AbstractOxxoOperationsFacade
|
|
{
|
|
/**
|
|
* @var Logger
|
|
*/
|
|
protected $logger;
|
|
|
|
/**
|
|
* @var MessageTextFactory
|
|
*/
|
|
protected $messageTextFactory;
|
|
|
|
/**
|
|
* @var SmsNumberProvider
|
|
*/
|
|
protected $clientPhoneNumber;
|
|
|
|
/**
|
|
* @var \SmsNotifier\Service\MinioStorageService
|
|
*/
|
|
protected $minioStorage;
|
|
|
|
/**
|
|
* @var UcrmApi
|
|
*/
|
|
protected $ucrmApi;
|
|
|
|
protected $stripeCustomAttributeID;
|
|
protected $clabeInterbancariaBanamexID;
|
|
|
|
public function __construct(
|
|
Logger $logger,
|
|
MessageTextFactory $messageTextFactory,
|
|
SmsNumberProvider $clientPhoneNumber,
|
|
\SmsNotifier\Service\MinioStorageService $minioStorage
|
|
) {
|
|
$this->logger = $logger;
|
|
$this->messageTextFactory = $messageTextFactory;
|
|
$this->clientPhoneNumber = $clientPhoneNumber;
|
|
$this->minioStorage = $minioStorage;
|
|
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipServer = $config['ipserver'] ?? 'localhost';
|
|
$apiUrl = "https://$ipServer/crm/api/v1.0/";
|
|
|
|
$client = new Client([
|
|
'base_uri' => $apiUrl,
|
|
'verify' => false,
|
|
]);
|
|
|
|
$this->ucrmApi = new UcrmApi($client, $config['apitoken'] ?? '');
|
|
}
|
|
|
|
/*
|
|
* Creates a PaymentIntent for OXXO in Stripe for a Customer
|
|
* @param array $event_json
|
|
* @param int|null $amount
|
|
* @return array
|
|
* @throws \GuzzleHttp\Exception\GuzzleException
|
|
* @throws \Stripe\Exception\ApiErrorException
|
|
* @throws Exception
|
|
*/
|
|
public function createOxxoPaymentIntent($event_json, $amount = null, bool $uploadToFtp = true): array
|
|
{
|
|
// 1. Obtener Referencia de Stripe (Lógica Común)
|
|
$stripeResult = $this->createStripeReference($event_json, $amount);
|
|
|
|
// Si hubo error en Stripe, retornar el resultado de error
|
|
if ($stripeResult['hasError']) {
|
|
return $stripeResult['data'];
|
|
}
|
|
|
|
// 2. Procesamiento Síncrono (Generación inmediata)
|
|
// Usamos los datos obtenidos de Stripe
|
|
$oxxoData = $stripeResult['data'];
|
|
|
|
return $this->processSynchronousGeneration($oxxoData, $uploadToFtp);
|
|
}
|
|
|
|
/**
|
|
* Crea la orden en el servicio Docker y retorna el ID para flujo asíncrono
|
|
*/
|
|
public function createAsyncOxxoOrder($event_json, $amount = null): array
|
|
{
|
|
// 1. Obtener Referencia de Stripe
|
|
$stripeResult = $this->createStripeReference($event_json, $amount);
|
|
|
|
if ($stripeResult['hasError']) {
|
|
return $stripeResult['data'];
|
|
}
|
|
|
|
$data = $stripeResult['data'];
|
|
|
|
// 2. Llamar al servicio Docker para crear la orden (POST /orders)
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipPuppeteer = $config['ipPuppeteer'];
|
|
$portPuppeteer = $config['portPuppeteer'];
|
|
$api_url = "http://$ipPuppeteer:$portPuppeteer/orders";
|
|
|
|
try {
|
|
$client = new Client(['timeout' => 5]);
|
|
$response = $client->post($api_url, [
|
|
'json' => [
|
|
'client_id' => $data['clientID'],
|
|
'amount' => $data['amount'],
|
|
'client_full_name' => $data['clientFullName'],
|
|
'oxxo_reference' => $data['oxxo_reference'],
|
|
'stripe_url' => $data['url']
|
|
]
|
|
]);
|
|
|
|
$orderData = json_decode($response->getBody()->getContents(), true);
|
|
|
|
// Agregar el order_id al resultado para que el Plugin lo devuelva
|
|
$data['order_id'] = $orderData['order_id'] ?? null;
|
|
|
|
return $data; // Retornamos los datos básicos + order_id
|
|
|
|
} catch (Exception $e) {
|
|
$this->logger->error("Error creando orden asíncrona en Docker: " . $e->getMessage());
|
|
// Fallback: Retornar los datos de Stripe aunque falle el guardado en DB local (mejor que nada)
|
|
$data['error'] = 'docker_order_creation_failed';
|
|
return $data;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Trigger para generar la imagen en background, subirla y actualizar la orden
|
|
*/
|
|
public function generateAndUploadOrder(int $orderId, string $stripeUrl, string $clientFullName, bool $uploadToFtp = true): void
|
|
{
|
|
$this->logger->info("Iniciando generación en background para Orden #$orderId");
|
|
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipPuppeteer = $config['ipPuppeteer'];
|
|
$portPuppeteer = $config['portPuppeteer'];
|
|
|
|
// 1. Solicitar Generación (POST /orders/:id/generate)
|
|
// Calculamos nombre de archivo
|
|
$clientFullNameWithoutSpaces = str_replace(' ', '_', $clientFullName);
|
|
$voucherFileName = 'voucher_'.$clientFullNameWithoutSpaces.'_' . time() . '.jpeg';
|
|
$output_filename = realpath(__DIR__ . '/../../vouchers_oxxo') . '/'. $voucherFileName;
|
|
|
|
$generateUrl = "http://$ipPuppeteer:$portPuppeteer/orders/$orderId/generate";
|
|
|
|
try {
|
|
$client = new Client(['timeout' => 60]); // Mayor timeout para Puppeteer
|
|
$response = $client->post($generateUrl, [
|
|
'json' => [
|
|
'url' => $stripeUrl,
|
|
'filename' => $voucherFileName,
|
|
'clip' => ['x' => 325, 'y' => 30, 'width' => 550, 'height' => 550]
|
|
]
|
|
]);
|
|
|
|
if ($response->getStatusCode() === 200) {
|
|
// Guardar imagen localmente
|
|
$imageContent = $response->getBody()->getContents();
|
|
file_put_contents($output_filename, $imageContent);
|
|
$this->logger->info("Imagen generada y guardada localmente: $voucherFileName");
|
|
|
|
$voucherUrl = '';
|
|
// 2. Subir a S3/MinIO (si aplica)
|
|
if ($uploadToFtp) {
|
|
// $voucherUrl = $this->UploadVoucherToWordpressByImageFileName($voucherFileName);
|
|
// $this->logger->info("Imagen subida a FTP: $voucherUrl");
|
|
|
|
// Nueva implementación MinIO
|
|
$voucherUrl = $this->minioStorage->uploadFile($output_filename, $voucherFileName);
|
|
$this->logger->info("Imagen subida a MinIO: $voucherUrl");
|
|
}
|
|
|
|
// 3. Actualizar Orden (POST /orders/:id/complete)
|
|
if ($voucherUrl) {
|
|
$completeUrl = "http://$ipPuppeteer:$portPuppeteer/orders/$orderId/complete";
|
|
$client->post($completeUrl, [
|
|
'json' => ['voucher_image_url' => $voucherUrl]
|
|
]);
|
|
}
|
|
}
|
|
|
|
} catch (Exception $e) {
|
|
$this->logger->error("Error en flujo de background para Orden #$orderId: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtiene el estado de una orden desde el servicio Docker
|
|
*/
|
|
public function getOxxoOrderStatus($orderId): array
|
|
{
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipPuppeteer = $config['ipPuppeteer'];
|
|
$portPuppeteer = $config['portPuppeteer'];
|
|
$api_url = "http://$ipPuppeteer:$portPuppeteer/orders/$orderId";
|
|
|
|
try {
|
|
$client = new Client(['timeout' => 5]);
|
|
$response = $client->get($api_url);
|
|
$data = json_decode($response->getBody()->getContents(), true);
|
|
|
|
// Si la URL de la imagen es relativa o local, ajustarla si es necesario
|
|
// pero el servicio ya guarda la URL completa del FTP si se subió.
|
|
|
|
return $data;
|
|
} catch (Exception $e) {
|
|
$this->logger->error("Error obteniendo estado de orden #$orderId: " . $e->getMessage());
|
|
return ['error' => 'fetch_failed', 'message' => $e->getMessage()];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Lógica extraída de Stripe
|
|
* Retorna ['hasError' => bool, 'data' => array]
|
|
*/
|
|
public function createStripeReference($event_json, $amount = null): array
|
|
{
|
|
$arrayOxxoPayment = [];
|
|
$integerAmount = $amount;
|
|
|
|
// Inicializar Config y Clientes (Copied logic)
|
|
$configManager = PluginConfigManager::create();
|
|
$config = $configManager->loadConfig();
|
|
$StripeToken = $config['tokenstripe'];
|
|
$IPServer = $config['ipserver'];
|
|
$tokenCRM = $config['apitoken'];
|
|
|
|
$baseUri = 'https://' . $IPServer . '/crm/api/v1.0/';
|
|
if (!isset($this->ucrmApi)) {
|
|
// Re-instanciar si es necesario, aunque ya está en consructor
|
|
// Pero usamos la propiedad de clase
|
|
}
|
|
|
|
// ... Lógica de obtención de cliente, Stripe Customer, PaymentIntent ...
|
|
// [RESUMIDO: Copiaremos el tocho de código aquí, simplificado]
|
|
|
|
$clientID = $event_json['client_id'];
|
|
$clientFullName = '';
|
|
|
|
// --- 1. Obtener Cliente CRM ---
|
|
try {
|
|
$clientGuzzle = new Client([
|
|
'base_uri' => $baseUri,
|
|
'headers' => ['X-Auth-App-Key' => $tokenCRM, 'Accept' => 'application/json'],
|
|
'verify' => false,
|
|
'timeout' => 5
|
|
]);
|
|
$resp = $clientGuzzle->get("clients/" . $clientID);
|
|
$arrayClientCRM = json_decode($resp->getBody()->getContents(), true);
|
|
$clientFullName = $arrayClientCRM['firstName'] . ' ' . $arrayClientCRM['lastName'];
|
|
} catch (Exception $e) {
|
|
return ['hasError' => true, 'data' => $this->buildErrorArray('errorGetClient', 'Error obteniendo cliente', $clientID, $clientFullName, $amount)];
|
|
}
|
|
|
|
// --- 2. Obtener Email y Stripe ID ---
|
|
$clientEmail = 'siip8873@gmail.com'; // Default
|
|
foreach ($arrayClientCRM['contacts'] as $contact) {
|
|
if (!empty($contact['email'])) { $clientEmail = $contact['email']; break; }
|
|
}
|
|
|
|
$stripeCustomerId = null;
|
|
foreach ($arrayClientCRM['attributes'] as $attr) {
|
|
if ($attr['key'] === 'stripeCustomerId') { $stripeCustomerId = $attr['value']; break; }
|
|
}
|
|
if (!$stripeCustomerId) {
|
|
return ['hasError' => true, 'data' => $this->buildErrorArray('errorGetCustomerStripe', 'Cliente sin Stripe ID', $clientID, $clientFullName, $amount)];
|
|
}
|
|
|
|
// --- 3. Calcular Monto ---
|
|
if ($amount === null) {
|
|
$amount = abs($arrayClientCRM['accountOutstanding']);
|
|
} else {
|
|
if(!is_numeric($amount)) $amount = preg_replace('/[^\d.]/', '', $amount);
|
|
}
|
|
|
|
if ($amount <= 10) {
|
|
return ['hasError' => true, 'data' => $this->buildErrorArray('errorsinadeudo', 'Monto insuficiente o sin deuda', $clientID, $clientFullName, $amount)];
|
|
}
|
|
|
|
// --- 4. Crear Payment Intent en Stripe ---
|
|
try {
|
|
$amountInCents = intval($amount * 100);
|
|
$guzzleClient = new Client(['timeout' => 10]);
|
|
|
|
// Payment Intent
|
|
$piResp = $guzzleClient->post('https://api.stripe.com/v1/payment_intents', [
|
|
'auth' => [$StripeToken, ''],
|
|
'form_params' => [
|
|
'amount' => $amountInCents,
|
|
'currency' => 'mxn',
|
|
'payment_method_types' => ['customer_balance', 'card', 'oxxo'],
|
|
'customer' => $stripeCustomerId,
|
|
'metadata' => [
|
|
'clientId' => $clientID,
|
|
'ucrm_client_id' => $clientID, // Backwards compatibility
|
|
'createdBy' => 'UCRM',
|
|
'paymentType' => 'card.one_time',
|
|
'signedInAdminId' => $config['idPaymentAdminCRM'] ?? 1,
|
|
'tipoPago' => 'OXXO'
|
|
],
|
|
'payment_method_options' => ['oxxo' => ['expires_after_days' => 3]]
|
|
]
|
|
]);
|
|
$paymentIntent = json_decode($piResp->getBody()->getContents(), true);
|
|
|
|
// Payment Method
|
|
$firstName = $arrayClientCRM['firstName'] ?? '';
|
|
$lastName = $arrayClientCRM['lastName'] ?? '';
|
|
$pmResp = $guzzleClient->post('https://api.stripe.com/v1/payment_methods', [
|
|
'auth' => [$StripeToken, ''],
|
|
'form_params' => [
|
|
'type' => 'oxxo',
|
|
'billing_details' => ['name' => "$firstName $lastName", 'email' => $clientEmail]
|
|
]
|
|
]);
|
|
$paymentMethod = json_decode($pmResp->getBody()->getContents(), true);
|
|
|
|
// Confirm
|
|
$confResp = $guzzleClient->post('https://api.stripe.com/v1/payment_intents/' . $paymentIntent['id'] . '/confirm', [
|
|
'auth' => [$StripeToken, ''],
|
|
'form_params' => ['payment_method' => $paymentMethod['id']]
|
|
]);
|
|
$paymentIntentConfirm = json_decode($confResp->getBody()->getContents(), true);
|
|
|
|
} catch (Exception $e) {
|
|
return ['hasError' => true, 'data' => $this->buildErrorArray('errorStripeApi', $e->getMessage(), $clientID, $clientFullName, $amount)];
|
|
}
|
|
|
|
// --- 5. Extraer Datos OXXO ---
|
|
if (!empty($paymentIntentConfirm['next_action']['oxxo_display_details'])) {
|
|
$oxxoDetails = $paymentIntentConfirm['next_action']['oxxo_display_details'];
|
|
return [
|
|
'hasError' => false,
|
|
'data' => [
|
|
'oxxo_reference' => $oxxoDetails['number'],
|
|
'url' => $oxxoDetails['hosted_voucher_url'],
|
|
'error' => '',
|
|
'clientID' => $clientID,
|
|
'clientFullName' => $clientFullName,
|
|
'amount' => $amount,
|
|
'voucher_image_url' => ''
|
|
]
|
|
];
|
|
}
|
|
|
|
return ['hasError' => true, 'data' => $this->buildErrorArray('errorNoOxxoDetails', 'No se recibieron detalles OXXO', $clientID, $clientFullName, $amount)];
|
|
}
|
|
|
|
private function buildErrorArray($code, $desc, $clientId, $name, $amount) {
|
|
return [
|
|
'oxxo_reference' => '',
|
|
'url' => '',
|
|
'error' => $code,
|
|
'failDescription' => $desc,
|
|
'clientID' => $clientId,
|
|
'clientFullName' => $name,
|
|
'amount' => $amount,
|
|
'voucher_image_url' => ''
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Crea la orden en el microservicio (Paso 1 del flujo asíncrono)
|
|
*/
|
|
public function createOxxoOrder($arrayOxxoPayment) {
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipPuppeteer = $config['ipPuppeteer'];
|
|
$portPuppeteer = $config['portPuppeteer'];
|
|
$baseUrl = 'http://'.$ipPuppeteer.':'.$portPuppeteer;
|
|
$guzzleClient = new Client(['timeout' => 10]);
|
|
|
|
try {
|
|
$createOrderResp = $guzzleClient->post($baseUrl . '/orders', [
|
|
'json' => [
|
|
'client_id' => $arrayOxxoPayment['clientID'],
|
|
'amount' => $arrayOxxoPayment['amount'],
|
|
'client_full_name' => $arrayOxxoPayment['clientFullName'],
|
|
'oxxo_reference' => $arrayOxxoPayment['oxxo_reference'],
|
|
'stripe_url' => $arrayOxxoPayment['url']
|
|
]
|
|
]);
|
|
$orderData = json_decode($createOrderResp->getBody()->getContents(), true);
|
|
$arrayOxxoPayment['order_id'] = $orderData['order_id'] ?? null;
|
|
return $arrayOxxoPayment;
|
|
|
|
} catch (Exception $e) {
|
|
$this->logger->error("Error creando orden OXXO: " . $e->getMessage());
|
|
return $arrayOxxoPayment;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Genera el voucher y lo sube (Paso 2 del flujo asíncrono)
|
|
*/
|
|
public function generateOxxoVoucher($arrayOxxoPayment, $uploadToFtp) {
|
|
if (empty($arrayOxxoPayment['order_id'])) {
|
|
$this->logger->error("Intentando generar voucher sin order_id");
|
|
return $arrayOxxoPayment;
|
|
}
|
|
|
|
$config = PluginConfigManager::create()->loadConfig();
|
|
$ipPuppeteer = $config['ipPuppeteer'];
|
|
$portPuppeteer = $config['portPuppeteer'];
|
|
$baseUrl = 'http://'.$ipPuppeteer.':'.$portPuppeteer;
|
|
$guzzleClient = new Client(['timeout' => 60]);
|
|
|
|
$clientFullNameWithoutSpaces = str_replace(' ', '_', $arrayOxxoPayment['clientFullName']);
|
|
$voucherFileName = 'voucher_'.$clientFullNameWithoutSpaces.'_' . time() . '.jpeg';
|
|
$output_filename = realpath(__DIR__ . '/../../vouchers_oxxo') . '/'. $voucherFileName;
|
|
|
|
$request_data = [
|
|
'url' => $arrayOxxoPayment['url'],
|
|
'filename' => $voucherFileName,
|
|
'clip' => ['x' => 325, 'y' => 30, 'width' => 550, 'height' => 550]
|
|
];
|
|
|
|
try {
|
|
$response = $guzzleClient->post($baseUrl . '/orders/' . $arrayOxxoPayment['order_id'] . '/generate', [
|
|
'json' => $request_data,
|
|
'headers' => ['Accept' => 'image/jpeg, image/png']
|
|
]);
|
|
|
|
if ($response->getStatusCode() === 200) {
|
|
file_put_contents($output_filename, $response->getBody()->getContents());
|
|
|
|
$arrayOxxoPayment['voucher_filename'] = $voucherFileName;
|
|
|
|
if ($uploadToFtp) {
|
|
$url_file = $this->minioStorage->uploadFile($output_filename, $voucherFileName);
|
|
$arrayOxxoPayment['voucher_image_url'] = $url_file;
|
|
|
|
try {
|
|
$guzzleClient->post($baseUrl . '/orders/' . $arrayOxxoPayment['order_id'] . '/complete', [
|
|
'json' => ['voucher_image_url' => $url_file]
|
|
]);
|
|
|
|
// CLEANUP: Eliminar voucher local tras subida exitosa
|
|
if (file_exists($output_filename)) {
|
|
unlink($output_filename);
|
|
//$this->logger->info("Limpieza: Voucher local eliminado ($voucherFileName)");
|
|
}
|
|
|
|
} catch (Exception $ex) {
|
|
$this->logger->warning("No se pudo actualizar URL final: " . $ex->getMessage());
|
|
}
|
|
}
|
|
}
|
|
} catch (Exception $e) {
|
|
$this->logger->error("Error generando voucher (Puppeteer): " . $e->getMessage());
|
|
}
|
|
|
|
return $arrayOxxoPayment;
|
|
}
|
|
|
|
/**
|
|
* Mantiene compatibilidad con llamadas anteriores
|
|
*/
|
|
private function processSynchronousGeneration($arrayOxxoPayment, $uploadToFtp) {
|
|
$arrayOxxoPayment = $this->createOxxoOrder($arrayOxxoPayment);
|
|
if (!empty($arrayOxxoPayment['order_id'])) {
|
|
$arrayOxxoPayment = $this->generateOxxoVoucher($arrayOxxoPayment, $uploadToFtp);
|
|
}
|
|
return $arrayOxxoPayment;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// /**
|
|
// * implement in subclass with the specific messaging provider
|
|
// * @see TwilioNotifierFacade::sendWhatsApp()
|
|
// */
|
|
abstract protected function sendWhatsApp(
|
|
string $message
|
|
): void;
|
|
|
|
|
|
|
|
|
|
function validarEmail($email)
|
|
{
|
|
$this->logger->debug('SE VALIDA EL EMAIL!!! ' . PHP_EOL);
|
|
// Utilizar la función filter_var con el filtro FILTER_VALIDATE_EMAIL para validar el email
|
|
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
// Si el email es válido, devolver el email
|
|
return $email;
|
|
} else {
|
|
// Si el email no es válido, devolver una cadena vacía
|
|
return '';
|
|
}
|
|
}
|
|
|
|
|
|
function UploadReceiptToWordpressByImageFileName($imageFileName): string
|
|
{
|
|
|
|
// $log = PluginLogManager::create(); //Initialize Logger
|
|
$configManager = PluginConfigManager::create();
|
|
$config = $configManager->loadConfig();
|
|
|
|
// Configuración de conexión FTP
|
|
$ftp_server = $config['hostServerFTP'];
|
|
$ftp_username = $config['usernameServerFTP'];
|
|
$ftp_password = $config['passServerFTP'];
|
|
|
|
$remote_folder = "/public_html/wp/wp-content/uploads/img/";
|
|
|
|
|
|
// Configuración de conexión FTP
|
|
$remote_file = "/public_html/wp/wp-content/uploads/img/" . $imageFileName;
|
|
$file_to_upload = __DIR__ . '/' . $imageFileName;
|
|
$url = 'https://siip.mx/wp/wp-content/uploads/img/' . $imageFileName;
|
|
|
|
|
|
|
|
// Conexión FTP
|
|
$ftp_conn = ftp_connect($ftp_server) or die("No se pudo conectar al servidor FTP");
|
|
$login = ftp_login($ftp_conn, $ftp_username, $ftp_password);
|
|
ftp_pasv($ftp_conn, true);
|
|
// Verificar conexión y login
|
|
if ($ftp_conn && $login) {
|
|
print_r("Conexión FTP exitosa" . PHP_EOL);
|
|
// $log->appendLog("Conexión FTP exitosa" . PHP_EOL);
|
|
|
|
// Cargar archivo
|
|
if (ftp_put($ftp_conn, $remote_file, $file_to_upload, FTP_BINARY)) {
|
|
print_r("El archivo ha sido cargado exitosamente." . PHP_EOL);
|
|
print_r("La URL es: " . $url . PHP_EOL);
|
|
// $log->appendLog("El archivo ha sido cargado exitosamente." . PHP_EOL);
|
|
// $log->appendLog("La URL es: " . $url . PHP_EOL);
|
|
// Cerrar conexión FTP
|
|
//ftp_close($ftp_conn);
|
|
//return $url;
|
|
|
|
} else {
|
|
//$log->appendLog("Error al cargar el archivo " . PHP_EOL);
|
|
print_r("Error al cargar el archivo " . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return '';
|
|
}
|
|
|
|
// Obtener lista de archivos en la carpeta
|
|
$files = ftp_nlist($ftp_conn, $remote_folder);
|
|
if (is_array($files)) {
|
|
// Eliminar la ruta del directorio de los archivos
|
|
$files = array_map(function ($file) use ($remote_folder) {
|
|
return str_replace($remote_folder, '', $file);
|
|
}, $files);
|
|
|
|
// Obtener fechas de modificación
|
|
$filesWithTime = [];
|
|
foreach ($files as $file) {
|
|
$modifiedTime = ftp_mdtm($ftp_conn, $remote_folder . $file);
|
|
if ($modifiedTime != -1) {
|
|
$filesWithTime[$file] = $modifiedTime;
|
|
}
|
|
}
|
|
|
|
// Ordenar archivos por fecha de modificación, más recientes primero
|
|
arsort($filesWithTime);
|
|
|
|
// Obtener los archivos a eliminar (todos menos los 5 más recientes)
|
|
$filesToDelete = array_slice(array_keys($filesWithTime), 5);
|
|
|
|
// Eliminar archivos antiguos
|
|
foreach ($filesToDelete as $file) {
|
|
if (ftp_delete($ftp_conn, $remote_folder . $file)) {
|
|
print_r("Comprobante eliminado de Wordpress: " . $file . PHP_EOL);
|
|
// $log->appendLog("Comprobante eliminado de Wordpress: " . $file . PHP_EOL);
|
|
} else {
|
|
print_r('Error al borrar comprobante' . $file . PHP_EOL);
|
|
// $log->appendLog('Error al borrar comprobante' . $file . PHP_EOL);
|
|
}
|
|
}
|
|
print_r("Archivos eliminados" . PHP_EOL);
|
|
// $log->appendLog("Archivos eliminados" . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return $url;
|
|
} else {
|
|
print_r("No se pudo obtener la lista de archivos de la carpeta FTP" . PHP_EOL);
|
|
// $log->appendLog("No se pudo obtener la lista de archivos de la carpeta FTP" . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return $url;
|
|
}
|
|
|
|
// Cerrar conexión FTP
|
|
//ftp_close($ftp_conn);
|
|
//return '';
|
|
} else {
|
|
print_r("No se pudo conectar o iniciar sesión en el servidor FTP." . PHP_EOL);
|
|
// $log->appendLog("No se pudo conectar o iniciar sesión en el servidor FTP." . PHP_EOL);
|
|
return '';
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function UploadVoucherToWordpressByImageFileName($imageFileName): string
|
|
{
|
|
|
|
$log = PluginLogManager::create(); //Initialize Logger
|
|
$configManager = PluginConfigManager::create();
|
|
$config = $configManager->loadConfig();
|
|
|
|
// Configuración de conexión FTP
|
|
$ftp_server = $config['hostServerFTP'];
|
|
$ftp_username = $config['usernameServerFTP'];
|
|
$ftp_password = $config['passServerFTP'];
|
|
$remote_folder = "/public_html/wp/wp-content/uploads/vouchers_oxxo/";
|
|
|
|
$log->appendLog("Subiendo voucher a worpdpress " . PHP_EOL);
|
|
// Configuración de conexión FTP
|
|
$remote_file = "/public_html/wp/wp-content/uploads/vouchers_oxxo/" . $imageFileName;
|
|
$file_to_upload = __DIR__ . '/../../vouchers_oxxo/' . $imageFileName;
|
|
$url = 'https://siip.mx/wp/wp-content/uploads/vouchers_oxxo/' . $imageFileName;
|
|
|
|
$log->appendLog("file_to_upload: " . $file_to_upload . PHP_EOL);
|
|
|
|
// Conexión FTP
|
|
$ftp_conn = ftp_connect($ftp_server) or die("No se pudo conectar al servidor FTP");
|
|
$login = ftp_login($ftp_conn, $ftp_username, $ftp_password);
|
|
ftp_pasv($ftp_conn, true);
|
|
// Verificar conexión y login
|
|
if ($ftp_conn && $login) {
|
|
$log->appendLog("Conexión FTP exitosa" . PHP_EOL);
|
|
|
|
// Cargar archivo
|
|
if (ftp_put($ftp_conn, $remote_file, $file_to_upload, FTP_BINARY)) {
|
|
$log->appendLog("El archivo ha sido cargado exitosamente." . PHP_EOL);
|
|
$log->appendLog("La URL es: " . $url . PHP_EOL);
|
|
|
|
// try {
|
|
// $this->deleteFilesWordpressExceptLastHundred($log, $ftp_conn, $remote_folder);
|
|
// } catch (\Exception $e) {
|
|
// $log->appendLog("Error en limpieza de archivos antiguos: " . $e->getMessage() . PHP_EOL);
|
|
// }
|
|
|
|
// Cerrar conexión FTP (o dejar abierta si se prefiere, pero mejor cerrar al final si es posible, aunque aquí retornamos directo)
|
|
// ftp_close($ftp_conn);
|
|
// Cerrar conexión FTP
|
|
//ftp_close($ftp_conn); //COMENTAR AQUÍ SI SE BORRAN LOS ARCHIVOS DE WORDPRESS DESCOMENTANDO EL CÓDIGO DE MÁS ABAJO
|
|
return $url; //COMENTAR AQUÍ SI SE BORRAN LOS ARCHIVOS DE WORDPRESS DESCOMENTANDO EL CÓDIGO DE MÁS ABAJO
|
|
|
|
} else {
|
|
$log->appendLog("Error al cargar el archivo " . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return '';
|
|
}
|
|
|
|
//SI SE DECIDE VOLVER A ELIMINAR LOS COMPROBANTES ENTONCES DESCOMENTAR ESTA PARTE DE ABAJO Y COMENTAR LA SECCIÓN DE ARRIBA
|
|
|
|
// Obtener lista de archivos en la carpeta
|
|
// $files = ftp_nlist($ftp_conn, $remote_folder);
|
|
// if (is_array($files)) {
|
|
// // Eliminar la ruta del directorio de los archivos
|
|
// $files = array_map(function ($file) use ($remote_folder) {
|
|
// return str_replace($remote_folder, '', $file);
|
|
// }, $files);
|
|
|
|
// // Obtener fechas de modificación
|
|
// $filesWithTime = [];
|
|
// foreach ($files as $file) {
|
|
// $modifiedTime = ftp_mdtm($ftp_conn, $remote_folder . $file);
|
|
// if ($modifiedTime != -1) {
|
|
// $filesWithTime[$file] = $modifiedTime;
|
|
// }
|
|
// }
|
|
|
|
// // Ordenar archivos por fecha de modificación, más recientes primero
|
|
// arsort($filesWithTime);
|
|
|
|
// // Obtener los archivos a eliminar (todos menos los 50 más recientes)
|
|
// $filesToDelete = array_slice(array_keys($filesWithTime), 50);
|
|
|
|
// // Eliminar archivos antiguos
|
|
// foreach ($filesToDelete as $file) {
|
|
// if (ftp_delete($ftp_conn, $remote_folder . $file)) {
|
|
// $log->appendLog("Comprobante eliminado de Wordpress: " . $file . PHP_EOL);
|
|
// } else {
|
|
// $log->appendLog('Error al borrar comprobante' . $file . PHP_EOL);
|
|
// }
|
|
// }
|
|
// $log->appendLog("Archivos eliminados" . PHP_EOL);
|
|
// ftp_close($ftp_conn);
|
|
// return $url;
|
|
// } else {
|
|
// $log->appendLog("No se pudo obtener la lista de archivos de la carpeta FTP" . PHP_EOL);
|
|
// ftp_close($ftp_conn);
|
|
// return $url;
|
|
// }
|
|
|
|
} else {
|
|
$log->appendLog("No se pudo conectar o iniciar sesión en el servidor FTP." . PHP_EOL);
|
|
return '';
|
|
}
|
|
}
|
|
|
|
function deleteFilesWordpressExceptLastHundred($log, $ftp_conn, $remote_folder): bool
|
|
{
|
|
|
|
// Obtener lista de archivos en la carpeta
|
|
$files = ftp_nlist($ftp_conn, $remote_folder);
|
|
if (is_array($files)) {
|
|
// Eliminar la ruta del directorio de los archivos
|
|
$files = array_map(function ($file) use ($remote_folder) {
|
|
return str_replace($remote_folder, '', $file);
|
|
}, $files);
|
|
|
|
// Obtener fechas de modificación
|
|
$filesWithTime = [];
|
|
foreach ($files as $file) {
|
|
$modifiedTime = ftp_mdtm($ftp_conn, $remote_folder . $file);
|
|
if ($modifiedTime != -1) {
|
|
$filesWithTime[$file] = $modifiedTime;
|
|
}
|
|
}
|
|
|
|
// Ordenar archivos por fecha de modificación, más recientes primero
|
|
arsort($filesWithTime);
|
|
|
|
// Obtener los archivos a eliminar (todos menos los 50 más recientes)
|
|
$filesToDelete = array_slice(array_keys($filesWithTime), 50);
|
|
|
|
// Eliminar archivos antiguos
|
|
foreach ($filesToDelete as $file) {
|
|
if (ftp_delete($ftp_conn, $remote_folder . $file)) {
|
|
$log->appendLog("Voucher eliminado de Wordpress: " . $file . PHP_EOL);
|
|
} else {
|
|
$log->appendLog('Error al borrar voucher' . $file . PHP_EOL);
|
|
}
|
|
}
|
|
$log->appendLog("Archivos eliminados" . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return true;
|
|
} else {
|
|
$log->appendLog("No se pudo obtener la lista de archivos de la carpeta FTP" . PHP_EOL);
|
|
ftp_close($ftp_conn);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
}
|