Subscribe to continue reading
Subscribe to get access to the rest of this post and other subscriber-only content.
Subscribe to get access to the rest of this post and other subscriber-only content.
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
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.
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

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!
Se requiere PHP versión 7.4 o superior, con las siguientes extensiones instaladas:
Además, asegúrese de que las siguientes extensiones estén habilitadas en su PHP:
Demo en https://medicalsoft.cesarsystems.com.mx/ usuario:user contraseña:super-user
Screenshots











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
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=InternalKeyComo 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
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/LogoutQuedando 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);
A continuación pondremos a su disposición algunos ejemplos de peticiones al Service Layer del SAP así como el código en PHP
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

En ciertas ocasiones es necesario correr algunos procesos en nuestro sistema web que demoran un poco mas de tiempo y por la configuración inicial del framework este proceso no finaliza.
Para ello es necesario poder modificar los parámetros de tiempo de ejecución para darle un poco mas de tiempo al programa y finalice correctamente los procesos.
En las primeras versiones de Codeigniter 4 podíamos cambiar el tiempo de ejecución en app/Config/App.php modificando las siguientes variables
/**
* --------------------------------------------------------------------------
* Session Expiration
* --------------------------------------------------------------------------
*
* The number of SECONDS you want the session to last.
* Setting to 0 (zero) means expire when the browser is closed.
*
* @deprecated use Config\Session::$expiration instead.
*/
public int $sessionExpiration = 72000;
/**
* --------------------------------------------------------------------------
* Session Time to Update
* --------------------------------------------------------------------------
*
* How many seconds between CI regenerating the session ID.
*
* @deprecated use Config\Session::$timeToUpdate instead.
*/
public int $sessionTimeToUpdate = 300000;
/**
* --------------------------------------------------------------------------
* CSRF Expire
* --------------------------------------------------------------------------
*
* The number in seconds the token should expire.
*
* @deprecated Use `Config\Security` $expire property instead of using this property.
*/
public int $CSRFExpire = 720000;
Pero ahora en las versiones nuevas tenemos que modificar en el archivo app/Config/Session.php ya las variables son las siguientes:
/**
* --------------------------------------------------------------------------
* Session Expiration
* --------------------------------------------------------------------------
*
* The number of SECONDS you want the session to last.
* Setting to 0 (zero) means expire when the browser is closed.
*/
public int $expiration = 720000;
/**
* --------------------------------------------------------------------------
* Session Time to Update
* --------------------------------------------------------------------------
*
* How many seconds between CI regenerating the session ID.
*/
public int $timeToUpdate = 300000;Ya con eso podemos alargar el tiempo de ejecucion del sistema, pero vamos a sacrificar que el sistema deje de estar disponible para otra tarea mientras se este ejecutando tal proceso
Una de las ventajas de trabajar en el framework de codeigniter 4 son las migraciones, es decir, en lugar de crear la tabla directamente creamos los archivos de migración y cuando actualicemos los fuentes desde nuestra maquina al servidor basta con correr un php spark migrate y los campos y tablas nuevas se actualizan instantáneamente en servidor de base de datos de nuestro servidor.
En los archivos de base de datos o de migración de de dos tipos que son los siguientes
Los archivos de migración en resumen es para poner tablas y campos nuevos mientras que los archivos seeds son para insertar datos a la tabla, en nuestro caso permisos, menus ETC
Según teníamos entendido que los seeders se ejecutaban también con el comando de php spark migrate, pero al parecer no se ejecuto en el servidor el motivo era por que tenia errores, pero no los mostro el comando.
Lo que se tuvo que hacer fue correr el siguiente comando
php spark db:seedA continuación nos solicitara el nombre del archivo seed
CodeIgniter v4.5.1 Command Line Tool - Server Time: 2024-06-24 09:19:25 UTC-07:00
Nombre de semilla :Le ponemos el nombre de la semilla en nuestro caso es nuestro archivo se llama PermissionNotaCreditoSeeder.phpl a clase se llama igual solo que sin la extension .php quedaria de la siguiente forma y le damos enter en caso de que el archivo contenga un error nos los mostrara, en nuestro caso como todo nos salió bien nos arrojo este mensaje

El contenido del archivo seed era el siguiente
<?php
namespace App\Database\Seeds;
use CodeIgniter\Config\Services;
use CodeIgniter\Database\Seeder;
use Myth\Auth\Entities\User;
use Myth\Auth\Models\UserModel;
use julio101290\boilerplate\Models\MenuModel;
class PermissionNotaCreditoSeeder extends Seeder {
/**
* @var Authorize
*/
protected $authorize;
/**
* @var Db
*/
protected $db;
/**
* @var Users
*/
protected $users;
//protected $menu;
public function __construct() {
$this->authorize = Services::authorization();
$this->db = \Config\Database::connect();
$this->users = new UserModel();
}
public function run() {
$this->authorize->createPermission('listaNotaCredito-permission', 'Permiso para la lista de notas de crédito');
$this->authorize->addPermissionToGroup('listaNotaCredito-permission', 'admin');
$this->authorize->addPermissionToUser('listaNotaCredito-permission', 1);
}
}
Dentro del software libre tenemos muchas herramientas que nos permiten realizar nuestro trabajo y en este caso que es la edición de video hay una herramienta hecha en Python que nos permite quitar los silencios en un video, es decir, quitar esas regiones del video en las que no hablamos.
Bien para ello necesitaremos descargar el software jumpcutter que la pueden descargar desde Github, https://github.com/carykh/jumpcutter
Primero necesitaremos tener instalado Python en nuestro Windows 10 para ello solo entramos al CMD y escribimos Python nos mandara a la tienda de Windows y allí solo le damos obtener
Creado con WordPress & Tema de Anders Norén