diff --git a/.env b/.env
index 3476e44..4a1aa93 100644
--- a/.env
+++ b/.env
@@ -17,7 +17,7 @@ DEV_API_KEY = jNJdG9zBY92NSAALgnEdsoEIRycJiAScB6pBgIADsyg=
#VARIABLES DB
DB_HOST = 192.168.100.127
DB_USER = gateway
-DB_PASS = 7Zrs5447JkLReHH
+DB_PASS =
DB_NAME = gateway
#VARIABLES DB
@@ -27,14 +27,14 @@ DEV_DB_PASS =
DEV_DB_NAME = gateway
#SAP PROD
-SAP_URL=122.8.178.132
-SAP_USR=WS-USER
-SAP_PASS=bmas.2024
+SAP_URL=
+SAP_USR=
+SAP_PASS=
#SAP QAS
-DEV_SAP_URL=110.238.82.143
-DEV_SAP_USR=WS-USER
-DEV_SAP_PASS=bmas.2024
+DEV_SAP_URL=
+DEV_SAP_USR=
+DEV_SAP_PASS=
#RUTAS
CFDI_XML_FILE_URL = ../../facturacion/xml
diff --git a/assets/js/hmngypasarela.js b/assets/js/hmngypasarela.js
index 606e6e3..adfdaef 100644
--- a/assets/js/hmngypasarela.js
+++ b/assets/js/hmngypasarela.js
@@ -1,4 +1,4 @@
-var apiKey = "hmngy-TGFNKK1ZDpj7fUe41OOlh9k-CoYss53A";
+var apiKey = "hmngy-60lXd3pZRePVdSpItDhnC3408GvLDHU4";
function stripeTokenHandler(token) {
let form = document.getElementById("payment-form");
@@ -11,7 +11,7 @@ function stripeTokenHandler(token) {
document.addEventListener("DOMContentLoaded", () => {
- fetch("https://gateway.calidadbmasconsulting.com/api/obtLavePublicaStripe", {
+ fetch("http://127.0.0.1:8000/api/obtLavePublicaStripe", {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -104,7 +104,7 @@ document.addEventListener("DOMContentLoaded", () => {
`;
- fetch("https://gateway.calidadbmasconsulting.com/api/createPayment", {
+ fetch("http://127.0.0.1:8000/api/createPayment", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
diff --git a/editarUsuario.php b/editarUsuario.php
new file mode 100644
index 0000000..4c2ab0b
--- /dev/null
+++ b/editarUsuario.php
@@ -0,0 +1,895 @@
+ $url,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_ENCODING => "",
+ CURLOPT_MAXREDIRS => 10,
+ CURLOPT_TIMEOUT => 0,
+ CURLOPT_CONNECTTIMEOUT => 0,
+ CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
+ CURLOPT_CUSTOMREQUEST => "GET",
+ ));
+ $response = curl_exec($curl);
+ curl_close($curl);
+
+ $users = json_decode($response, true);
+ if ($users) {
+ foreach ($users as $user) {
+ if ($user['id'] == $userId) {
+ $userData = $user;
+ break;
+ }
+ }
+ }
+}
+
+if (!$userData) {
+ echo "";
+ exit;
+}
+?>
+
+
+
+
+
+
+
+
+
+
diff --git a/php/logs/form_processor.log b/php/logs/form_processor.log
index 98ee580..3557850 100644
--- a/php/logs/form_processor.log
+++ b/php/logs/form_processor.log
@@ -84,3 +84,45 @@
{"timestamp":"2025-10-28 15:10:37","level":"success","message":"Usuario enviado a API","context":{"usuario":"qwsqws","empresa":"awqsws","ip":"127.0.0.1"}}
{"timestamp":"2025-10-28 15:11:52","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/regUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand"]}}
{"timestamp":"2025-10-28 15:11:54","level":"success","message":"Usuario enviado a API","context":{"usuario":"wdqdqw","empresa":"Demo","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 15:35:21","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand"]}}
+{"timestamp":"2025-11-24 15:38:27","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand"]}}
+{"timestamp":"2025-11-24 15:39:53","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 15:40:37","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 15:43:57","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 15:57:58","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 15:58:00","level":"error","message":"Error general en process_user.php","context":{"error":"Error de conexi\u00f3n con la API: Failed to connect to 127.0.0.1 port 8000: Connection refused","trace":"#0 C:\\laragon\\www\\hmnypasarela\\php\\process_user_edit.php(37): sendToLaravelAPI(Array, Array)\n#1 {main}","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 15:58:17","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 15:58:34","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:01:53","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:02:22","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:02:48","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:02:51","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:03:17","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:03:17","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:03:34","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:09:10","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:10:33","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:11:40","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:12:40","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:28:21","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:29:29","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clavePublica","clavePrivada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:32:16","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:32:19","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:35:15","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:35:17","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:38:18","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:38:18","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:39:29","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:39:31","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:39:57","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:39:59","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:45:26","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:45:28","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:46:05","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:46:08","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:49:23","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:49:25","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:49:43","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:49:45","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
+{"timestamp":"2025-11-24 16:50:26","level":"debug","message":"Preparando campos para enviar a API","context":{"url":"http:\/\/127.0.0.1:8000\/api\/editUsuario","post_keys":["id","empresa","usuario","email","platf_pago","clave_publica","clave_privada","colorBrand","current_logo"]}}
+{"timestamp":"2025-11-24 16:50:28","level":"success","message":"Usuario enviado a API","context":{"usuario":"DEMO","empresa":"DEMO PASARELA","ip":"127.0.0.1"}}
diff --git a/php/process_user_edit.php b/php/process_user_edit.php
new file mode 100644
index 0000000..9b0e204
--- /dev/null
+++ b/php/process_user_edit.php
@@ -0,0 +1,383 @@
+ false,
+ 'message' => 'Método no permitido. Solo se acepta POST.'
+ ]);
+ exit;
+}
+
+// Configuración de la API Laravel
+$API_CONFIG = [
+ 'base_url' => $ruta.'/api', // Cambiar por tu URL de Laravel
+ 'endpoint' => '/editUsuario', // Tu endpoint de Laravel
+ 'timeout' => 30, // Timeout en segundos
+ 'auth_token' => '', // Token de autenticación si es necesario
+];
+
+try {
+ // Validar y procesar datos del formulario
+ $formData = validateAndProcessForm();
+
+ // Enviar datos a la API Laravel usando cURL
+ $apiResponse = sendToLaravelAPI($formData, $API_CONFIG);
+
+ // Procesar respuesta de la API
+ $response = processAPIResponse($apiResponse);
+
+ // Log de éxito
+ logActivity('success', 'Usuario enviado a API', [
+ 'usuario' => $formData['usuario'] ?? 'N/A',
+ 'empresa' => $formData['empresa'] ?? 'N/A',
+ 'ip' => $_SERVER['REMOTE_ADDR'] ?? 'N/A'
+ ]);
+
+ // Retornar respuesta
+ echo json_encode($response);
+
+} catch (ValidationException $e) {
+ // Errores de validación
+ http_response_code(422);
+ echo json_encode([
+ 'success' => false,
+ 'message' => 'Error de validación',
+ 'errors' => $e->getErrors()
+ ]);
+
+} catch (APIException $e) {
+ // Errores de la API
+ http_response_code($e->getHttpCode());
+ echo json_encode([
+ 'success' => false,
+ 'message' => $e->getMessage(),
+ 'api_error' => $e->getApiError()
+ ]);
+
+} catch (Exception $e) {
+ // Errores generales
+ logActivity('error', 'Error general en process_user.php', [
+ 'error' => $e->getMessage(),
+ 'trace' => $e->getTraceAsString(),
+ 'ip' => $_SERVER['REMOTE_ADDR'] ?? 'N/A'
+ ]);
+
+ http_response_code(500);
+ echo json_encode([
+ 'success' => false,
+ 'message' => 'Error interno del servidor. Por favor intente nuevamente.'.$e->getMessage()
+ ]);
+}
+
+// ============================================================================
+// FUNCIONES PRINCIPALES
+// ============================================================================
+
+/**
+ * Validar y procesar datos del formulario
+ */
+function validateAndProcessForm() {
+ $errors = [];
+
+ // Campos requeridos
+ $requiredFields = [
+ 'empresa' => 'Nombre de la Empresa',
+ 'usuario' => 'Nombre de Usuario',
+ 'email' => 'Correo Electrónico',
+ 'clavePublica' => 'Clave Pública',
+ 'clavePrivada' => 'Clave Privada',
+ 'colorValue' => 'Color de Branding'
+ ];
+
+ // Validar campos requeridos
+ foreach ($requiredFields as $field => $label) {
+ if (empty($_POST[$field]) || trim($_POST[$field]) === '') {
+ $errors[$field] = ["$label es obligatorio"];
+ }
+ }
+
+ // Validar formato de email
+ if (!empty($_POST['email']) && !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
+ $errors['email'] = ['El formato del correo electrónico no es válido'];
+ }
+
+ // Validar usuario (solo alfanuméricos, guiones y guiones bajos)
+ if (!empty($_POST['usuario']) && !preg_match('/^[a-zA-Z0-9_-]+$/', $_POST['usuario'])) {
+ $errors['usuario'] = ['El usuario solo puede contener letras, números, guiones y guiones bajos'];
+ }
+
+
+
+
+ // Si hay errores, lanzar excepción
+ if (!empty($errors)) {
+ throw new ValidationException($errors);
+ }
+
+ // Procesar y limpiar datos
+ $formData = [
+ 'id' => $_POST['id'] ?? null, // Asegurarse de que el ID se incluya
+ 'empresa' => trim($_POST['empresa']),
+ 'usuario' => trim($_POST['usuario']),
+ 'email' => strtolower(trim($_POST['email'])),
+ 'platf_pago' => !empty($_POST['platf_pago']) ? $_POST['platf_pago'] : 'stripe',
+ 'clave_publica' => formatKey($_POST['clavePublica']),
+ 'clave_privada' => formatKey($_POST['clavePrivada']),
+ 'colorBrand' => formatKey($_POST['colorValue']),
+ ];
+
+ // Procesar logo si se envió
+ if (isset($_FILES['logo']) && isset($_FILES['logo']['error']) && $_FILES['logo']['error'] !== UPLOAD_ERR_NO_FILE) {
+ // processLogo validará el archivo y devolverá la info necesaria
+ $formData['logo'] = processLogo($_FILES['logo']);
+ } else if (isset($_POST['current_logo']) && !empty($_POST['current_logo'])) {
+ // Si no se subió un nuevo logo, pero hay un logo actual, enviarlo
+ $formData['current_logo'] = $_POST['current_logo'];
+ }
+
+ return $formData;
+}
+
+/**
+ * Enviar datos a la API Laravel usando cURL
+ */
+function sendToLaravelAPI($formData, $config) {
+ $url = $config['base_url'] . $config['endpoint'];
+
+ // Inicializar cURL
+ $ch = curl_init();
+ // Preparar campos para envío multipart/form-data
+ $postFields = [];
+ foreach ($formData as $key => $value) {
+ if ($key === 'logo' && is_array($value) && isset($value['tmp_name'])) {
+ // Verificar que el archivo existe y es legible
+ if (!is_readable($value['tmp_name'])) {
+ throw new Exception('No se puede leer el archivo de logo');
+ }
+ // Crear CURLFile para enviar el archivo
+ $postFields['logo'] = new CURLFile(
+ $value['tmp_name'],
+ $value['type'],
+ $value['name']
+ );
+ // Agregar información adicional del archivo
+ $postFields['logo_name'] = $value['name'];
+ $postFields['logo_type'] = $value['type'];
+ } else {
+ $postFields[$key] = $value;
+ }
+ }
+
+ // Cabeceras - NO establecer 'Content-Type: multipart/form-data' manualmente
+ // cURL añadirá la cabecera Content-Type con el boundary correcto cuando se use CURLFile
+ $headers = [
+ 'Accept: application/json',
+ 'X-Requested-With: XMLHttpRequest'
+ ];
+ if (!empty($config['auth_token'])) {
+ $headers[] = 'Authorization: Bearer ' . $config['auth_token'];
+ }
+
+ // Configurar cURL
+ curl_setopt_array($ch, [
+ CURLOPT_URL => $url,
+ CURLOPT_POST => true,
+ CURLOPT_POSTFIELDS => $postFields,
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_TIMEOUT => $config['timeout'],
+ CURLOPT_CONNECTTIMEOUT => 10,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 3,
+ CURLOPT_SSL_VERIFYPEER => false, // Solo para desarrollo
+ CURLOPT_USERAGENT => 'PHP-FormProcessor/1.0',
+ CURLOPT_HTTPHEADER => $headers
+ ]);
+ // Log de depuración: claves y estado del archivo (no logeamos contenido binario)
+ logActivity('debug', 'Preparando campos para enviar a API', [
+ 'url' => $url,
+ 'post_keys' => array_keys($postFields)
+ ]);
+ if (isset($postFields['logo']) && isset($formData['logo'])) {
+ $tmp = $formData['logo']['tmp_name'] ?? null;
+ logActivity('debug', 'Estado logo antes de cURL', [
+ 'tmp_name' => $tmp,
+ 'exists' => $tmp ? file_exists($tmp) : false,
+ 'readable' => $tmp ? is_readable($tmp) : false,
+ 'size' => $formData['logo']['size'] ?? null,
+ 'error' => $formData['logo']['error'] ?? null
+ ]);
+ }
+
+ // Ejecutar petición
+ $response = curl_exec($ch);
+ $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
+ $error = curl_error($ch);
+
+ curl_close($ch);
+
+ // Verificar errores de cURL
+ if ($response === false || !empty($error)) {
+ throw new Exception("Error de conexión con la API: $error");
+ }
+
+
+
+ // Decodificar respuesta JSON
+ $decodedResponse = json_decode($response, true);
+
+ if (json_last_error() !== JSON_ERROR_NONE) {
+ throw new Exception("Respuesta inválida de la API: " . $response);
+ }
+
+ return [
+ 'http_code' => $httpCode,
+ 'data' => $decodedResponse,
+ 'raw_response' => $response
+ ];
+}
+
+/**
+ * Procesar respuesta de la API
+ */
+function processAPIResponse($apiResponse) {
+ $httpCode = $apiResponse['http_code'];
+ $data = $apiResponse['data'];
+
+ // Verificar código de estado HTTP
+ if ($httpCode >= 200 && $httpCode < 300) {
+ // Éxito
+ return [
+ 'success' => true,
+ 'message' => $data['message'] ?? 'Usuario registrado exitosamente',
+ 'data' => $data['data'] ?? null
+ ];
+ } else {
+ // Error de la API
+ throw new APIException(
+ $data['message'] ?? 'Error en la API',
+ $httpCode,
+ $data
+ );
+ }
+}
+
+/**
+ * Formatear claves (limpiar espacios y normalizar)
+ */
+function formatKey($key) {
+ // Limpiar espacios extra
+ $cleanKey = trim($key);
+
+ // Normalizar saltos de línea
+ $cleanKey = str_replace(["\r\n", "\r"], "\n", $cleanKey);
+
+ return $cleanKey;
+}
+
+/**
+ * Procesar archivo de logo
+ */
+function processLogo($logoFile) {
+ // Validar archivo
+ $allowedTypes = ['image/jpeg', 'image/png', 'image/jpg', 'image/svg+xml'];
+ $maxSize = 2 * 1024 * 1024; // 2MB
+
+ if (!in_array($logoFile['type'], $allowedTypes)) {
+ throw new ValidationException(['logo' => ['El logo debe ser un archivo JPG, PNG o SVG']]);
+ }
+
+ if ($logoFile['size'] > $maxSize) {
+ throw new ValidationException(['logo' => ['El logo no puede ser mayor a 2MB']]);
+ }
+
+ // Verificar que el archivo se subió correctamente
+ if (!is_uploaded_file($logoFile['tmp_name'])) {
+ throw new ValidationException(['logo' => ['Error al subir el archivo']]);
+ }
+
+ // Verificar que podemos leer el archivo
+ if (!is_readable($logoFile['tmp_name'])) {
+ throw new ValidationException(['logo' => ['No se puede leer el archivo subido']]);
+ }
+
+ return [
+ 'name' => $logoFile['name'],
+ 'type' => $logoFile['type'],
+ 'tmp_name' => $logoFile['tmp_name'],
+ 'size' => $logoFile['size'],
+ 'error' => $logoFile['error']
+ ];
+}
+
+/**
+ * Registrar actividad en log
+ */
+function logActivity($level, $message, $context = []) {
+ $logEntry = [
+ 'timestamp' => date('Y-m-d H:i:s'),
+ 'level' => $level,
+ 'message' => $message,
+ 'context' => $context
+ ];
+
+ $logFile = 'logs/form_processor.log';
+
+ // Crear directorio de logs si no existe
+ if (!file_exists(dirname($logFile))) {
+ mkdir(dirname($logFile), 0755, true);
+ }
+
+ // Escribir al log
+ file_put_contents($logFile, json_encode($logEntry) . "\n", FILE_APPEND | LOCK_EX);
+}
+
+// ============================================================================
+// CLASES DE EXCEPCIÓN PERSONALIZADAS
+// ============================================================================
+
+class ValidationException extends Exception {
+ private $errors;
+
+ public function __construct($errors) {
+ $this->errors = $errors;
+ parent::__construct('Errores de validación');
+ }
+
+ public function getErrors() {
+ return $this->errors;
+ }
+}
+
+class APIException extends Exception {
+ private $httpCode;
+ private $apiError;
+
+ public function __construct($message, $httpCode = 500, $apiError = null) {
+ $this->httpCode = $httpCode;
+ $this->apiError = $apiError;
+ parent::__construct($message);
+ }
+
+ public function getHttpCode() {
+ return $this->httpCode;
+ }
+
+ public function getApiError() {
+ return $this->apiError;
+ }
+}
+
+?>
diff --git a/verUsuarios.php b/verUsuarios.php
index a4b5efd..c355dda 100644
--- a/verUsuarios.php
+++ b/verUsuarios.php
@@ -54,6 +54,7 @@ $url = $ruta.'/api/verUsuarios';
Empresa |
Plat. Pago |
Llave |
+ Acciones |
@@ -65,6 +66,7 @@ $url = $ruta.'/api/verUsuarios';