Herramientas Informaticas

Etiqueta: PHP8 Página 4 de 9

Instalación y Uso de Boilerplate Settings en CodeIgniter 4

Entrada fija

CodeIgniter 4 Boilerplate Settings

Esta biblioteca es una extensión para configuraciones globales de plantilla Boilerplate. Puede guardar el nombre de la compañía, el número de teléfono, el correo electrónico y cambiar el idioma en toda la aplicación CodeIgniter 4.

Instalación

Ejecutar comando

composer require julio101290/boilerplatesettings

Ejecutar el comando para la migración y sembrado

php spark boilerplatesettings:installsettings

Creamos el menu

image

Listo al final queda asi

image

Usage

You can find how it works with the read code routes, controller and views etc. Finnally… Happy Coding!

Changelog

Please see CHANGELOG for more information what has changed recently.

Contributing

Contributions are very welcome.

License

This package is free software distributed under the terms of the MIT license.

Respaldos Automáticos y Eficientes de Bases de Datos MySQL con mysql-backup

La protección de los datos de una aplicación es fundamental. Los respaldos de bases de datos son una línea de defensa esencial ante posibles pérdidas de información causadas por errores humanos, fallas del sistema o ciberataques. En este post, te presentaremos una solución práctica y flexible para realizar respaldos automáticos de bases de datos MySQL: la herramienta mysql-backup autor original ramazancetinkaya/mysql-backup y las modificaciones que hemos implementado en nuestro fork julio101290.

¿Por qué un fork de mysql-backup?

Partiendo de la excelente base que ofrece mysql-backup, decidimos crear un fork con el objetivo de adaptar la herramienta a nuestras necesidades específicas y resolver ciertas limitaciones que identificamos durante su uso. Algunos de los motivos que nos llevaron a crear este fork fueron:

  • Mejorar el rendimiento: Optimizamos el proceso de respaldo, especialmente para bases de datos de gran tamaño, dividiendo las consultas en fragmentos más pequeños y evitando operaciones innecesarias.
  • Aumentar la estabilidad: Identificamos y corregimos algunos errores que podían causar inestabilidad en ciertos escenarios, como el manejo de valores nulos o la separación de consultas.
  • Añadir funcionalidades: Incorporamos nuevas características para ampliar las capacidades de la herramienta, como la posibilidad de personalizar el formato de los archivos de respaldo o integrar la herramienta con otros sistemas.

Instalación con Composer

Para instalar nuestro fork de mysql-backup, utiliza el siguiente comando en tu terminal:

Bash

composer require julio101290/mysql-backup

Usa el código con precaución.

Personalizaciones Realizadas

Hemos realizado las siguientes personalizaciones en nuestro fork:

  • División de consultas: Para mejorar el rendimiento en bases de datos grandes y evitar errores de conexión.
  • Simplificación de transacciones: Eliminamos el uso de transacciones innecesarias para reducir la complejidad.
  • Manejo de valores nulos: Aseguramos una representación correcta de los valores nulos en los respaldos.
  • Mejora del separador de consultas: Utilizamos un separador más robusto para evitar errores en la restauración.

Ejemplo de Uso con CodeIgniter4

PHP

// ... (código existente)

// Cargar la clase MySQLBackup
use Julio101290/MysqlBackup\Backup;

// ... (resto del código)

Usa el código con precaución.

Conclusión

Nuestro fork de mysql-backup ofrece una solución robusta y eficiente para realizar respaldos automáticos de bases de datos MySQL. Al personalizar esta herramienta, hemos obtenido un mayor control y flexibilidad para adaptarla a nuestras necesidades específicas.

Recomendaciones Adicionales:

  • Automatización: Integra esta funcionalidad en un sistema de automatización para realizar respaldos de forma periódica.
  • Seguridad: Implementa medidas de seguridad adecuadas para proteger los archivos de respaldo.
  • Pruebas: Realiza pruebas periódicas de restauración para verificar la integridad de los respaldos.
  • Documentación: Consulta la documentación completa de nuestro fork en GitHub para obtener más información.

Ejemplo de Uso con CodeIgniter4

PHP

// ... (código existente)

// Cargar la clase MySQLBackup
use Julio101290\MysqlBackup\Backup;

// Obtener los datos de conexión a la base de datos
$host = config('Database')->default["hostname"];
$dbname = config('Database')->default["database"];
$username = config('Database')->default["username"];
$password = config('Database')->default["password"];
$port = config('Database')->default["port"];

$DNS = "mysql:host=$host;port:$port;dbname=$dbname'";

$dbBackupConection = new \PDO($DNS, $username, $password);

// Crear una instancia de MySQLBackup
$mysqlBackup = new MySQLBackup($dbBackupConection, ROOTPATH . "writable/database/backup");

// Realizar un respaldo completo
$backup = $mysqlBackup->backup(false, true, false);

// ... (resto del código)

Usa el código con precaución.

Restauración de un Respaldo

PHP

// ... (código existente)

// Restaurar un respaldo
$restore = $mysqlBackup->restore($infoBackups["SQLFile"], true);

// ... (resto del código)

Usa el código con precaución.

WheelSoft: Mantenimiento de Neumaticos

WheelSoft 1.5 La solución definitiva para el mantenimiento de flotillas.

¿Tienes una flota de vehículos? ¡WheelSoft es la solución que estabas buscando! Optimiza la gestión de tus neumáticos, reduce los tiempos de inactividad y disminuye los costos operativos. Con WheelSoft, podrás programar mantenimientos preventivos, monitorear el estado de todos tus vehículos y garantizar la seguridad de tus conductores.

Optimiza la gestión de tu flota con nuestro software. Genera reportes de evaluación PDF personalizados y enviarlos automáticamente a tus clientes. Programa mantenimientos, lleva un control exhaustivo de tus vehículos y mejora la satisfacción de tus clientes. ¡Pruébalo ahora y descubre cómo simplificar sus procesos!

Módulos

Tenemos muy pocos módulos lo cual hace que hasta el momento el funcionamiento sea muy básico y son los siguientes

  1. Catálogos
    1. Catálogo de vehículos
    2. Catálogo de clientes
  2. Operaciones
    1. Nuevo Registro
    2. Lista Registros
  3. Administración de Usuario
    1. Perfil
    2. Usuarios
    3. Roles
    4. Permisos
    5. Menú
  4. Configuraciones
    1. Empresas
    2. Configuración de correo
    3. Licencias

Catálogo de Clientes

En este catálogo nos sirve para dar de alta, bajas y cambios los clientes a los cuales se les da a dar el servicio los campos a registrar son los siguientes

  • Nombre
  • Dirección
  • Contacto
  • Correo Electrónico 1
  • Correo Electrónico 2
  • Correo Electrónico 3
  • Correo Electrónico 4
  • Correo Electrónico 5

A continuación, vemos la lista de clientes, en el botón Azul es para agregar un cliente nuevo, y en la columna de acciones tenemos los botones para editar y eliminar

Al dar click en agregar nuevo o editar el cliente nos mostrará la siguiente ventana modal

Catálogo de Vehículos

En este catálogo daremos de alta los vehículos a los cuales vamos a registrar los datos a capturar son los siguientes

  • Nombre de Vehículo
  • Número de neumáticos
  • Placa
  • PSI Recomendado
  • Kilometraje
  • Ficha
  • Tipo neumático
  • Cliente “Es importante ya que al momento de hacer el registro sólo se mostrarán los vehículos enlazados al cliente seleccionado al registro”

A continuación, vemos la lista de vehículos en la parte superior derecha tenemos el botón azul para registrar el vehículo y en la tabla en la columna acciones tenemos los botones de editar y eliminar vehículo

Al darle click a editar o agregar vehículo nos mostrará la siguiente pantalla modal

Catálogo de Usuario

En este catálogo podemos dar altas, bajas y cambios de usuarios, así como cambiar la contraseña

En imagen posterior vemos la lista de usuarios

Al dar click al botón +Agregar usuario o en el botón editar que está en la columna acción nos mostrará el siguiente modal para capturar el usuario, en esa captura donde podemos dar los permisos necesarios al usuario y asignarle un rol

Catálogo de Permisos

Aquí damos de alta, modificamos y eliminamos los permisos necesarios en el sistema, es mejor no tocarlo

Catálogo de Roles

En este catálogo creamos los roles, en los cuales le asignamos los permisos por rol.

Posteriormente en el catálogo de usuario le asignamos el rol y con eso el usuario se le asignará todos los permisos del rol.

A continuación, vemos la lista de roles

Igualmente, al darle click al botón Editar o nuevo nos abre el modal para agregar o modificar

Catálogo Menú

Aquí es mejor no tocar, es para acomodar el menú al gusto.

Catálogo Empresas

Aquí modificamos los datos de la empresa, solo es para una empresa, solo se debe modificar cuando sea necesario ya que con estos datos se genera la licencia.

Configuración de Correo

En este módulo se configura el correo, esto es para el momento de guardar el registro se envíe el PDF al cliente, si no está bien configurado entonces no se enviará.

Módulo de Licencias

Aquí capturamos la licencia por fecha, si no hay licencia, no está válida o está vencida entonces solo dejara capturar 50 registros en los últimos 30 días

En caso de querer comprar la licencia completa, favor de dar click en el botón verde y le mostrará un texto, ese texto es el que tiene que enviar al desarrollador para el desarrollador le envié la clave de licencia

Una vez enviado y realizado el pago el desarrollador le enviará una licencia la cual tiene que capturar en el campo licencia

Módulo Nuevo Registro

Esta es la parte del día al día, aquí capturamos el registro o también llamada hoja de inspección como pueden ver tenemos un encabezado y detalle de la información, en el encabezado tenemos los siguientes datos

  • Fecha
  • No de inspección
  • No de inspección de cliente
  • Cliente
  • Que usuario realizó la hoja inspección
  • Contacto

Se puede observar que también existen dos botones uno llamado Agregar Cliente Nuevo el cual nos permite registrar un cliente que actualmente no existe en la base de datos del programa

Una vez registrado ya se podrá ver en la lista de usuarios

Tenemos también el botón de ver registros anteriores el cual nos permitirá ver los registros del cliente que esté seleccionado

Al darle click nos mostrará la lista de registros del cliente, en el cual vemos la fecha contacto y acciones, en acciones nos da los botones de modificar e imprimir la hoja de inspección

Al dar click imprimir la hoja de inspección “El botón azul con el icono de PDF” nos arroja el PDF de la Hoja de Inspección

Y al darle click al botón editar nos va llevar a editar esa hoja de inspección

En la parte de abajo tenemos el detalle de la hoja de inspección que es donde ponemos el vehículo, automáticamente nos da los datos de fecha, placa, vehículo, PSI recomendado, Kilometraje, rueda y cantidad de neumáticos

Como se puede observar, en la parte media tenemos los botones de añadir vehículo y Registrar Vehículo Nuevo

Al darle click en Añadir Vehículo nos mostrará la lista de todos los artículos del cliente

Al darle click al botón “+” ese vehículo se agregará a la lista

En caso de que el vehículo sea nuevo le damos click al botón, Registrar Vehículo Nuevo

Nos mostrará la hoja de captura

Le damos guardar y automáticamente ese vehículo se le asigna al cliente en el que estamos haciendo el registro y ya se mostrar el vehículo registrado

En el detalle tenemos los botones de eliminar y el de los engranajes, el de eliminar simplemente elimina el registro y el de los engranes nos captura los datos de inspección de ese vehículo.

Al darle click nos sale el siguiente modal con dos pestañas, en la primera capturamos el PSI y los MM de cada neumático que tiene el vehículo, como este vehículo tiene 4 neumáticos es la razón por la cual solo cuatro campos están habilitados.

En la segunda pestaña NOTAS, nos sales diferentes checks, como el de calibrar Presión de aire, Rotar neumáticos, chequeo de tren Delantero, cambiar neumático, tapar neumático, y un área de texto para capturar una nota

Dependiente de los checks seleccionado es como se imprimirá el PDF

Y esto es de la primer pestaña

Ya al final nos quedan los botones de Guardar y Guardar e Imprimir

El botón guardar simplemente nos guarda la información y Guardar e Imprimir nos guarda el registro, lo manda imprimir y por último lo envía por correo en caso de que el cliente tenga correo en su catálogo.

Instalación

Ejecutamos el instalador

Seleccionamos el lenguaje, solo tenemos español de momento

La siguiente ventana elegimos la carpeta destino, la dejamos tal y como está y le damos siguiente

Ahora nos mostrará la ventana de tareas adicionales, vamos activar la check para crear el acceso directo al escritorio

Posteriormente nos arroja el resumen de la instalación, le damos click en instalar

Y empieza el proceso de instalación

Al finalizar nos mostrará la ventana final con el check de si desamor ejecutar el software, lo activamos y le damos click en el botón finalizar

Listo, el programa se ejecuta, es posible que la primera vez la ventana salga en blanco, lo que tienen que hacer es cerrarlo y ejecutar el acceso directo

Acceso directo generado

Enlaces de descarga

Instalador Completo: Inno Setup + MariaDB 11.5

Entrada fija

Subscribe to continue reading

Subscribe to get access to the rest of this post and other subscriber-only content.

CI4MedicalSoft lanzado

Me complace avisar que ya tenemos las primeras versiones del software medico en el que hemos estado trabajando, aun puede que salgan detalles pero se van corrigiendo

¿Qué es CodeIgniter 4 medicalSoft?

CodeIgniter 4 medicalSoft es un software básico para la correcta administración/manejo del catálogo de pacientes, historial médico, control de fechas, impresión de recetas.

Características

  1. Altas, Bajas y cambios de Pacientes
  2. Altas, bajas y cambios Medicamentos
  3. altas bajas y cambios de diagnósticos / enfermedades
  4. Registro de Citas Medicas
  5. Registrar consulta médica
  6. Imprimir en PDF prescripción médica
  7. Configuraciones Generales del Hospital

Instalación y actualizaciones

composer create-project julio101290/ci4medical-soft y luego composer update cada vez que haya una nueva versión del marco.

Al actualizar, consulte las notas de la versión para ver si hay algún cambio que deba aplicar a la carpeta de su aplicación. Los archivos afectados se pueden copiar o combinar desde el vendor/codeigniter4/framework/app.

Copie env a .env y personalícelo para su aplicación, específicamente la baseURL y cualquier configuración de la base de datos.

Base de datos

Puede encontrar el archivo de base de datos en la base de datos en la carpeta base de datos / medicalsoft2022.sql

Pronto crearemos los archivos de migración para construir las tablas sin tener que ejecutar el archivo .sql

Además conforme se vayan haciendose cambios vamos a generar una aplicación instalable para windows para que la instalación sea lo más fácil posible.

Primero ejecutamos el instalador

En la ruta la dejamos tal como está y le damos click en el botón siguiente

Activamos la casilla para que se genere el acceso directo al escritorio

Verificamos que la información esté correcta

Una vez que se le da click se empezará a instalar

Una vez terminado nos sale la ventana de login, en caso de salir la pantalla en blanco cerrar la ventana y volverla abrir, el usuario es admin y la contraseña es super-admin

Una vez ingresado al sistema nos mostrará la pantalla principal y podremos empezar a usar el sistema MedicalSoft

Cambio importante con index.php

index.php ya no está en la raíz del proyecto! Se ha movido dentro de la carpeta, public para una mejor seguridad y separación de componentes.

Esto significa que debe configurar su servidor web para que “se dirija” a su proyecto carpeta public y no a la raíz del proyecto. Una mejor práctica sería configurar un host virtual para que apunte allí. Una mala práctica sería apuntar su servidor web a la raíz del proyecto y esperar ingresar public/…, como el resto de tu lógica y el El marco está expuesto.

Por favor lea la guía del usuario para obtener una mejor explicación de cómo funciona CI4!

Requisitos del servidor

Se requiere PHP versión 7.4 o superior, con las siguientes extensiones instaladas:

  • intl
  • libcurl si planea usar la biblioteca HTTP \ CURLRequest

Además, asegúrese de que las siguientes extensiones estén habilitadas en su PHP:

  • json ( habilitado de forma predeterminada – no lo apague )
  • mbstring
  • mysqlnd
  • xml ( habilitado de forma predeterminada: no lo apague )

Demo en https://medicalsoft.cesarsystems.com.mx/ usuario:user contraseña:super-user

Screenshots

Obtener la lista de precios de SAP a través Service Layer

Para traer la el catalogo de listas de precios usaremos la siguiente URL en GET

https://localhost:50000/b1s/v1/PriceLists?$select=PriceListNo,PriceListName&$filter=Active eq 'tYES'  and substringof('TRIT',PriceListNo) or substringof('TRIT',PriceListName)

Como pueden observar usamos la funcion substringof como el equivalente al like de SQL

Quedaría mas o menos de esta forma

Ahora la función quedaría de la siguiente forma

    /* =============================================
      MOSTRAR
      ============================================= */

    static public function ctrMostrar($cookie, $filtro) {


        $curl = curl_init();

        curl_setopt_array($curl, [
            CURLOPT_PORT => "50000",
            CURLOPT_URL => "https://localhost:50000/b1s/v1/PriceLists?%24select=PriceListNo%2CPriceListName&%24filter=Active%20eq%20'tYES'%20%20and%20substringof('$filtro'%2CPriceListNo)%20or%20substringof('$filtro'%2CPriceListName)",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_COOKIE => $cookie,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => [
                "Accept: */*",
                "User-Agent: Thunder Client (https://www.thunderclient.com)"
            ],
        ]);

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
            return "cURL Error #:" . $err;
        } else {
            return json_decode($response);
        }


        $response = json_decode($response);

        return $response;
    }

Y bien saben el resto es historia

Obtener lista de usuarios SAP a través de Service Layer

Lo que haremos en esta ocasión en hacer la consulta al service layer para usarlo en un Select2 vía AJAX y PHP primera mente usaremos la siguiente petición de tipo GET URL

https://localhost:50000/b1s/v1/Users?$select=InternalKey,UserCode,Group,UserName&$filter=Group eq 'ug_Regular'  and substringof('Julio',UserName)  or substringof('Julio',UserCode)&$orderby=InternalKey

Como ven usamos la función substringof que seria el equivalente en SQL al like ‘%%’

Quedando mas o menos asi

Ahora transformamos la petición a una función de PHP en la que recibimos la cookie y el filtro para buscar los usuarios

    /* =============================================
      MOSTRAR
      ============================================= */

    static public function ctrMostrar($cookie, $filtro) {


        $curl = curl_init();

        curl_setopt_array($curl, [
            CURLOPT_PORT => "50000",
            CURLOPT_URL => "https://localhost:50000/b1s/v1/Users?%24select=InternalKey%2CUserCode%2CGroup%2CUserName&%24filter=Group%20eq%20'ug_Regular'%20%20and%20substringof('$filtro'%2CUserName)%20%20or%20substringof('$filtro'%2CUserCode)&%24orderby=InternalKey",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_COOKIE => $cookie,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => [
                "Accept: */*",
                "User-Agent: Thunder Client (https://www.thunderclient.com)"
            ],
        ]);

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
            return "cURL Error #:" . $err;
        } else {
            return json_decode($response);
        }


        $response = json_decode($response);

        return $response;
    }

Ahora en el archivo de consulta se usaría de la siguiente forma, hacemos el Login, consultamos, hacemos el Logout, y formamos la cadena JSON de la siguiente forma

   $busqueda = $_POST["searchTerm"];

    $conexionSAP = ServiceLayer::login();

    $cookie = "B1SESSION=" . $conexionSAP->SessionId . ";  ROUTEID=.node1";

    $usuariosSAP = ControladorUsuariosSAP::ctrMostrar($cookie, $busqueda);

    $usuariosSAPLista = $usuariosSAP->value;

    $usuariosSAP = ServiceLayer::logout($cookie);

    $jsonVariable = ' { "results": [';

    foreach ($usuariosSAPLista as $keyUsuarios1 => $valueUsuarios1) {


        $jsonVariable .= ' {
      "id": "' . $valueUsuarios1->UserCode . '",
      "text": "' . utf8_encode($valueUsuarios1->UserCode . " - " . $valueUsuarios1->UserName) . '"
    },';
    }

    $jsonVariable = substr($jsonVariable, 0, -1);

    $jsonVariable .= ' ]
}';

    echo ($jsonVariable);

Y listo ya esto obtenemos los datos requeridos

Haciendo Logout en Service Layer en SAP y pasar el código en PHP 8.3

Bien ahora vamos a mostrar como hacer el logout, es decir, cerrar la sesión, vamos hacer la petición tipo GET con la siguiente URL

https://localhost:50000/b1s/v1/Logout

Quedando de la siguiente forma

La función en PHP seria la siguiente

 static public function logout($cookie) {

        $curl = curl_init();

        curl_setopt_array($curl, [
            CURLOPT_PORT => "50000",
            CURLOPT_URL => "https://hanagusa:50000/b1s/v1/Logout",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_COOKIE => $cookie,
            CURLOPT_SSL_VERIFYHOST => false,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_HTTPHEADER => [
                "Accept: */*",
                "User-Agent: Gisa Web Client (https://www.thunderclient.com)"
            ],
        ]);

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);

        if ($err) {
            return "cURL Error #:" . $err;
        } else {
            return $response;
        }
    }

Ya al momento de usarlo en PHP desde el Login has ta el Logout seria de la siguiente forma

$conexionSAP = ServiceLayer::login();

// Construimos la cookie

$cookie = "B1SESSION=" . $conexionSAP->SessionId . ";  ROUTEID=.node1";

$sucursalesSAP = ControladorSucursalSAP::ctrMostrar($cookie);

$sucursalesSAP = $sucursalesSAP->value;

// Cerramos la session enviando la Cookie
$conexionSAP = ServiceLayer::logout($cookie);

Ejemplos Service Layer SAP

A continuación pondremos a su disposición algunos ejemplos de peticiones al Service Layer del SAP así como el código en PHP

  1. Postman en Visual Studio Code
  2. Haciendo Login en Service Layer en SAP y pasar el código en PHP 8.3
  3. Haciendo Logout en Service Layer en SAP y pasar el código en PHP 8.3
  4. Obtener lista de usuarios SAP a través de Service Layer
  5. Obtener la lista de precios de SAP a través Service Layer
  6. Crear Consultas Personalizadas en Service Layer SAP
  7. Modificar consultas Personalizadas en Service Layer SAP
  8. Leer consultas Personalizadas en Service Layer SAP

Postman en Visual Studio Code

Algunas veces en el desarrollo es necesario consumir web Service para los proyectos, como puede ser facturación electrónica mexica, obtener el precio del dólar del DOF ETC .

Existen herramientas ya conocidas para realizar las pruebas como Postman las cuales funcionan muy bien y cuentan con excelentes funciones como la de exportar la petición al lenguaje que estemos utilizando ya sea PHP, C#, Java, Python,Ruby on Rails ETC

Pero como siempre hay alternativas en todo.

Existe una buena alternativa y es una extensión de Visual Studio Code.

Thunder Client es una extensión de cliente Rest API liviana para VS Code, diseñada a mano por Ranga Vadhineni con un enfoque en la simplicidad, el diseño limpio y el almacenamiento local.

Para instalarlo nomas vamos a extensiones buscamos Thunder Client, le damos instalar y listo

Y listo ya podemos hacer pruebas con los webservice

Página 4 de 9

Creado con WordPress & Tema de Anders Norén