This is my .json code. Can somebody helpme?
{
“name”: “Automatizacion Gestion de Facturas”,
“flow”: [
{
"id": 1,
"module": "gmail:watchEmails",
"version": 2,
"parameters": {
"folderId": 123456,
"criterion": "has:attachment"
},
"mapper": null,
"metadata": {
"designer": {
"x": 0,
"y": 0,
"name": "Trigger: Watch Emails"
},
"restore": {}
}
},
{
"id": 2,
"module": "builtin:BasicRouter",
"version": 1,
"mapper": null,
"metadata": {
"designer": {
"x": 200,
"y": 0,
"name": "Router: Validaciones Iniciales"
}
},
"routes": \[
{
"flow": \[
{
"id": 3,
"module": "google-sheets:searchRows",
"version": 2,
"parameters": {
"spreadsheetId": "\__IMTSPREADSHEETID_\_",
"worksheetId": "\__IMTWORKSHEETID_\_",
"useHeaders": true,
"limit": 1
},
"mapper": {
"query": "UUID={{1.attachments\[1\].data}}",
"comparison": "equal",
"caseSensitive": false,
"criteria": \[\]
},
"metadata": {
"designer": {
"x": 400,
"y": -50,
"name": "Check for Duplicates (Search by UUID)"
}
}
},
{
"id": 4,
"module": "json:parseJson",
"version": 1,
"parameters": {},
"mapper": {
"data": "{{1.attachments\[1\].data}}"
},
"filter": {
"name": "UUID does not exist",
"conditions": \[
{
"field": "{{3.foundRows}}",
"type": "equal",
"value": "0"
}
\]
},
"metadata": {
"designer": {
"x": 600,
"y": -50,
"name": "Parse XML Invoice Data"
}
}
},
{
"id": 5,
"module": "google-sheets:addRows",
"version": 2,
"parameters": {
"spreadsheetId": "\__IMTSPREADSHEETID_\_",
"worksheetId": "\__IMTWORKSHEETID_\_",
"firstRowAsHeaders": true
},
"mapper": {
"rows": \[
{
"RFC DEL EMISOR": "{{4.root.Comprobante.Emisor.attributes.Rfc}}",
"NOMBRE DEL EMISOR": "{{4.root.Comprobante.Emisor.attributes.Nombre}}",
"FOLIO FISCAL": "{{4.root.Comprobante.attributes.UUID}}",
"SERIE": "{{4.root.Comprobante.attributes.Serie}}",
"FOLIO": "{{4.root.Comprobante.attributes.Folio}}",
"RFC DEL RECEPTOR": "{{4.root.Comprobante.Receptor.attributes.Rfc}}",
"NOMBRE DEL RECEPTOR": "{{4.root.Comprobante.Receptor.attributes.Nombre}}",
"FECHA": "{{4.root.Comprobante.attributes.Fecha}}",
"EFECTO DEL COMPOBANTE": "{{4.root.Comprobante.attributes.TipoDeComprobante}}",
"USO DEL CFDI": "{{4.root.Comprobante.Receptor.attributes.UsoCFDI}}",
"CONCEPTO": "{{4.root.Comprobante.Conceptos.Concepto.attributes.Descripcion}}",
"SUBTOTAL": "{{if(4.root.Comprobante.attributes.TipoDeComprobante = \\"E\\"; -4.root.Comprobante.attributes.SubTotal; 4.root.Comprobante.attributes.SubTotal)}}",
"IVA": "{{if(4.root.Comprobante.attributes.TipoDeComprobante = \\"E\\"; -4.root.Comprobante.Impuestos.Translados.Traslado.attributes.Importe; 4.root.Comprobante.Impuestos.Translados.Traslado.attributes.Importe)}}",
"RETENCIÓN DE IVA": "{{if(4.root.Comprobante.Impuestos.Retenciones.Retencion.attributes.Impuesto = \\"002\\"; 4.root.Comprobante.Impuestos.Retenciones.Retencion.attributes.Importe; 0)}}",
"RETENCIÓN DE ISR": "{{if(4.root.Comprobante.Impuestos.Retenciones.Retencion.attributes.Impuesto = \\"001\\"; 4.root.Comprobante.Impuestos.Retenciones.Retencion.attributes.Importe; 0)}}",
"TOTAL": "{{if(4.root.Comprobante.attributes.TipoDeComprobante = \\"E\\"; -4.root.Comprobante.attributes.Total; 4.root.Comprobante.attributes.Total)}}",
"MONEDA": "{{4.root.Comprobante.attributes.Moneda}}",
"FORMA DE PAGO": "{{4.root.Comprobante.attributes.FormaPago}}",
"MÉTODO DE PAGO": "{{4.root.Comprobante.attributes.MetodoPago}}"
}
\]
},
"metadata": {
"designer": {
"x": 800,
"y": -50,
"name": "Add Row to Google Sheets"
}
}
}
\]
},
{
"flow": \[
{
"id": 6,
"module": "util:setVariables",
"version": 1,
"parameters": {},
"mapper": {
"variables": \[
{
"name": "error_message",
"value": "Se ha detectado un posible error en la factura con folio {{1.subject}}. Por favor, revise el RFC o las retenciones e intente de nuevo."
}
\]
},
"filter": {
"name": "Error Conditions",
"conditions": \[
{
"field": "{{json(4.root.Comprobante.Receptor.attributes).Rfc}}",
"type": "notEqual",
"value": "TU_RFC_EMPRESA"
}
\]
},
"metadata": {
"designer": {
"x": 400,
"y": 50,
"name": "Set Error Message"
}
}
},
{
"id": 7,
"module": "gmail:sendEmail",
"version": 2,
"parameters": {
"to": "{{1.from}}",
"subject": "Error en Factura - {{1.subject}}",
"html": true
},
"mapper": {
"content": "Hola, <br><br>Hemos recibido su factura con folio \*\*{{json(4.root.Comprobante.attributes).Folio}}\*\*, sin embargo, se ha detectado un posible error en el RFC del receptor o en las retenciones. <br><br>Por favor, revise la factura y emita una nueva con los datos correctos para poder procesarla.<br><br>Saludos cordiales,<br>Equipo de Cuentas por Pagar."
},
"metadata": {
"designer": {
"x": 600,
"y": 50,
"name": "Send Error Email"
}
}
}
\]
}
\]
}
\],
"metadata": {
"instant": true,
"version": 1,
"scenario": {
"roundtrips": 1,
"maxErrors": 3,
"autoCommit": true,
"autoCommitTriggerLast": true,
"sequential": false,
"slots": null,
"confidential": false,
"dataloss": false,
"dlq": false,
"freshVariables": false
},
"designer": {
"orphans": \[\]
},
"zone": "us2.make.com",
"notes": \[
{
"moduleIds": \[
1
\],
"content": "<h1>1. Trigger - Gmail: Watch Emails</h1><p><b>Propósito:</b> Inicia el escenario al detectar nuevos correos en la bandeja de entrada de Gmail con archivos adjuntos.</p><p><b>Configuración:</b> Configura la conexión a tu cuenta de Gmail. Selecciona la carpeta donde tus proveedores envían las facturas (ej. 'Facturas'). El filtro 'has:attachment' asegura que solo procesemos correos con archivos adjuntos. La automatización marcará el correo como leído al final del proceso, lo que evita errores manuales y reprocesamientos.</p>",
"isFilterNote": false,
"metadata": {
"color": "#FFC0CB"
}
},
{
"moduleIds": \[
2
\],
"content": "<h1>2. Router - Basic Router</h1><p><b>Propósito:</b> Dirige el flujo de la automatización por dos caminos principales: uno para el procesamiento normal de la factura y otro para la gestión de errores o excepciones.</p><p><b>Configuración:</b> No se requiere configuración específica. Las rutas se definirán en los módulos siguientes mediante filtros.",
"isFilterNote": false,
"metadata": {
"color": "#FFC0CB"
}
},
{
"moduleIds": \[
3
\],
"content": "<h1>3. Google Sheets: Search Rows</h1><p><b>Propósito:</b> Actúa como un \*\*nodo de control de duplicidad\*\*. Busca en tu hoja de Google Sheets si ya existe un registro con el mismo Folio Fiscal (UUID) para evitar procesar la misma factura dos o más veces.</p><p><b>Configuración:</b> Ingresa el ID de la hoja de cálculo y de la hoja específica. En el campo 'Query', usa la expresión \`UUID={{1.attachments\[1\].data}}\`. Esto asume que el segundo adjunto (índice 1) es el XML y que su UUID es el campo único de identificación.</p>",
"isFilterNote": false,
"metadata": {
"color": "#FFC0CB"
}
},
{
"moduleIds": \[
4
\],
"content": "<h1>4. JSON: Parse XML</h1><p><b>Propósito:</b> Extrae los datos relevantes de la factura (UUID, RFC, montos, etc.) del archivo XML adjunto, preparándolos para ser insertados en Google Sheets.</p><p><b>Configuración:</b> Mapea el campo 'Data' al contenido del archivo XML adjunto. Se asume que el XML es el segundo archivo adjunto, por lo que se utiliza la expresión \`{{1.attachments\[1\].data}}\`. El filtro del camino principal (\`Total number of rows returned = 0\`) asegura que solo se procesen facturas nuevas.</p>",
"isFilterNote": true,
"metadata": {
"color": "#9138FE"
}
},
{
"moduleIds": \[
5
\],
"content": "<h1>5. Google Sheets: Add Rows</h1><p><b>Propósito:</b> Inserta una nueva fila en tu hoja de Google Sheets con toda la información extraída del XML, cumpliendo con la estructura de encabezados que solicitaste.</p><p><b>Configuración:</b> Mapea cada campo de la tabla de Google Sheets con el dato correspondiente del módulo anterior (Parse XML). Se incluye una función \`if()\` para detectar CFDI de tipo 'E' (Egreso) y convertir los montos de Subtotal, IVA y Total a negativos, como se solicitó para las Notas de Crédito.</p>",
"isFilterNote": false,
"metadata": {
"color": "#FFC0CB"
}
},
{
"moduleIds": \[
6
\],
"content": "<h1>6. Set Variables (Ruta de Errores)</h1><p><b>Propósito:</b> Prepara el mensaje de correo que se enviará al proveedor cuando se detecte un posible error en la factura.</p><p><b>Configuración:</b> Se crea una variable \`error_message\` con el texto predefinido. El filtro en esta rama del router (ej. \`RFC del Receptor != "TU_RFC_EMPRESA"\`) detecta facturas con datos incorrectos y activa este camino.</p>",
"isFilterNote": true,
"metadata": {
"color": "#9138FE"
}
},
{
"moduleIds": \[
7
\],
"content": "<h1>7. Gmail: Send Email (Ruta de Errores)</h1><p><b>Propósito:</b> Notifica automáticamente al proveedor sobre el error en la factura, solicitando su cancelación y reemisión.</p><p><b>Configuración:</b> El destinatario (\`To\`) se mapea a la dirección del remitente del correo original (\`{{1.from}}\`). El asunto y el cuerpo del correo se personalizan para incluir el folio de la factura y el motivo del error, extrayendo la información del XML.</p>",
"isFilterNote": false,
"metadata": {
"color": "#FFC0CB"
}
}
\]
}
}
I’m new to MAKE and am trying to create useful automations for the Mexican tax environment.
I appreciate your feedback and help in advance.
Best regards