diff --git a/FLOWS-META.txt b/FLOWS-META.txt new file mode 100644 index 0000000..6f6e3f7 --- /dev/null +++ b/FLOWS-META.txt @@ -0,0 +1,251 @@ +================================================================================ +CREAR FLOWS DE WHATSAPP — PALMAS360 +Instrucciones para el administrador de Meta Business +================================================================================ + + +CONFIGURACION COMUN +-------------------------------------------------------------------------------- + +WhatsApp Manager -> cuenta de WhatsApp Business -> Flows -> Crear flujo + +Para los dos flujos: + + Categoria .......... Otro / Personalizado + Endpoint ........... DEJAR VACIO + Plantilla .......... desde cero (JSON) + +El endpoint vacio es lo importante. Si se configura uno, Meta exige cifrado y +clave publica, y no hace falta: el bot manda los datos al abrir el formulario y +recibe todo al cerrarlo. + + +CUAL PRIMERO +-------------------------------------------------------------------------------- + +Ciclos. Es una sola pantalla, sin ranuras ni maximos que definir, y ataca el +paso mas molesto del bot actual: elegir varios lotes hoy son seis mensajes de +ida y vuelta. + + +================================================================================ +FLOW 1 — CICLOS +Nombre: Ciclos +================================================================================ + +Un solo Flow cubre las doce combinaciones (seis tipos de ciclo x abrir/cerrar), +porque el titulo y la lista de lotes los manda el bot en cada envio. + +Sin maximos que definir: el CheckboxGroup es un solo componente cuya lista de +opciones viene de los datos, asi que da igual si la finca tiene 5 lotes o 40. + +-------------------------------------------------------------------------------- + +{ + "version": "7.0", + "screens": [ + { + "id": "CICLOS", + "title": "Ciclos de lotes", + "terminal": true, + "data": { + "titulo": { "type": "string", "__example__": "Abrir ciclos — Cosecha" }, + "fecha": { "type": "string", "__example__": "2026-08-04" }, + "lotes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "title": { "type": "string" } + } + }, + "__example__": [ + { "id": "4", "title": "REPOSO 1A" }, + { "id": "7", "title": "REPOSO 1B" }, + { "id": "9", "title": "REPOSO 2A" } + ] + } + }, + "layout": { + "type": "SingleColumnLayout", + "children": [ + { "type": "TextHeading", "text": "${data.titulo}" }, + { + "type": "Form", + "name": "form_ciclos", + "children": [ + { + "type": "DatePicker", + "name": "fecha", + "label": "Fecha", + "required": true, + "init-value": "${data.fecha}" + }, + { + "type": "CheckboxGroup", + "name": "lotes", + "label": "Lotes", + "required": true, + "data-source": "${data.lotes}" + }, + { + "type": "Footer", + "label": "Enviar", + "on-click-action": { + "name": "complete", + "payload": { + "fecha": "${form.fecha}", + "lotes": "${form.lotes}" + } + } + } + ] + } + ] + } + } + ] +} + + +================================================================================ +FLOW 2 — PLUVIOMETRIA +Nombre: Pluviometria +================================================================================ + +Aca si hay un maximo, y es por una razon tecnica: cada finca lleva un valor +distinto, asi que necesita su propio campo. Hay ocho ranuras y el bot muestra +solo las que existen; las demas quedan ocultas. + +Si alguna empresa llegara a tener mas de ocho fincas, hay que republicar el +Flow con mas ranuras. CONFIRMAR EL MAXIMO ANTES DE PUBLICAR. + +-------------------------------------------------------------------------------- + +{ + "version": "7.0", + "screens": [ + { + "id": "PLUVIOMETRIA", + "title": "Registrar pluviometría", + "terminal": true, + "data": { + "fecha": { "type": "string", "__example__": "2026-08-04" }, + "finca_1_label": { "type": "string", "__example__": "REPOSO" }, + "finca_1_visible": { "type": "boolean", "__example__": true }, + "finca_2_label": { "type": "string", "__example__": "ROSA BLANCA" }, + "finca_2_visible": { "type": "boolean", "__example__": true }, + "finca_3_label": { "type": "string", "__example__": "" }, + "finca_3_visible": { "type": "boolean", "__example__": false }, + "finca_4_label": { "type": "string", "__example__": "" }, + "finca_4_visible": { "type": "boolean", "__example__": false }, + "finca_5_label": { "type": "string", "__example__": "" }, + "finca_5_visible": { "type": "boolean", "__example__": false }, + "finca_6_label": { "type": "string", "__example__": "" }, + "finca_6_visible": { "type": "boolean", "__example__": false }, + "finca_7_label": { "type": "string", "__example__": "" }, + "finca_7_visible": { "type": "boolean", "__example__": false }, + "finca_8_label": { "type": "string", "__example__": "" }, + "finca_8_visible": { "type": "boolean", "__example__": false } + }, + "layout": { + "type": "SingleColumnLayout", + "children": [ + { "type": "TextBody", "text": "Milímetros de lluvia registrados por finca." }, + { + "type": "Form", + "name": "form_pluvio", + "children": [ + { "type": "DatePicker", "name": "fecha", "label": "Fecha", "required": true, "init-value": "${data.fecha}" }, + + { "type": "TextInput", "name": "finca_1", "label": "${data.finca_1_label}", "input-type": "number", "visible": "${data.finca_1_visible}" }, + { "type": "TextInput", "name": "finca_2", "label": "${data.finca_2_label}", "input-type": "number", "visible": "${data.finca_2_visible}" }, + { "type": "TextInput", "name": "finca_3", "label": "${data.finca_3_label}", "input-type": "number", "visible": "${data.finca_3_visible}" }, + { "type": "TextInput", "name": "finca_4", "label": "${data.finca_4_label}", "input-type": "number", "visible": "${data.finca_4_visible}" }, + { "type": "TextInput", "name": "finca_5", "label": "${data.finca_5_label}", "input-type": "number", "visible": "${data.finca_5_visible}" }, + { "type": "TextInput", "name": "finca_6", "label": "${data.finca_6_label}", "input-type": "number", "visible": "${data.finca_6_visible}" }, + { "type": "TextInput", "name": "finca_7", "label": "${data.finca_7_label}", "input-type": "number", "visible": "${data.finca_7_visible}" }, + { "type": "TextInput", "name": "finca_8", "label": "${data.finca_8_label}", "input-type": "number", "visible": "${data.finca_8_visible}" }, + + { + "type": "Footer", + "label": "Enviar", + "on-click-action": { + "name": "complete", + "payload": { + "fecha": "${form.fecha}", + "finca_1": "${form.finca_1}", + "finca_2": "${form.finca_2}", + "finca_3": "${form.finca_3}", + "finca_4": "${form.finca_4}", + "finca_5": "${form.finca_5}", + "finca_6": "${form.finca_6}", + "finca_7": "${form.finca_7}", + "finca_8": "${form.finca_8}" + } + } + } + ] + } + ] + } + } + ] +} + + +================================================================================ +PUBLICAR +================================================================================ + +Guardar -> Publicar. + +Despues de publicado la estructura no se edita: los cambios son una version +nueva. Por eso conviene definir las ranuras de pluviometria de una vez. + + +================================================================================ +QUE SE NECESITA DE VUELTA +================================================================================ + +Los dos Flow ID. Son numeros largos que aparecen en la lista de flujos o en la +URL al abrirlos. Es lo unico que falta para conectarlos desde el bot. + + Ciclos ............. _______________________ + Pluviometria ....... _______________________ + + +================================================================================ +ANTES DE PUBLICAR — DOS VERIFICACIONES +================================================================================ + +1. VERSION DEL JSON + Esta puesta la 7.0, pero conviene usar la mas reciente que ofrezca el + editor. Al pegar el JSON, el editor valida y marca si algun componente o + propiedad cambio de nombre. Confirmar ahi antes de publicar. + +2. MAXIMO DE FINCAS (solo pluviometria) + Hay ocho ranuras. Confirmar que ninguna empresa vaya a superar ese numero, + porque cambiarlo despues obliga a republicar el Flow. + Ciclos no tiene este problema. + + +================================================================================ +NOTAS TECNICAS (para quien conecte el bot) +================================================================================ + +- Los valores __example__ son solo para la vista previa del editor. Los reales + los siembra el bot en flow_action_payload.data al enviar el mensaje. + +- Ambos Flows usan flow_action "navigate" (sin endpoint). La respuesta llega al + webhook como mensaje interactive de tipo nfm_reply, con el contenido en + response_json. + +- En Ciclos, el bot resuelve antes en chat el tipo de ciclo y la accion + (apertura/cierre), porque eso determina que lotes sembrar: apertura ofrece + todos los lotes de la finca, cierre solo los que estan abiertos. + +- Falta construir del lado del bot: envio de mensajes tipo flow en + WhatsAppSender, recepcion de nfm_reply en WpWebhook, y un tipo de flujo que + siembre los datos y arme el POST.