 Muy bien, vamos a comenzar entonces con el día 4, vamos a hablar de las reglas de programa. Hoy en día primero vamos a hacer un pequeño repaso del día anterior, por supuesto, vamos a hacer la introducción a las reglas de programa, muchos de ustedes ya las han visto, pero vamos a hablar un poquito más de nuevo, solo que esta vez vamos a hacerlo un poquito más por encima y vamos a dedicarlo un poco más a crear las reglas en sí. Voy a dar más que nada, unos cuantos ejemplos, les voy a enseñar a identificar problemas y luego hacer el ejercicio que la voy a hacer directamente, o sea, si quieren, pueden ir siguiendo lo que voy haciendo en pantalla, ok? Ayer lo que hablamos más que nada fue acerca de las cuentas de usuario, les enseñamos a utilizar el app que se llama Usuarios, que es este que está aquí, les contamos que primero habría que definir un montón de roles de usuarios que te dan un poco los permisos dentro del sistema, qué tipo de aplicaciones puedes utilizar, qué tipo de acciones pueden realizarse, incluso encontramos un bug ahí, uno de ustedes encontró un bug que no estaba funcionando y ya está reportado. Lo hablamos de los grupos de usuarios que te permitían seleccionar distintos grupos con distintas funciones y agregar un usuario a ellos para facilitar la tarea y veo que hay unos cuantos de ustedes que han hecho unos cuantos grupos, muy bien. Y luego hablamos en sí de crear los usuarios, asignarles los roles a los usuarios y darles, por supuesto, el grupo correspondiente y veo unos cuantos usuarios por aquí. Así que, al parecer, han ido bien encaminados en esta tarea. Hoy vamos a seguir un poquito adelante y vamos a hablar de las reglas de programa, ¿verdad? Porque cuando el programa que ustedes hicieron dentro de Tracker solamente tenía los elementos de datos, no tenía nada de... no tenía nada de validación, no tenía nada de lógica. Entonces, lo que vamos a dar es agregar algunas de estas reglas para que el programa pues se adapte un poquito más a las necesidades de ustedes, ¿verdad? ¿Para qué se usan las reglas de programas? Bueno, el primer uso sería la calidad de datos, ¿verdad? Por ejemplo, prevenir errores en la captura. El ejemplo clásico es que si tenemos un campo para personas donde vamos a registrar información acerca de un embarazo no le debería de aparecer las personas de sexo masculina. Otra cosa que podría hacerse es hacer un dato obligatorio basado por algún tipo de lógica. Por ejemplo, otra cosa que podría hacerse es si una persona recibió un test de algún cierto tipo pues es obligatorio marcar cuál es el resultado del test, por ejemplo. Para prevenir errores, otra cosa que podría hacer es si un bebé está naciendo y una persona pone que el bebé pesa 36 kilos eso tendría que ser un error, ¿verdad? Porque quizá alguno se le fue un cero o algo así. Entonces la idea es que habría que agregar una validación para que no haya datos equivocados, ¿verdad? También ayudan en el flujo de trabajo para ocultar campos o secciones. El ejemplo que tenemos aquí en este programa es, por ejemplo, si una persona no ha recibido un test, pues no es necesario que se vean todas las opciones de resultados del test, ¿verdad? Que pueden confundir aún a una persona que está entrando datos. Entonces se pueden quitar. O se puede, por ejemplo, quitar o ocultar ciertas opciones basadas en qué tipo de test ha recibido la persona. También puede mostrar alertas, puede mostrar mensajes o puede cambiar incluso el valor de un elemento de datos basado en los que se puso anteriormente. Y luego procesamiento de datos, algo muy sencillo, como por ejemplo calcular la edad de una persona o obtener valores de otros eventos dentro del evento en el que se está para poder facilitar tanto indicadores como el flujo de la persona, ¿verdad? Muy bien. Para abrir reglas de programa tenemos, están simplemente dentro del app de mantenimiento y tenemos dos elementos que son importantes. Uno se llama program rule o regla de programa y el se llama program rule variable o variable de regla de programa. Muchos de estos elementos están lamentablemente solamente en inglés por ahora. Las partes de una regla de programa en la primera pantalla vamos a ver el nombre. Vamos a ver el contexto en el que se va a ejecutar si se va a ejecutar solamente para una etapa de programa o para todo el programa. Importante intentar no ejecutar reglas para todo el programa no ser que sea necesario, ¿verdad? El nombre de la regla, la descripción y la prioridad, o sea el orden de la ejecución de la regla, ¿verdad? Entonces si una regla tiene prioridad 1 y otra tiene prioridad 3, la prioridad 1 va a ejecutarse primero y la prioridad 3 va a ejecutarse después y esto es bastante útil a la hora de ver cómo es lo que va primero y lo que va después y para asegurarse de que los valores se asignan en el orden correcto, ¿verdad? Como siempre es bien importante utilizar la descripción lo mejor posible porque lo que pasa normalmente es que si un programa tiene 40, 50, 60 reglas y uno lo está haciendo a lo largo de un par de semanas luego a los 10 días ya se olvidó uno quiera lo que hacía esta regla entonces la descripción es muy útil para ayudar a eso, ¿verdad? La regla tiene varias partes, ¿verdad? Y quizá la parte más interesante y más importante para que las cosas funcionen bien sería la expresión, la expresión viene a ser una condición o una especie de filtro que nos dice que es lo que tiene que pasar para que esta regla sea activa, ¿ok? Dentro de la condición o de la expresión se pueden utilizar variables que están preconfiguradas por ejemplo la fecha de registro variables que uno configura y también funciones que son operaciones matemáticas o lógicas que nos dan un resultado de la condición o de expresión debe ser siempre verdadero o falso y si el resultado y dependiendo de lo que uno le indica normalmente estamos partiendo de la base de que es verdadero va a haber una acción basada en esa regla Tenemos unas cuantas tipos de acciones diferentes que pueden utilizarse no voy a ir en detalle por cada una porque eso lo pueden investigar un poquito a ustedes pero vamos a leerlas por encima nada más, asignar valor le otorga un valor a un elemento de datos o a una variable o a un atributo desplegar ya de valor lo que hace es lo mismo pero lo que nos da primero un título y luego el valor, ¿verdad? y el texto es igual pero tiene una llave, ¿verdad? se pueden también utilizar para enviar utilizar el servicio de mensajería de SMS o de correo electrónico poder un error completar, ocultar campos, ocultar opciones ocultar una etapa completa o una sección puede hacer un campo obligatorio podemos programar un mensaje que será luego enviado puede mostrar un error y la diferencia entre un error y una advertencia es que un error no nos deja completar un registro, ¿verdad? nos puede mostrar un grupo de opciones ocultar un grupo de opciones mostrar una advertencia o una advertencia al completar la diferencia entre estas dos es que una advertencia al completar aparece solamente al final cuando uno ya está terminado entre los datos y la advertencia normal aparece o justo al lado del elemento de datos o en uno de los campos de mensaje que aparecen ahí y ahora no se preocupen si esto los entreviera un poco porque ahora las vamos a ver juntos es importante que las acciones que ocultan elementos de datos el valor capturado cuando un elemento de datos se oculta el valor esté eliminado pero cuando ocultamos una sección entera los datos capturados en los elementos de datos no son eliminados pero quedan ahí para utilizar una regla de datos no puede poner directamente un elemento de datos sino que uno tiene que crear una variable para las reglas del programa y esa variable apunte hacia un elemento de datos con un poco más de información acerca de cómo lo estamos leyendo a ese elemento de datos o a ese atributo también puede utilizarse para hacer valores calculados y eso lo vamos a hacer hoy un par de veces también la idea es que por ejemplo uno puede crear una variable que sea la suma de por ejemplo la versión más fácil es la edad porque uno puede crear si bien hay un atributo llamado edad para que aparezca un cálculo de la edad ahí uno lo que debería hacer es asignar una operación que cuente los años desde la fecha de nacimiento hasta la fecha actual o la fecha registro dependiendo de qué tipo de edad sea necesaria y luego eso apunte a una variable calculada uno puede también configurar el origen y de dónde se está tomando el dato por ejemplo uno puede elegir un elemento de datos del evento más nuevo de una etapa puede ser el elemento del evento más nuevo en total sin importar qué etapa es puede ser un elemento del evento actual o del evento anterior basado en la fecha y no en el tipo de evento muy importante este cuadrito aquí que se llama use code for option set o utilizar el código para el set de opciones y eso es lo que hace es la diferencia entre utilizar el nombre de una opción o sea lo que se ve en pantalla en tracker o el código que se le puso cuando estaba configurando el set de opciones algunas recomendaciones pues utilizar nomes claros y evitar símbolos para las variables si el valor es una opción o sea si el valor que uno está representando tiene opciones o set de opciones consideran utilizar el código de la opción pero hay algunas veces en las que esto no debe hacerse ya les voy a mostrar un ejemplo luego y al evaluar al evaluar un dato hay que evaluar si la palabra tiene valor o no entonces si no hay un valor eso también cuenta como falso o sea tenemos si, verdadero está ahí, hay un valor no falso porque no está pero también está el nulo falso y se confortan de manera idéntica luego les voy a mostrar un poquito también que si uno quisiera revisar el resultado de ver cómo las reglas están siendo aplicadas a problema a ustedes pueden utilizar la consola del explorador y agregar esto que dice aquí o sea, e-verbose al final de la dirección web ahora se los voy a mostrar también pero esto lo que hace es que nos da un poco más información de cómo están corriéndose las reglas y luego dentro de si ustedes están utilizando Chrome que es lo que les recomiendo pueden usar el menú que se dice more tools o más herramientas y luego un menú que se llama developer tool o herramientas de desarrollo creo que es en español y ahí les va a aparecer todo el proceso de las reglas y lo vamos a ver también enseguida hoy como la tarea de ustedes va a ser muy personal basada en el tipo de programa que ustedes tienen entonces lo que lo que yo quisiera mostrar lo que quisiera pedirles es que me den cuatro reglas de programa que ustedes configuren una muy fácil por ejemplo es esta ocultar las preguntas del embarazo de acorrer al sexo y la edad ok la otra sería ocultar elementos de datos de la sección, de las opciones por ejemplo si el test no ha sido tomado ahí se puede ocultar pero esto no tiene por qué ser eso eso depende un poco de cómo hayan configurado el programa de ustedes la idea es que elementos sean ocultos basados en algún valor que tengan ustedes allí ok luego una tercera, calcular la edad demostrarla en elemento de datos o en atributos o en las etapas idealmente también en las etapas porque eso ayuda un montón y también llevar un valor de una etapa a otra y ahí recomiendo si usar el resultado el test porque es bastante estándar ok bueno si me imagino que hay un montón de cosas aquí que tienen preguntas quizá vamos mejor vamos a hacer y vamos a hacer las reglas de alguna y luego me van preguntando a medida que que vamos haciéndolas ok muy bien un segundo vamos a ver y agradezco por favor que los comentarios de preguntas vayan poniéndolas nomás en el chat y las vamos a ir haciendo ok, entonces aquí estamos vamos a limpiar el caché ya que estamos porque esto lo tenemos que hacer muchas veces a la hora de esta sesión y vamos a ir directamente a tracker siempre cargo un poquito más en cargar cuando uno acaba de limpiar el caché entonces ahí es cuando aprovechamos a tomar café, muy bien aquí tengo mi programa de malaria como lo ven es un programa bastante sencillito vamos a registrar la persona mmm fecha de nacimiento por ahí no los cuarenta años debe tener cambia no tengo ni idea estatura en centímetro no sé, medio petizones vamos a ponerle uno ochenta y uno uno setenta y cuatro ahí está bien año, eso porque está ahí, eso tendríamos que calcularlo no entonces eso es claro que lo que vamos a hacer luego eso tendría que pasar automáticamente por eso lo vamos a calcular luego luego lo he cambiado mi programa se si recuerdan que antes tenía una etapa específica para test y otra para el tratamiento las he puesto las dos en la misma hora el día de hoy no le agrega, no le ha agregado elementos al de embarazo lo voy a hacer ahora mismo pero de cualquier manera este señor es un hombre y no debería poder quedarse embarazado así que lo tendríamos que pues eliminar esto ¿Verdad? aquí tenemos enseguida una casilla que se llama prueba no hecha y cuando le doy aquí esto tendría que no estar aquí porque si no está hecha no vamos a tener tipo de test ni resultados tampoco ¿Verdad? aquí el tratamiento ¿Verdad? cuando le damos a otro o sea esto otra específica no tendría que estar ahí cuando no hay valor en otro lo tendríamos que ocultar también ¿Verdad? y luego resultado aquí el resultado es interesante pero sería bueno saber porque quizá el test y el resultado o el diagnóstico son distintas personas y no tendría que estar yendo para adelante y para atrás ¿Verdad? entonces sería interesante que el valor del resultado de la prueba de sangre nos aparezca aquí o que nos aparezca aquí en el panel indicador y creo que esas son las reglas que vamos a hacer ahora a mí vamos a comenzar entonces vamos a mantenimiento vamos a program route y lo primero que vamos a hacer es calcular la edad ¿Verdad? lo bueno es que las reglas de programa uno puede filtrarlas directamente por ejemplo aquí esto es una regla que la hice más que nada de forma estética una de las etapas que la borré no me la está dejando borrar entonces lo que hice le puse true en vez de borrar la etapa completa simplemente la estoy escondiendo ahora si le ponemos a una condición true lo que hace es que esa regla siempre se va a siempre nos va a dar verdadera entonces las acciones van a estar siempre activas ok ahora para calcular la edad lo primero que vamos a hacer es vamos a identificar la edad entonces vamos a program route variables vamos al sino de más entonces vamos a elegir una variable le vamos a poner edad a la variable no vamos a usar el código para el option set porque no tiene option set y vamos a decir que esto es un atributo es uno de los atributos y elegimos el atributo edad listo y ahora lo que vamos a hacer también es vear otro que se llame edad variable ok y esto lo que va a hacer no vamos a apuntar esto a un atributo sino que lo vamos a apuntar vamos a hacer un valor calculado vamos a dejar de elegir más verdad el edad variable es un valor calculado entonces vamos a hacer una reglita muy sencilla la vamos a dejar que esta regla funcione para todos las etapas el nombre es esta regla va a ser a signal va a ser calcular edad la descripción la voy a poner calcula la edad y la asigna a la variable edad variable ok vamos a darle prioridad a poner 10 normalmente 1 o 10 da igual da igual el número que nos ponga yo le pongo 10 en vez de 1 y 20 en vez de 2 más que nada porque así no da un poco de flexibilidad hay que poner cosas en el medio y es más fácil no tener que andar cambiando pero ponerle 1 funciona igual va a haber entonces la condición para que esta regla funcione tendría que ser que la fecha de nacimiento tenga algún tipo hoy importante miren aquí estamos hablando de la edad pero no es eso lo que estoy calculando lo que tendría que estar calculando aquí es la fecha de nacimiento perdón entonces ahí esta la variable, la primer valende que está apuntando la fecha de nacimiento no la edad porque lo que queremos hacer es verificar que la fecha de nacimiento tenga valor la edad la descripción calcula la edad y asigna a la variable ok, entonces lo primero que vamos a hacer para calcular la condición para que la edad se calcula tiene que ser que exista una fecha de nacimiento entonces lo que vamos a hacer aquí a la derecha como pueden ver pueden elegir las builtin variables o variables preconfiguridad son por ejemplo la fecha actual la fecha del evento el código la unidad organizativa vamos a usar las variables configuradas que son la fecha de nacimiento luego aquí debajo tienen las funciones y las funciones son distintos tipos de cálculos o funciones lógicas que pueden hacer hay un montón de distintas que pueden verles en la documentación como funcionan pero hoy vamos a usar una muy sencilla que se llama hasValue que está aquí entonces lo que hace esta función es que verifica si algo si una variable tiene valor entonces aquí la variable es fecha de nacimiento y la voy a poner aquí dentro entre comillas sencilla entonces lo que nos está diciendo este filtro es tiene valor el atributo fecha de nacimiento si es correcto esto si es verdadera esa expresión vamos a hacer la relacción asignar valor ok entonces dentro de la acción lo primero que uno elige es cuál acción va a ser y en este caso va a ser asignar valor y ahí puede uno elegir si lo vamos a asignar valor a un elemento de datos y ahí puede uno elegir cualquier elemento de datos posible dentro del programa obviamente o si se lo vamos a asignar directamente a una variable a un atributo técnicamente uno podría asignárselo directamente a la variable edad pero es más elegante asignárselo a una program variable o una variable en este caso la variable edad y la expresión aquí o sea cuál valor se le va a asignar porque el valor que tiene la fecha de nacimiento es simplemente una fecha entonces ahí tenemos que usar nuestras funciones y tenemos algunas cuántas funciones que podrían ser uno podría directamente hacer toda la operación pero lo más relevante aquí sería esta que se llama years between o años entre fecha y fecha en este caso la primera fecha que vamos a hacer es la fecha de nacimiento entonces ahí lo que podemos hacer es usar la variable que ya tenemos llamada fecha de nacimiento entonces años entre fecha de nacimiento y ahí depende un poquito de la configuración porque cuando nos calcula la edad cuál edad estamos calculando vamos a calcular aquí en este caso pues tenemos un par de opciones podríamos por ejemplo utilizar la fecha en la que la persona sea registrado entonces nos da la edad en el momento de registro ¿no? y creo que lo vamos a usar así esta vez si decimos que la edad sea siempre correcta por ejemplo si estamos hablando de un programa de VIH donde la persona va a estar en tratamiento por muchos años quizá sería más conveniente en vez de utilizar la fecha de registro en roman date utilizar la fecha actual ¿verdad? entonces es importante decidir y estar bien claro como una persona lo quiera hacer en este caso utilizar la fecha de registro pero cualquier las dos son cualquier las dos podrían ser correctas dependiendo del uso de cazor entonces ahora lo que hace esta regla es asignar el valor este aquí o sea la cantidad de años entre la fecha de nacimiento y la fecha de registro a la variable que se llama edad ¿verdad? entonces esa es la primera parte de nuestra regla y ahora vamos a hacer una segunda regla que se llama asignar valor asignar edad atributo edad la cuestión que le voy a poner es asignar el valor de la variable y le vamos a poner prioridad 20 y lo importante aquí es que la prioridad sea después de la otra o sea que primera o al cálculo es el valor ¿verdad? porque si así es el valor antes de hacer el cálculo pues no asina nada entonces la primera condición una vez más es que la fecha de nacimiento tenga valor entonces variable fecha de nacimiento se lo ponemos acá entre comillas sencillas ¿tiene valor la fecha de nacimiento? si, entonces que vamos a hacer vamos a asignarle valor al atributo edad y ¿qué valor le vamos a asignar? pues la variable que le acabamos de poner edad variable ¿verdad? la variable de edad se le asigna a edad bueno, llegó la hora de la verdad vamos a ver si esto nos está funcionando limpiamos el caché todos limpiar y les voy a decir que hay muchas veces que hay problemas con el caché a la hora de hacer las reglas de programa ¿verdad? entonces verifiquen que está funcionando y verifiquen que está todo en orden vamos a ver no veo preguntas en el chat o sea que va clarito parece vamos acá vamos a Sergio estamos en el perfil oye, mira no me está funcionando para atrás a ver si qué pasa si registramos una nueva persona no, se está asignando ¿qué está pasando ahí? algo he hecho mal voy a ver el verbose este para ver qué te da exactamente cuando algo no funciona vamos a hacer lo que les mostré escribimos ampersand verbose y abrimos aquí en donde está more tools developer tools entonces le damos el verbose no nos anda muy bien aquí parece por ser no veo las herramientas de desarrollo por eso entonces le damos verbose y ahí nos aparecen todas las reglas de programa y aquí nos aparecí que la regla de programas si funcionó bien verdad la pantalla no se ve no la ve la pantalla ah perdón la tienes en otro monitor si la tengo todo el mismo pero está compartiendo solamente el browser y no todo ahora sí ahora si me la ven todavía no vamos a parar ya la ves ok genial bueno vamos a ver entonces ahí tenemos las program rules que pasó nos aparece nos dice la regla tal ha corrido con éxito la acondición original era que tenga valor fecha de nacimiento y la evaluación de si tiene valor es verdadera verdad entonces la siguiente lo mismo entonces entonces la siguiente aquí también lo mismo verdad entonces resulta la evaluación 74 pobre cabane entonces tendría que funcionar pero como dije ya le hace un comentario en el chat a ver dice yo signela la calculada un detalle en la configuración no yo creo bueno ya le pregunta que si hay problema osea pensé que había hecho la solución y le funcionó no se si le funcionó pero ella dice que así no le da calculada al elemento de datos se da directamente yo creo que eso no hay ningún problema duro no debería funcionar también no se si le funcionó debería funcionar también si si si osea normalmente lo hago así porque asi se puede utilizar la edad para otras cosas y ya tiene la variable lista una hora pero no se porque no nos aparece aquí eso ya es un problema problema de prioridad tal vez que hace dos cosas al tiempo y no alcanza a signarla vamos a ver en una de esas me olvide de poner la prioridad que eso suele suceder porque las dos reglas están corriendo y las dos reglas están funcionando asi que vamos a ver primera es calcular la edad y mira no tiene prioridad yo pensé que le había puesto pero luego parece que me había olvidado de ponerla pero si cuando no tienen prioridad van a lasar entonces probable que no haya edad y luego esto esta correcto como ya lo vimos vamos a guardar ahora vamos a ver verificar que esto este correcto también prioridadmente eso esta ahí, esta bien y esto lo estamos y lo que estamos haciendo es la variable a el atributo perfecto guardamos limpiamos el caché tomamos café vamos a tracker es mas incluso a veces lo que hago es que lo agrego pongo dos acciones, una que se la asigne al elemento de datos y otra que la asigne a la variable si son independientes y no y no son necesarias osea que no hay ningún problema que lo hayas hecho de esa forma ah esta, era eso, era la prioridad que me había olvidado ponerla en la primera entonces ya tenemos una una regla lista y ya una cosa menos de que preocuparse verdad la siguiente es que no lo podemos dejar que se embarace Kavani porque si no ahi si que no nos va a rendir nunca entonces vamos a tener que darle una regla ahí pero primero vamos a asignar ese elemento de datos no lo tenia asignado ahí si es un elemento si no que haces tu ah esta me embarazo elemento sencillo y lo ponemos ahí ahora que vamos a hacer vamos a hacer la program rule vamos a crear una variable que seria la variable del sexo sexo vamos a utilizar el código para el set de opciones porque asi sabemos exactamente que va a ser y vamos a utilizar un atributo y el atributo va a ser sexo verdad hacemos aquí una regla de programas muy sencillita vamos a hacer que solamente se dispare para este tratamiento porque es en la única que la que aparece el elemento de embarazo el nombre si es mas pero una prioridad porque hay otra no esta interactuando con otras reglas pero vamos a ponerla si hay dos reglas que tienen la misma prioridad tambien la ejecución es al azar asi que cuidado con eso la expresión en este caso va a ser si sexo es el código era masculino y ahora vamos a ver si son ordenados y tienen todos los elementos de datos que están utilizando todos los codios de opciones en una planilla es mirar en la planilla directamente pero no lo tengo yo aquí porque no he sido super ordenado para este programa en especifico porque lo hicimos a la tida entonces sexo está utilizando el 00 porque reciclé esto aquí y muy bien ah mira el código esta en ingles entonces en este caso el código es MEO bien verificarlo eso entonces la acción aquí seria ocultar toda la sección la sección seria datos de embarazo ok entonces vamos a limpiar el caché sección de ortodos todos los procedimientos ya me quedé sin café asi que ya no puedo tomar café mientras esto carga primera primera regla es mucho café vamos a ver no esta ahí el embarazo porque es un hombre ahora vamos a serificar vamos a cambiar el sexo de esta persona que pasa si lo conozco como femenino vamos a ver ah esta ahí aparecen los datos de embarazo entonces ya sabemos que esa regla sencilla funciona basada en un atributo especifico y ocultar eso ahí a ver la siguiente regla es que no se si ustedes han visto pero dentro del test de malaria dentro del diseño de este programa de malaria si vamos a ver un poquito más grande nos dice aquí que el diagnóstico estos tres tipos de valores solamente desaparecen si el tipo de test que se ha hecho es un rdt pero si uno se resulta positivo es a través de microscopía los resultados son estos entonces en mi configuración si no tienen una configuración similar no tienen por qué hacer la verdad pero en mi configuración tengo todos los resultados en un mismo elemento de datos y luego el tipo de test aquí entonces lo que vamos a hacer es que si una persona selecciona rdt los únicos resultados que deben aparecer serían estos tres más estos tres y aquí como vemos algunos que son iguales entonces la única diferencia sería que no se me caía el micrófono no debería aparecer pivivax ni pmalariae ni otra especie esos tres no deberían aparecer si el resultado es positivo con el rdt entonces lo que vamos a hacer es vamos a ir entonces mantenimiento vamos a crear una variable para el tipo de test ¿Verdad? y esta vez vamos a utilizar el código para el set de opciones ¿Verdad? otra vez y vamos a utilizar un data elemento en el elemento de datos en el evento actual sea el elemento en el que estamos y el elemento de datos en este caso es uno que se llama tipo de test lo voy a guardar y vamos a hacer una regla de programa aquí que se llame si el test es rdt ocultar valores innecesarios valores y eran vivax, malariae y otra la expresión sería más aquí si tiene valor el tipo de test y cuando quedamos poner y ponemos doble así todo esto está aquí debajo también si le das a and te parece ahí doble para ayudarte un poquito y si tipo de test es rdt perdón, en mi caso el código que le puse era nrrdt si estoy correcto entonces la acción que vamos a hacer va a ser ocultar opción del elemento de datos resultado de la prueba de sangre como se llama en mi caso y la opción que vamos a ocultar eran vivax vamos a ocultar malariae también vamos a ocultar vamos a ver si esto está funcionando vamos a hacer cache seleccionamos todos tracker y eso nos va a ayudar también a que la gente no seleccione un error en esta configuración y yo no sé como lo han registrado ustedes pero de cualquier manera no importa la idea que tenga alguna regla eso que oculte alguna cosa de esto para demostrar que han entendido como funciona ahora vamos a nr malaria y vamos a ver este tratamiento si no tenemos nada elegido pues están todas las opciones si elegimos microscopía están también todas las opciones y si elegimos rdt ahí tenemos menos opciones tenemos misto negativo no pfalsiparum y pfalsiparum entonces ya vemos que la regla está funcionando habría que hacer otra regla para ocultar esta opción que se llama no pfalsiparum que no aparece como una opción posible dentro de microscopía no lo vamos a hacer ahora porque así les muestro otras reglas en mes de esa pero eso tendríamos que hacer aquí para que para que esté del todo correcto entonces ya tenemos dos reglas ahí genial a ver cuál era la siguiente entonces ahora que le vamos a hacer es vamos a traer una variable de una etapa a la siguiente la idea aquí es que una vez seleccionado el resultado del tipo de sangre el resultado de la prueba de sangre podríamos ir al resultado y que nos aparezca aquí o que nos aparezca por aquí encima pues para ayudar un poquito al al trabajo que están haciendo vamos a ver vamos a ir de vuelta a mantenimiento y esto es un poquito más complicado pero no tanto tampoco hay que pensar un poquito más nada más o sea que lo más probable que le vaya a errar cuando lo esté haciendo y la tengo que hacer de nuevo es muy similar a la de la edad utilizando una variable vamos a ver vamos a filtrar aquí así vemos solamente los que he hecho ahora vamos a hacer una vez más dos variables una que sea el resultado del test pero esta vez nos vamos a usar el código de opciones ya van a ver por qué y vamos a usar en vez de usar el elemento en el evento actual vamos a usar un elemento de datos del evento más nuevo en el programa actual ok perdón el elemento más nuevo de una etapa de programa y esto variando un poco dependiendo de la configuración del programa si ustedes tienen una programa si esta fuese una etapa repetible y lo están pasando para otra etapa que no es la misma etapa quizá las cosas tienen que variar un poquito pero en este caso esto va a funcionar entonces el elemento de datos de la etapa más nueva de una etapa y en este caso va a ser la etapa test y tratamiento y el elemento de datos va a ser el resultado de la prueba de sangre ok y como dije esta vez no vamos a usar el código para el set de opciones ok vamos a hacer otra que va a ser una variable y en este caso si porque al estar llevando elementos de una etapa a otra si va a la pena utilizar una variable porque se comporta de una forma un poquito extraña a veces cuando estamos moviendo la información del elemento a otro y al tener una variable en el medio como que ayuda que vaya la información sin perdernar nada en el camino digamos la idea es que cuando uno utiliza además que ayuda un poco a la hora de utilizar esto en android verdad porque las reglas de programas la mayoría la idea es que la meta es tener que las reglas de programas funcionen igual en android y en pc, lamentablemente algunas que no funcionen exactamente igual por eso es importante utilizar una variable aquí entonces la se usa una nueva regla vamos a hacer el resultado variable y es un pues aquí vamos a hacer también ya tenemos dos reglas distintas, una que es el elemento de datos, otra es la variable calculada entonces lo que vamos a hacer ahora es hacer dos reglas que son muy similares a las de la edad para poder llevar ese valor de una de una etapa a otra entonces la primera regla vamos a hacer vamos a poner que sea una regla global no solamente para una etapa y le vamos a llamar asignar nombre del resultado también prioridad 10 y la condición en este caso es bastante sencilla simplemente vamos a ver que tenga algún valor de algún tipo entonces vamos a buscar la función es d2 as value y la variable en este caso vamos a hacer resultado el resultado de la prueba de sangre tiene valor en el evento más nuevo de una etapa de programa y luego vamos a hacer una acción aquí la acción lo que va a hacer es asignar valor no un elemento de datos no un atributo sino a una variable es resultado y que valor se le va a agregar muy sencillo, el valor que se le vamos a agregar es el mismo valor de la variable resultado que estamos en la onda ahora a mi y por esto es que no le he dado utilizar el código porque si le damos que utilice el código el valor que le asigna va a ser el código y no va a ser el valor que está ahí entonces ahora tenemos una variable que va a tener ese valor y lo que vamos a hacer entonces es asignar el valor de esa variable a el elemento de datos entonces esta solamente se utiliza para el la etapa resultado el nombre sería asignar valor al elemento de datos en etapa final le voy a poner que eso no es un nombre muy descriptivo o sea que me voy a perder puntos por ese nombre creo entonces pero en la descripción ahí ya lo puedo describir un poquito más entonces vamos a hacer la misma el mismo filtro anterior entonces tiene valor esta variable mía ahí de 14 si tiene valor entonces lo que vamos a hacer es asignar valor al elemento de datos de sangre resultado y el valor que vamos a agregar es resultado variable también lo que vamos a hacer es display key value pair o mostrar llave y valor y ahí podemos elegirse lo que tenemos en el feedback widget que está a la derecha normalmente o en el de los program indicators que está por encima vamos a poner el de program indicators en el resultado del de sangre ¿cuál es el resultado? pues lo que sea que nos dio esa variable ok le puse prioridad 20 a esto no, hay que poner prioridad 20 y ahí lo guardamos ok ahora que usamos los dedos veamos que hache tracker y entonces vemos que aquí tenemos la primera etapa donde tenemos a p falseparum que es el resultado de la prueba de sangre y vamos a ver aquí tenemos en el menú de indicadores nos aparece que el resultado del test de sangre es p falseparum y nos aparece que en los resultados de la prueba de sangre es p falseparum ¿verdad? entonces ahora les he demostrado unas cuantas reglas de programa que se pueden hacer para poder mejorar el programa que están utilizando quizá lo que no les he mostrado todavía es una una advertencia ¿verdad? bueno, ponerla quizá por ejemplo, vamos a hacer que si la persona está fallecida que aparece una advertencia que dice este fallecimiento debe registrarse en otro sitio ¿verdad? en el registro de fallecimiento por ejemplo ok vamos a hacer eso ok entonces tenemos que se llama resultados demasiados resultados tenemos creo que voy a cambiar los nombres de mi programa si no está bastante confuso de vuelta vamos a crear una variable para ese elemento programa nr nombre de la variable resultado final vamos a ponerle porque si no esto va a ser muy confuso el elemento de datos en el elemento actual utilizamos los códigos para asegurarnos de que lo tenemos correcto y bueno en este caso sería resultado el nombre de mi elemento de datos esto es un buen ejemplo de cómo no nombrar todos los elementos de datos para que las cosas sean confusas espero que ustedes tengan mejor nomenclatura para vuestros elementos y la vamos a guardar luego unirse a program rule y creamos una regla para mi programa que solamente se ejecute en la etapa de resultado que se llama si la persona fallecido mostrar advertencia entonces la inspección sería condición variable resultado final vamos a ver donde esta tiene valor resultado final y la acción de resultado final es perdón falta algo tiene valor resultado final y el valor de resultado final es que la persona ha muerto vamos a ver si la persona fallecido le ha puesto en el referido entonces la acción sería mostrar una advertencia recuerdan advertencia te deja completar error no te lo deja completar entonces la advertencia puede mostrarse al lado de un elemento de datos al lado de un atributo en el caso que sea necesario también utilizarlo en el resultado y el texto es que el texto estático que le vamos a poner es el fórmula de registro de fallecimientos por ejemplo eso pongo las dos primeras letras con mayúsculo no se porque vamos a guardar tenemos una regla ahí limpiamos el caché vamos a tracker vamos a ver una más la verdad si la persona ha fallecido por favor completar el fórmulario de registro de fallecimientos si la hemos recuperado no nos aparece ok muy bien ahora les he mostrado un montón de opciones distintas queremos que lo que tienen que hacer es 4 4 reglas que es lo que tendrían que entregar importante que nos muestren en la entrega las reglas en sí y que las reglas les está funcionando también dentro del programa verdad pero tenemos bastante tiempo todavía así que lo que quisiera es contestar algunas preguntas o si quieren que repita algo o que expliquemos algo más tenemos a marco aquí también que tiene mucha más experiencia que yo incluso en trabajando con las reglas del programa así que por favor díganme algo algún comentario en Slack, quizá marco no, en su revisado el chat y no hay comentarios y tampoco en el chat ni en Slack a ver por aquí ah, tenemos dos opciones o entendieron todo o no entendieron nada entonces vamos a ver ¿cuál será? ah, genial en mi proyecto en el canal de mi proyecto dice que hay muchas versiones nuevas al momento de hacer la condición de una program rule se podría incluir un buscador cuando uno va a seleccionar una variable de regla de programas ya que para programas grandes que contienen muchas variables eso ayudaría mucho ah, pues sí, es una sugerencia muy muy importante yo se la he dicho de forma informal a los developers pero no sé si habrá un Gira para eso en algún sitio no sé si lo saben pero tienen la opción de utilizar la comunidad la community of practice en español para poner comentarios de ese tipo y también tenemos un Gira que es donde se van agregando este tipo de cosas los otros obviamente la vamos a canalizar pero mientras más ruido hay de la comunidad más fácil es que los developers le pongan prioridad a eso ¿verdad? pero sí, de acuerdo ese modo lo ha ido mejorando porque antes en versiones anteriores por ejemplo las funciones no estaban disponibles para la búsqueda entonces tenía uno que ir a la documentación y decía bueno yo quiero hacer por ejemplo la diferencia entre los fechas ¿será que hay alguna función que haga esto? ibas, mirabas buscabas y algunas decían esta todavía está en desarrollo todavía no se va a hacer pero no existe pero ahora ya vemos que hay muchas más funciones y se pueden seleccionar pero está buena la idea de Johnny sí, muy bien por supuesto, la verdad es que cuando uno tiene 400 variables en una instancia están todos ahí es bastante bastante irritante tener que ir de a poquito buscándolas ahora muy bien, alguna otra pregunta hay algo que quisieran que les muestre nuevamente o algún otro tipo de regla les gustaría ver cómo se hace ¿qué te parece a ti Marco? hay alguna regla que tú quisieras que revisemos un poquito o que te parece quizá no quedo el todo explicado no eso, creo que bueno les de ocultar y mostraría información son más sencillas, ya hiciste diferencia de fechas creación de indicadores o mostrar información de indicadores y asignar valor, creo que ahí estamos bien genial, esas son las reglas más utilizadas diría yo dentro de todo pero por ejemplo una cosa que podrían hacer es que pasa si la persona si el paciente es un niño un niño de menos de un año poner la edad en años no sería interesante entonces ahí ya habría que hacer una regla que verifique si la persona tiene menos de un año utilizar otro tipo de regla que en vez de contar los años cuente los meses o sea pueden ser hacerse reglas bastante complicadas y bastante complejas dentro de todo esto también se pueden hacer reglas que en este caso por ejemplo sabemos que una de las limitaciones para hacer indicadores que la información estén distintas etapas entonces por eso es importante esto de traer reglas de una etapa a otra así que bueno no sé si habría algo más que podría mostrarles hum pensando ver William hace días me pidió una difícil que no la encontré pero te voy a ver no sé si está William por ahí a pronto tú sabes te recuerdo en el chat algo por ahí me pedían William, déjame ya miro ah, adelante, adelante, adelante ahora me va a dar una súper difícil que no voy a saber hacer yo pero bueno espero que vayan probándolas quizás algunos de ustedes mientras están probando le sale algún ejemplo que no queda bien por las dudas lo que he ido haciendo es que he ido sacando capturas de pantalla a las reglas que he hecho entonces si quieren se las puedo pasar mira era hacer un conteo de un elemento de datos de fechas por ejemplo o sea que pudiera agrupar las fechas pero yo le decía bueno alguna vez por error yo recuerdo que cuando sacaba el reporte y eran varias fechas entonces lo volví al loco porque el trataba de agrupar o sea un tipo de o sea voy a generar un reporte de tipo de eventos y le decía y lo dejaba en la primera opción que la agrupa por fechas y el trataba de agrupar pero se demoraba muchísimo porque si tienes todos los días del año y quieres mirar los eventos que ocurrieron cada día el se demoraba muchísimo haciendo eso y era un error y creo que lo corrigieron y ya no puedes generar en esas tablas en esos reportes ese tipo de conteos por fechas entonces se me ocurrió que podría ser uno un contador de eventos por fecha pero no puede en realidad no se creo que es un caso muy difícil no se si aquí esta un contador de eventos por fecha no entendí bien el uso de caso la verdad pero si tu quieres saber día a día cuantos eventos ocurrieron ah contar todos los eventos ok por ejemplo aquí no es un contador de eventos o si podría ser y luego agregarlos ese tipo de reportes si podría ser si se podría hacer o se podría tener un elemento de datos y luego hacer un un reporte de eventos que suma esos esos elementos si uno pone la lógica de cuantos se cuenta cuando no pero aquí han venido un par de preguntas una pregunta de Johnny nos dice se puede hacer una regla en la que un elemento de datos de tipo texto se pueda asignar la unidad organizativa que uno seleccionó o sea cuando uno dice seleccionó quieres decir Johnny la unidad organizativa en la que se está resignando el evento o una unidad organizativa en general porque si tenemos un tipo de valor dentro de los elementos de datos que se llama unidad organizativa si entonces un tipo de valor en vez de número uno puede poner unidad organizativa y eso lo que hace es que aparece todo el organigrama de las unidades organizativas y uno las puede seleccionar ahí directamente entonces si uno va a las reglas de programa vamos a crear una regla nueva nr si uno va a las expresiones uno dentro de las funciones no creo que haya uno que que asignar pero que asigne la unidad organizativa ok solo entonces aquí lo que hay es tenemos una de las funciones que se llama inorgunit group y dentro las builtin variables tenemos inorgunit code ahí está ahora no sé exacta nunca he cruzado estas dos vamos a pensar un poquito inorgunit group code vamos a venir aquí de las variables y las reglas que están soportadas sería crear un elemento de datos en eso que se llame orgunit y tratar de hacerle que enviese orgunit code pero creo que va a enviar ese código no? no creo que es porque esta es el group no es el la verdad es que no sé exactamente me decías que el usuario final tengo que quitar nuevamente la unidad organizativa en elemento de datos que se pueda asignar automáticamente ok si si si vamos a ver pero este es el código nada más tendría que pensarlo un poquito la verdad porque no creo que tengamos no sé exactamente como funciona este orgunit code variable pero vamos a ver aquí contains the code orgunit that is linked to the current enrollment for single event programs the code from the current event orgunit will be used ok entonces ok entonces entonces lo que podríamos hacer sería vamos a ver vamos a intentarlo porque esto va a pasar siempre la verdad lo que quiere aquí Johnny es que cada vez que una persona está ahí que seleccione entonces lo que tendríamos que tener es primero un elemento de datos que se llame nr orgunit vamos a ver mi niño arrastreador de valor de organizativa y vamos a ver si esto funciona o no porque igual no funciona vamos a guardar entonces vamos a hacer una nueva regla mi programa se perdón porque mi programa te ya no la tiene esa regla hay que agregarla vamos a ver test y tratamiento se lo vamos a poner ahí no más no es uno equivocado está el que puse equivocado está ese no vai luego en la data entry form se le va a poner aquí mismo ok más que nada para ver si esto no funciona ok guardamos hacemos la regla esta nr estaré tratamiento nombre asignar orgunit y vamos a ver si esto funciona o no porque puede ser que no funcione ahora ya estamos experimentando así que si bueno y eso como dice Johnny hay mucho el contexto cierto porque puede ser que cuando uno conoce todo el contexto el problema puede encontrar la solución no directamente desde program rule sino de otra manera también porque la información acerca de la orgunit está dentro dentro de aquí porque es parte de cada elemento puede ser incluso que uno aquí uno lo ve directamente la unidad organizativa en la que está escrito entonces no sé qué tan necesario sería no mira no lo que hace es que no nos deja asignar y los reportes también está la orgunit entonces exactamente mirarlo en el programa porque están la persona registrando pero de cualquier manera me parece que es interesante ver si si esto pudiese funcionar o no es un elemento de datos salveldo asigné pero no de tipo orgunit sino texto eso mismo porque ahí lo que vas a poner ahí lo que es como es orgunit le mandes el uid y de pronto ya lo selecciona estaba muy bien pensado pero no funciona no funciona pero vamos a ver porque en una de esas si cambiamos el tipo de elemento de datos si funciona tipo de valor vamos a darle texto y si no funciona pues no funciona tenemos el uid exacto bueno después lo que se hace es que se ponen todas las orgunit y se hace una regla muy muy grandota donde diga si es esta uid entonces este otro pero le vamos a no hacerlo me parece un poquito me parece osea no veo una razón muy buena para hacerla pero bueno ahí veo otra pregunta de libardo nos dice en el caso que quiera hacer una regla que me muestra el municipio según el departamento debo hacerlo uno por uno o pueden usar los catalogos con llave, valor o algo buena pregunta no ahí esta eso es la respuesta para el libardo, claro es un poco osea cuando vas a hacer precisamente para eso esta ese tipo de unión organizativa porque cuando ese tipo de elemento de datos, lastima que ya el solo cambió ahí cuando tu vas a ir, bueno no se donde esta el libardo pero digamos que estas en en Honduras creo que se llama el departamento osea y tienes que escogerte gusigalpa por ejemplo cierto como municipio entonces tienes que osea cuando te aparece ese cuando asignamos unión organizativa ahí ya no es necesario tener una llave de departamento y municipio sino que simplemente vas y tienes que ir en el árbol y escoger Francisco Morazán creo que se llama sino el departamento luego busca este gusigalpa y a ella estarías yendo en el árbol directamente hasta el municipio final y no necesitas buscar departamento y luego municipio sino que vas directamente al árbol hasta el nivel inferior pues también tiene la herramienta de búsqueda para que no tengas que estar desplazando de todo el árbol y simplemente buscas gusigalpa y ya el te pone gusigalpa eso seria el dato, claro osea que pasa si hay dos gusigalpas en el país a ellas ya tendrías que mirar en el UID y luego en el reporte poner que te muestra la jerarquía para saber a cual de los dos es el que estas yendo o que estas en colombia por ejemplo acá hay la unión valla la unión narinio en diferentes departamentos tú buscas la unión entonces ahí ya te va a aparecer la unión valla y el unión narinio tú en el árbol buscas y lo asignas pero luego digamos cuando vas a hacer un reporte necesitas saber de cual de las dos uniones era unión narinio, entonces a ellas tendrías que ir por el UID o buscar una manera de mostrar todas las jerarquías pero ese elemento de datos de tipo org unit te permite hacer ese tipo de buscas sin necesidad de tener departamento y municipio por ejemplo exactamente ahora último intento para esto del org unit a ver si funciona o no pues lo anotamos como nuestra tarea mira no nos quiere asignar el mismo valor entonces eso es algo que tenemos que investigar nosotros también normalmente hay un montón de reglas un montón de tipo de reglas que yo nunca he usado la verdad entonces cada vez que aparece un problema es aprender y investigar un poquito creo que es un poco así con todos ¿verdad Marco? sí, sí y resulta que a veces nosotros tenemos conocimiento de que salen las nuevas versiones y como dicen en su practicamos algunas reglas pero hay usuarios muy avanzados que conocen otras otras maneras de hacer las cosas, otras reglas estudian todo lo que salen las nuevas versiones lo prueban, entonces hay gente que realmente sabe bastante y esto se aprende es practicando exactamente bueno, pero si no hay si está todo claro y si más o menos tienen pensado lo que van a hacer pues pues entonces me parece bastante lo podemos dejar por aquí ahí William pone otro caso mirad mostrar la regla en una regla de programar el registro yo no sé si existe la persona que creó el registro si lo tenemos en las variables en esta nueva versión esto es una ventaja porque estamos probando sobre la 2.35 y puede ser que esto que están preguntando ya ya está ya puede estar esa variable cuál era el de la persona que ingresó el registro no sé si está ahí en los variables del sistema pues la verdad que estoy mirando ahora en la documentación a ver si aparece pero en las cómo se llaman variable systems ahí está, creo el sistema exacto, mira ahí están las estándar el enad environment pues no me aparece pero por ejemplo como es lo que les decía ahora, conociendo ese contexto yo por ejemplo hice un reporte con un llamado a la API que me muestra los datos de la persona, o sea, puedo sacar un informe por ejemplo de la cantidad de capturas que hizo un usuario entonces y también hice otro para otro VNG que permite saber cuál fue el último usuario que muyificó un registro, entonces ellos por ejemplo tenían una fecha de cierre y resulta que hay modificaciones después de que hacían los cierres entonces necesitaban sacar un reporte de cuáles fueron las modificaciones después de los cierres, entonces yo sabía quién lo había modificado y en qué fecha y cuántas modificaciones todo eso lo puedo obtener por ejemplo a través de la API entonces uno conociendo un poco el contexto puede digamos darle soluciones a ese tipo de problemas en los eventos sí, ahí lo tengo William por ahí te lo puedo mostrar y cuando quieras una llamada y te muestro el reporte a ver si es para un tema de auditoría o te puedes servir también hay a ver dice qué por la regla de usuario listo de los eventos, sí claro en los eventos sale todo, sobre todo en eventos es más sencillo porque para agregados es un poco más complejo en las herramientas analíticas yo en realidad hice el reporte exacto que hice que era generar el sí hacer ese tipo de reporte como realmente lo necesitaba el usuario pero digamos que en el evento está la información general de quién creó el evento y quién lo modificó entonces es fácil no sé si en esta nueva versión el problema por ejemplo en agregados es que en agregados no tienes algo que encapsule todo el evento agregado entonces tendrías que ir como elemento de datos por elemento de datos y verificar quién fue el último que hizo la modificación asociada a ese programa es algo mucho más complejo pero con eventos y trackers es sencillo muy bien entonces última oportunidad para preguntar algo entonces que podamos decirles acerca de las reglas de programa como saben si son usos muy avanzados siempre pueden utilizar la comunidad de práctica y poner las preguntas ahí y si no podemos nosotros podemos pasársela a alguien más que sepa un poquito más si no saben dónde está esto las vamos a mostrar tenemos la community of practice si le ponen inglés tienen mucho más respuesta si le ponen español por lo menos tenemos igual un equipo bastante grande y de habla hispana dentro de nuestro foro puede venir aquí comunidad de habla hispana y aquí pueden poner sus preguntas comentarios, ideas o simplemente compartir algo interesante que han hecho y que quieren que lo veamos porque así mientras más compartamos más vemos cómo se está usando el sistema más podemos aprender entre nosotros y seguir adelante así que obviamente los invito que utilicen nuestro foro para preguntar cosas también después de la academia porque porque seguramente ahora está todo claro pero de aquí a dos años capaz van a tener que hacer una regla y dicen uy esto cómo era y de esa manera por lo menos tienen un lugar en donde preguntar les voy a poner el link aquí en el chat por si acaso muy bien entonces los vamos a dejar que hagan ese ejercicio recuerden tienen Slack para preguntarnos o poner fotos de lo que están haciendo por si acaso algo les está faltando y bueno a no ser que Marco tengas algo más para agregar creo que lo dejamos aquí por hoy ¿verdad? si, recuerden eso por hoy está bien mañana tendríamos que expongo yo el tema de notificaciones y leyendas que también es bien interesante y bien bonito para aprender nuevas funcionalidades el sistema está interesante también genial entonces muy bien nos veremos mañana que pasen muy bien el resto del día y bueno cualquier duda que tenga o cualquier comentario lo ponen en el canal de Slack bueno nos vemos, chau chau