¿Alguna vez has sentido esa sensación de vértigo al enfrentarte a miles de páginas de jurisprudencia, normas, leyes entre otros, buscando encontrar la joya entre el desorden?
Imagínate tener un superpoder que te permite filtrar rápidamente el ruido y descubrir exactamente lo que necesitas saber, sin perder tiempo en lo irrelevante. Este poder existe, y su nombre es Docassemble, un sistema experto de ensamblaje de documentos que transforma la forma en que interactuamos con la información judicial.
Pero ¿cómo funciona realmente este misterioso superpoder? Y más importante aún, ¿cómo puedes incorporarlo en tus proyectos de software para mejorar significativamente tus prácticas de programación?
Atraviesa este viaje conmigo mientras exploramos juntos el fascinante mundo de Docassemble, descubriendo cómo sus características avanzadas pueden revolucionar la forma en que abordamos el desarrollo de software y ámbito jurídico.
Conceptos basicos
Docassemble es un sistema experto de ensamblaje de documentos basado en Python, YAML y Markdown, hace las veces de un lenguaje de programacion declarativo (no se le dice que hacer sino el como).
El orden de las preguntas no se determina, lo elige el sistema segun sus necesidades y las respuestas dadas en la entrevistas ya que se trata de un sistema basado en reglas, leyes o normas y lo que se sigue es mas similar a una lista de chequeo, asi como cuando un piloto de avion hace una lista de chequeo de su nave, las condiciones climaticas y las condiciones propias antes de iniciar su vuelo.
Hello world - Prueba01
- Se hace una prueba de funcionamiento donde se hacen preguntas, se obtienen datos en variables, se usa codigo Python, se usa una plantilla de word (debe tenerse agregada al folder del proyecto como template) y se decora una pregunta con una imagen (debe agregarse al folder del proyecto como static file).
---
# En esta parte se agrega una variable planet en la pregunta inicial
question: Hello, ${ planet }!
subquestion: |
I surmise that you have no more than ${ inhabitant_count }
inhabitants.
attachment:
name: A letter for the inhabitants of ${ planet }
filename: hello
docx template file: hello_planet.docx
buttons:
- Exit: exit
mandatory: True
---
question: |
What is your planet's name?
fields:
- Your Planet: planet
decoration: daniel
---
code: |
if favorite_number == 42:
inhabitant_count = 2
else:
inhabitant_count = 2000 + favorite_number * 45
---
question: What is your favorite number?
fields:
- Number: favorite_number
datatype: number
---
image sets:
freepik:
images:
daniel: Foto_perfil.jpeg
attribution: |
Icon made by [Freepik](https://www.flaticon.com/authors/freepik)
---
Para empaquetar la entrevista o exportarla se usa la siguiente forma link
Como escribir una entrevista
-
Se almacenan las respuestas en variables y se pueden agregar a preguntas o al texto de los documentos
-
Las preguntas dadas a un usuario pueden variar en funcion de las respuestas dadas
-
Solo necesitas darle el objetivo final y Docassemble hara las preguntas necesarias para llegar a ese objetivo final
-
El siguiente fragmento de YAML contiene la forma en la que se puede aplicar copigo python al interior de un documento word.
mandatory: True
question: |
Welcome to the interview!
continue button field: intro
---
mandatory: True
question: |
What is your favorite fruit?
fields:
- Fruit: favorite_fruit
---
mandatory: favorite_fruit == 'apple'
question: |
What is your favorite type of apple?
fields:
- Type of apple: favorite_apple
---
mandatory: True
question: |
Here is your document.
attachment:
content: |
Your favorite fruit is ${ favorite_fruit }.
% if favorite_fruit == 'apple':
Your favorite type of apple is ${ favorite_apple }.
% endif
- Listas y Diccionarios
# Lista
- Sweep the porch
- Take out the garbage
# Diccionario
lawyer: A person who represents you.
judge: A person who decides who wins or loses a court case.
# Diccionario de lista
Frank:
- Sweep the porch
- Take out the garbage
- Clean the toilets
Sally:
- Rake the leaves
- Mow the lawn
# Lista de diccionario
- title: Tale of Two Cities
author: Charles Dickens
- title: Moby Dick
author: Herman Melville
- title: Green Eggs and Ham
author: Dr. Seuss
Bloques iniciales
- Se configura una parte inicial de cada entrevista que da cuenta del titulo de la entrevista y una pregunta inicial que igualmente se muestra en pantalla
---
metadata:
title: |
Tutela
short title: |
Admision
description: |
Una entrevista para solucionar un caso de uso legal
authors:
- name: Daniel Arbelaez
organization: Organization Name
revision_date: 2023-07-12
# Hace que el login no aparezca en pantalla
show login: False
---
# Debe de incluirse el mandatory para guiar a docassemble por donde empezar
mandatory: True
question: Cual es tu nombre
fields:
- Nombre: nombre
---
# Debe de incluirse el mandatory para guiar a docassemble por donde finalizar
mandatory: True
question: |
Aqui finaliza el documento
attachment:
content: |
Hola ${ nombre }, un gusto volver a verte!
---
- Para importar modulos de python se usa
---
modules:
- datetime
---
- Para usar una lista de datos en una pregunta asi:
variable name: fruits
data:
- Apple
- Orange
- Peach
- Pear
---
# Si solo hay una pregunta debe ponerse el mandatory true
mandatory: True
question: |
What is your favorite fruit?
field: user_favorite_fruit
dropdown:
code: fruits
- Para agregar comentarios a palabras de entrevistas
terms:
creeper: |
A tall green creature that explodes if
you get too close.
zombie pigman: |
A harmless creature who carries a gold
sword.
---
mandatory: True
question: Have you ever met a {creeper}?
subquestion: |
If you have met a {zombie pigman}, you
have almost certainly met a creeper.
yesno: met_a_creeper
- Para mostrar secciones
# Se indican las secciones que tiene la entrevista
sections:
- intro: Introduction
- about: About you
subsections:
- contact: Contact info
- demographic: Demographics
- prefs: Preferences
- conclusion: Conclusion
---
# Se habilita la funcion de barra de navegacion
features:
navigation: True
---
mandatory: True
question: |
Welcome to the interview
subquestion: |
If you are not on a
smartphone-sized device,
you should see a navigation
bar to the left.
# Se agrega como variable la barra de navegacion
field: sees_nav_bar
---
mandatory: True
question: |
I am going to ask you some
questions about yourself.
field: intro_to_about_you
# Se indica la seccion a la que pertenece la pregunta
section: about
---
mandatory: True
question: |
What is your name?
fields:
- First Name: first_name
- Last Name: last_name
# Se indica la seccion a la que pertenece la pregunta
section: contact
---
mandatory: True
question: |
What is your e-mail address?
fields:
- E-mail: email_address
datatype: email
---
mandatory: True
question: |
What is your gender?
field: gender
choices:
- Male
- Female
- Something else
# Se indica la seccion a la que pertenece la pregunta
section: demographic
---
mandatory: True
question: |
What kind of belly button
do you have?
field: belly_button
choices:
- Innie
- Outie
---
mandatory: True
question: |
What is your favorite fruit?
fields:
- Favorite fruit: favorite_fruit
# Se indica la seccion a la que pertenece la pregunta
section: prefs
---
mandatory: True
question: |
What is your favorite vegetable?
fields:
- Favorite vegetable: favorite_vegetable
---
mandatory: True
question: Thank you.
subquestion: |
${ first_name },
Your answers mean a lot to me.
I am going to go eat some
${ favorite_vegetable }
now.
# Se indica la seccion a la que pertenece la pregunta
section: conclusion
Bloques de preguntas
Lo que ven los usuarios en cada pantalla de entrevista es un bloque de pregunta y es una seccion de YAML
que contiene un especificador de bloque
Los bloques de preguntas pueden ser, bloques iniciales, preguntas de codigo o bloques de pregunta
question: |
Gracias por tu dedicacion al responder **"${respuesta_usuario}"**
# La estructura Mako permite ingresar variables en otras preguntas y tambien la estructura de Markdown permite aplicar estilos al texto
mandatory: True
---
question: |
Este proyecto tendra futuro, estas de acuerdo?
subquestion: |
Se trata de identificar la persepcion del usuario con el proyecto
# subquestion, es una seccion que se usa para explicar la pregunta
under: |
Nota: Este es el `under`
# under es una seccion adicional del texto ubicada debajo de los botones
pre: |
Note: este es el `pre`.
post: |
This is the `post`, which comes
after `under`.
right: |
### Note
this is `right` option
If you did not catch this
movie reference, you need to
improve your cultural literacy.
mandatory: True
fields:
- Responder: respuesta_usuario # Al ingresa una variable se tiene que realizar indicandola en tipo lista (-)
En caso de configurar en la pregunta un texto con right
se puede usar la caracteristica centered para alinear las pregunta y el right
features:
centered: False
---
question: |
What is the airspeed velocity of an
unladen swallow?
fields:
- Velocity: swallow_velocity
right: |
### Note
If you did not catch this
movie reference, you need to
improve your cultural literacy.
Para asignar variables con preguntas se usa el siguiente proceso
question: |
Are you at least 18 years of age?
yesno: over_eighteen
Para solicitar la firma del usuario se realiza de la siguiente forma:
question: |
Sign your name
subquestion: |
By signing your name, you agree to
our terms and conditions.
signature: target_variable
under: |
${ user }
Para crear una pantalla de finalización con botones se usa:
mandatory: True
question: |
Felicitaciones!
subquestion: |
Has finalizado la creación de la providencia.
buttons:
- Exit: exit
url: https://www.ramajudicial.gov.co/portal/inicio
- Restart: restart
Establecer variables
Para indicarle a docassemble que almacene la entrada del usuario que recibe en respuesta a una pregunta , debe incluir en su nombre questionde variable para contener la información. También debe indicar qué tipo de variable es (p. ej., texto, una fecha, un número) y cómo desea solicitar la entrada (p. ej., con una etiqueta).
Preguntas con variable booleana, además se agrega una opción “No sé” que pertenece a la sigueinte instrucción:
question: |
Is Topeka the capital of Kansas?
yesnomaybe: topeka_is_capital_of_kansas
---
question: |
% if topeka_is_capital_of_kansas:
You were right that Topeka is the capital of Kansas.
% elif topeka_is_capital_of_kansas is None:
You should know your state capitals!
% else:
Actually, Topeka is the capital of Kansas.
% endif
mandatory: True
Botones de opcion múltiple
question: |
How would you like to pay for your
car?
field: target_variable
buttons:
- Buy it: purchaser
- Lease it: borrower
Botones creados con código
field: target_variable
question: |
Your use of this system does not
mean that you have a lawyer. Do
you understand this?
buttons:
code: |
[{'understands': "I understand"},
{'does not understand': "I do not understand"},
{'unsure': "I'm not sure"}]
Checkboxes
question: |
Please provide the following information.
fields:
- "What is your favorite food?": favorite_food
- note: Check which foods you like.
- Apples: likes_apples
datatype: yesno
- Turnips: dislikes_turnips
datatype: noyes
Preguntas de codigo
Ejemplo de bloque de código
code: |
answer = 2 + 2
---
question: |
The answer is ${ answer }.
mandatory: True
El contenido de ${ … }se procesa como código Python . El código que se puede colocar dentro ${ … }está limitado a una línea de código, cuyo resultado se coloca en el texto de la pregunta. Por lo tanto, no podría incluir varias líneas de código dentro de una ${ … } expresión.
Además de mayor que ( >) y menor que ( <), los siguientes operadores condicionales están disponibles en Python :
a == b
es verdadero si es aigual a b. Hay dos signos iguales para distinguir esto de a = b, lo que establece el valor de aal valor de b. Esto funciona tanto con números como con texto.
a is b
es esencialmente sinónimo de a == b.
a >= b
es verdadero si aes mayor o igual que b.
a <= b
es verdadero si aes menor o igual que b.
a in b
es verdadero si bes una lista , un diccionario o un conjunto y a está contenido dentro de b. Por ejemplo, 42 in [13, 42, 62]
es cierto. Esto también funciona con texto. Si lo hace a = "Fred"
, entonces a in ["Mary", "Fred", "Scott"]
será verdadero, mientras que a in ["Harold", "Anthony"
, “Norman”]será falso. En el caso de que bsea un diccionario , a in bdevolverá verdadero si a es una clave dentro b.
Otro ejemplo del uso de bloques de código
---
code: |
if user_age > 60:
product_recommendation = 'Oldsmobile'
else:
product_recommendation = 'Mustang'
---
question: What is your age?
fields:
- Age in Years: user_age
datatype: number
---
Objetos
Para determinar variables de varios sujetos es recomendable usar los objetos en docassemble
Logica de entrevistas
A diferencia de otros sistemas de entrevistas guiadas, en los que el desarrollador de la entrevista traza un árbol de decisiones o diagrama de flujo para indicar qué preguntas se deben hacer y en qué orden, docassemble determina qué preguntas hacer y cuándo hacerlas según las reglas que usted especifique . Estas reglas se especifican mediante bloques YAML.
El estilo de lógica “declarativa” es muy útil en estas circunstancias. Todo lo que necesita hacer es el trabajo de un abogado: concentrarse en especificar reglas que sean legalmente correctas. Puede especificar varias reglas superpuestas, que abarquen casos especiales y casos generales.
Una entrevista simple consta de bloques de preguntas con mandatory: True
y las mismas se ejecutarán de forma secuencial en el orden del YAML, ejemplo:
mandatory: True
question: |
Welcome to the interview!
continue button field: intro
---
mandatory: True
question: |
What is your favorite fruit?
fields:
- Fruit: favorite_fruit
---
mandatory: True
question: |
What is your favorite vegetable?
fields:
- Vegetable: favorite_vegetable
---
mandatory: True
question: |
Here is your document.
attachment:
content: |
Your favorite fruit is ${ favorite_fruit }.
% if favorite_fruit == 'apple':
You will never need to see a doctor.
% endif
Your favorite vegetable is ${ favorite_vegetable }.
Es posible orientar las preguntas siguientes en función de las respuestas dadas incorporando en el mandatory una expresion en Python así:
---
mandatory: True
question: |
What is your favorite fruit?
fields:
- Fruit: favorite_fruit
---
mandatory: favorite_fruit == 'apple'
question: |
What is your favorite type of apple?
fields:
- Type of apple: favorite_apple
---
Cuando se presentan muchas ramas anidadas de decisión en la entrevista se puede implementar la satisfacción de la dependencia para evitar que la expresión de python no sea tan compleja así:
mandatory: True
question: |
Your favorite fruit is ${ favorite_fruit }.
subquestion: |
% if favorite_fruit == 'grapes':
Your favorite vineyard is ${ favorite_vineyard }.
% endif
---
question: |
Which vineyard do you think produces the best grapes?
fields:
- Vineyard: favorite_vineyard
---
question: |
What is your favorite fruit?
fields:
- Fruit: favorite_fruit
Para crear un bloque de código aplicando una regla del negocio:
code: |
if user.age_in_years() >= 60 or user.is_disabled:
user.eligible = True
else:
user.eligible = False
Hemos recorrido juntos el impresionante panorama (general) de Docassemble, descubriendo cómo este sistema experto de ensamblaje de documentos puede transformar nuestra relación con la información técnica y mejorar nuestras prácticas jurídicas. Pero el viaje no termina aquí. Hay mucho más por descubrir, especialmente cuando hablamos de aplicar estas habilidades al ámbito legal.
Si sientes que hay un vacío en tu conocimiento sobre cómo ensamblar documentos legales de manera eficiente y precisa, si estás listo para expandir tus horizontes y explorar nuevas formas de integrar Docassemble en tus proyectos, te invito a seguir este blog.
Preparate para recibir regularmente contenido exclusivo sobre Docassemble, casos de estudio, consejos prácticos y tutoriales paso a paso. No te pierdas la próxima entrada.