{
  "name": "Facturas - Captura y fusión semanal",
  "nodes": [
    {
      "parameters": {
        "authentication": "basicAuth",
        "formTitle": "Ingresar Factura",
        "formDescription": "=<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:2px;\">\n\nℹ️ <b>Formato aceptado: PDF y JPG</b> - Los demás formatos no son aceptados.\nℹ️ No se permiten <b>archivos cifrados/protegidos con contraseña</b> - deberás descifrarlos antes de subirlos.\nℹ️ Incidencias por favor contacte con <b>javier.munoz@royalcomunicacion.com</b> o a través de este enlace: <a href=\"https://royalcomunicacion.app.n8n.cloud/form/soporte-incidencias-royal\" target=\"_blank\">Reportar incidencia</a>\nDesarrollado por Royal Comunicación. <br> Potenciado con IA.",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Ingrese PDF o JPG (1 o más archivos)",
              "fieldType": "file",
              "acceptFileTypes": ".pdf, .jpg",
              "requiredField": true
            },
            {
              "fieldLabel": "Introduzca su email (Obligatorio)",
              "fieldType": "email",
              "placeholder": "email@royalcomunicacion.com",
              "requiredField": true
            },
            {
              "fieldLabel": "Proyecto",
              "placeholder": "Nombre del proyecto"
            },
            {
              "fieldLabel": "Gasto autorizado por",
              "placeholder": "Persona que autoriza"
            },
            {
              "fieldLabel": "Observaciones",
              "fieldType": "textarea",
              "placeholder": "Por ejemplo poner pagar a X persona"
            },
            {
              "fieldLabel": "Seleccione tarjeta",
              "fieldType": "dropdown",
              "defaultValue": "-",
              "fieldOptions": {
                "values": [
                  {
                    "option": "-"
                  },
                  {
                    "option": "AMEX 3003"
                  },
                  {
                    "option": "AMEX 1008"
                  },
                  {
                    "option": "VISA 6014"
                  },
                  {
                    "option": "VISA 4017"
                  },
                  {
                    "option": "PAYPAL"
                  },
                  {
                    "option": "VISA Fran G 1908"
                  },
                  {
                    "option": "AMEX Joaquín 1008"
                  },
                  {
                    "option": "AMEX Nerea 1008"
                  }
                ]
              }
            },
            {
              "fieldLabel": "¿Es necesario verificar el CIF/VAT en esta/s factura/s?",
              "fieldType": "dropdown",
              "defaultValue": "Sí",
              "fieldOptions": {
                "values": [
                  {
                    "option": "Sí"
                  },
                  {
                    "option": "No"
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Procesar Factura >",
          "path": "gestion-de-facturas",
          "respondWithOptions": {
            "values": {
              "formSubmittedText": "Procesando factura, por favor espere."
            }
          },
          "ignoreBots": false,
          "customCss": ":root {\n\t/* Fonts */\n\t--font-family: \"Open Sans\", sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 600;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-input-bg: #ffffff;\n\t--color-focus-border: #e51947;\n\t--color-focus-ring: rgba(229, 25, 71, 0.14);\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\n\t/* Dimensions */\n    --container-width: 820px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}\n\n*,\n::after,\n::before {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tmin-height: 100%;\n}\n\nbody {\n\tfont-family: var(--font-family);\n\tfont-weight: var(--font-weight-normal);\n\tfont-size: var(--font-size-body);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n\tmin-height: 100vh;\n\tbackground-color: var(--color-background);\n\tbackground-image:\n\t\tradial-gradient(720px 420px at 12% -8%, rgba(229, 25, 71, 0.10), transparent 60%),\n\t\tradial-gradient(760px 460px at 100% 0%, rgba(248, 203, 220, 0.55), transparent 55%);\n\tbackground-repeat: no-repeat;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.container {\n\tmargin: auto;\n\ttext-align: center;\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: var(--padding-container-top);\n\twidth: var(--container-width);\n}\n\n.test-notice {\n\tpadding: var(--padding-test-notice-vertical) var(--padding-test-notice-horizontal);\n\tcolor: var(--color-test-notice-text);\n\tbackground-color: var(--color-test-notice-bg);\n\tborder-radius: var(--border-radius-input);\n\tborder: 1px solid var(--color-test-notice-border);\n\tborder-left: 3px solid var(--color-brand);\n\tfont-size: var(--font-size-test-notice);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 16px;\n\ttext-align: left;\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card {\n\tposition: relative;\n\toverflow: hidden;\n\tpadding: var(--padding-card);\n\tbackground-color: var(--color-card-bg);\n\tborder: 1px solid var(--color-card-border);\n\tborder-radius: var(--border-radius-card);\n\tbox-shadow: var(--box-shadow-card);\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card::before {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 5px;\n\tbackground: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand-dark) 45%, var(--color-brand-light) 100%);\n}\n\n.n8n-link {\n\tpadding-bottom: var(--padding-container-top);\n}\n.n8n-link a {\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-medium);\n\tfont-size: var(--font-size-link);\n\ttext-decoration: none;\n}\n\n.n8n-link svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.form-header h1 {\n\tcolor: var(--color-header);\n\tfont-size: var(--font-size-header);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: -0.01em;\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-bottom: 14px;\n}\n\n.form-header h1::after {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twidth: 44px;\n\theight: 4px;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-brand), var(--color-brand-dark));\n}\n\n.form-header p {\n\tpadding-top: 16px;\n\tcolor: var(--color-link);\n\tfont-size: var(--font-size-paragraph);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 1.65;\n\ttext-align: left;\n}\n\n.form-header p a {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-medium);\n\ttext-decoration: none;\n}\n\n.form-header p a:hover {\n\ttext-decoration: underline;\n}\n\n.inputs-wrapper {\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: 8px;\n}\n\nform label {\n\tdisplay: block;\n\ttext-align: left;\n\tfont-size: var(--font-size-label);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-label);\n\tpadding-bottom: 8px;\n}\n\nform textarea {\n\tmax-width: 100%;\n}\n\nform .form-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tbackground-color: var(--color-input-bg);\n\tfont-weight: var(--font-weight-normal);\n\tpadding: var(--padding-form-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\nform textarea:focus,\nform input:focus {\n\toutline: none;\n\tborder-color: var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\n.select-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.select-input:focus-within {\n\tborder: 1px solid var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\nform select {\n\toutline: transparent;\n\tborder: none;\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tfont-weight: var(--font-weight-normal);\n\tbackground-color: var(--color-card-bg);\n\tpadding: var(--padding-form-input);\n\tborder-right: 12px solid transparent;\n}\n\ninput[type='date'] {\n\tfont-family: var(--font-family);\n}\n\n::placeholder {\n\topacity: var(--opacity-placeholder);\n}\n\n#submit-btn {\n\twidth: 100%;\n\theight: var(--submit-btn-height);\n\tpadding: var(--padding-form-input);\n\tborder-radius: var(--border-radius-input);\n\tborder: 0;\n\tfont-size: var(--font-size-input);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: 0.02em;\n\tfont-family: var(--font-family);\n\tbackground: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);\n\tcolor: var(--color-submit-btn-text);\n\tbox-shadow: 0 12px 24px -8px rgba(229, 25, 71, 0.55);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;\n}\n\n#submit-btn span {\n\tpadding-right: 6px;\n\tdisplay: none;\n}\n\n#submit-btn span svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tfill: var(--color-submit-btn-text);\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n\n#submit-btn:hover {\n\ttransform: translateY(-2px);\n\tbox-shadow: 0 16px 28px -8px rgba(229, 25, 71, 0.65);\n}\n\n#submit-btn:active {\n\ttransform: translateY(0);\n\tbox-shadow: 0 8px 16px -8px rgba(229, 25, 71, 0.55);\n}\n\n#submit-btn:disabled {\n\tcursor: not-allowed;\n\topacity: 0.7;\n\ttransform: none;\n}\n\n.error-hidden {\n\tdisplay: block;\n\tposition: relative;\n\tcolor: var(--color-error);\n\ttext-align: left;\n\tfont-size: var(--font-size-error);\n\tfont-weight: var(--font-weight-normal);\n\tvisibility: hidden;\n\tpadding-top: 6px;\n\tpadding-bottom: 9px;\n}\n\n.error-show {\n\tvisibility: visible;\n}\n\n/* multiselect ----------------------------------- */\n.multiselect {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.multiselect-option {\n\tpadding-top: 6px;\n\tdisplay: flex;\n}\n\n.multiselect-option label {\n\tpadding-left: 12px;\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-normal);\n\tcursor: pointer;\n}\n\n.multiselect-checkbox {\n\tvertical-align: middle;\n\tmin-width: var(--checkbox-size);\n}\n\ninput[type='checkbox'] {\n\tappearance: none;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tposition: relative;\n\ttransition: background 0.18s ease, border-color 0.18s ease;\n}\n.multiselect-checkbox:checked {\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder-color: var(--color-brand);\n}\n.multiselect-checkbox:checked::after {\n\tcontent: '✔';\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tcolor: white;\n\tfont-size: var(--font-size-label);\n\tfont-weight: bold;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox {\n\tborder-radius: 50%;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox:checked {\n\tbackground: white;\n\tborder-color: var(--color-brand);\n\tborder-width: 4px;\n\tborder-radius: 50%;\n}\n.multiselect[data-radio-select] .multiselect-checkbox:checked::after {\n\tcontent: '';\n}\n/* required field ----------------------------- */\nlabel.form-required::after {\n\tcontent: ' *';\n\tcolor: var(--color-required);\n}\n\nhr {\n\tborder: 0;\n\theight: 1px;\n\tborder-top: 1px solid var(--color-input-border);\n\tmargin-top: 24px;\n\tmargin-bottom: 24px;\n\tdisplay: none;\n}\n\n.file-input-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\ninput[type=\"file\"] {\n\tcursor: pointer;\n}\n\ninput[type=\"file\"]::file-selector-button {\n\tfont-family: var(--font-family);\n\tfont-size: 13px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-brand);\n\tbackground-color: var(--color-brand-tint);\n\tborder: 1px solid var(--color-brand-light);\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tmargin-right: 12px;\n\tcursor: pointer;\n\ttransition: background-color 0.18s ease, color 0.18s ease;\n}\n\ninput[type=\"file\"]::file-selector-button:hover {\n\tbackground-color: var(--color-brand-light);\n\tcolor: var(--color-brand-dark);\n}\n\n.clear-button {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 50%;\n\ttransform: translateY(-65%);\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder: none;\n\tborder-radius: var(--border-radius-clear-btn);\n\tfont-size: 14px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-family: var(--font-family);\n\tcolor: white;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\tline-height: 20px;\n\tcursor: pointer;\n\tdisplay: none;\n\ttransition: opacity 0.18s ease;\n}\n\n.clear-button:hover {\n\topacity: 0.85;\n}\n\ninput[type=\"file\"]:not(:empty) + .clear-button {\n\tdisplay: inline-block;\n}\n\ndiv.html {\n\ttext-align: left;\n\tcolor: var(--color-html-text);\n\tfont-size: var(--font-size-input);\n}\ndiv.html h1, div.html h2, div.html h3, div.html h4, div.html h5, div.html h6, div.html p, div.html ul, div.html ol, div.html a {\n\tfont-weight: var(--font-weight-normal);\n\tfont-style: normal;\n\tmargin-bottom: 8px;\n}\ndiv.html li {\n\tmargin-bottom: 8px;\n\tmargin-left: 24px;\n}\ndiv.html ul, div.html ol {\n\tfont-size: var(--font-size-input);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-self: stretch;\n\tline-height: normal;\n}\ndiv.html b {\n\tfont-weight: var(--font-weight-bold);\n}\ndiv.html h1 {\n\tfont-size: var(--font-size-html-h1);\n\tline-height: 35px;\n}\ndiv.html h2 {\n\tfont-size: var(--font-size-html-h2);\n\tline-height: 26px;\n}\ndiv.html h3 {\n\tfont-size: var(--font-size-html-h3);\n\tline-height: 24px;\n}\ndiv.html h4 {\n\tfont-size: var(--font-size-html-h4);\n\tline-height: 18px;\n}\ndiv.html h5 {\n\tfont-size: var(--font-size-html-h5);\n}\ndiv.html h6 {\n\tfont-size: var(--font-size-html-h6);\n}\ndiv.html p {\n\tmargin-bottom: 8px;\n}\ndiv.html a {\n\tcolor: var(--color-html-link);\n\tfont-size: var(--font-size-input);\n}\n\n@media only screen and (max-width: 500px) {\n\tbody {\n\t\tbackground-color: var(--color-background);\n\t}\n\thr {\n\t\tdisplay: block;\n\t}\n\t.container {\n\t\twidth: 95%;\n\t\tmin-height: 100vh;\n\t\tpadding: 24px;\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: 0px;\n\t\tbox-shadow: 0px 0px 0px 0px #ffffff;\n\t}\n\t.card {\n\t\tpadding: 20px;\n\t\tbackground-color: var(--color-card-bg);\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: var(--border-radius-card);\n\t\tbox-shadow: var(--box-shadow-card);\n\t\tmargin-bottom: 0px;\n\t}\n}\n\n\n.form-header p b,\n.form-header p strong {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-bold);\n}\n\n\n.form-header img {\n\tdisplay: block;\n\tmargin: 0 auto 12px auto;\n\theight: 40px;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        5248,
        2128
      ],
      "id": "b7d810d6-36fd-4e07-9032-6ca8ddea25a2",
      "name": "On form submission",
      "webhookId": "dd088617-cc59-4c9e-874a-c4e19af29f39",
      "credentials": {
        "httpBasicAuth": {
          "id": "eb3ciQbGH5EfWa7a",
          "name": "Acceder formulario Facturas"
        }
      }
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "EN MANTENIMIENTO",
        "completionMessage": "<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" height=\"36\">\n<br><br>\nEl formulario está cerrado temporalmente <b>por labores de mantenimiento</b> por favor vuelva a intentarlo más tarde.\n<br><br>\nSi necesita utilizarlo de urgencia contacte a <b>javier.munoz@royalcomunicacion.com</b>\n<br><br>\nDisculpa las molestias.",
        "options": {
          "formTitle": "Royal Comunicación",
          "customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-focus-border: #e51947;\n\t--color-submit-btn-bg: #e51947;\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\t--color-header-subtext: #8a8d93;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 18px;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\t--card-padding: 32px;\n\t--card-margin-bottom: 20px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}"
        }
      },
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.3,
      "position": [
        5248,
        1712
      ],
      "id": "38de4a18-8503-487e-bea8-2910a2ce986a",
      "name": "EN MANTENIMIENTO",
      "webhookId": "950a515e-cafe-4d66-b2c7-7f815423d287"
    },
    {
      "parameters": {
        "authentication": "basicAuth",
        "formTitle": "Unir todas las facturas subidas a Drive",
        "formDescription": "Para comenzar a unificar todas las facturas pulse \"comenzar\" este proceso es rápido, si tiene cualquier incidencia por favor contacte con javier.munoz@royalcomunicacion.com",
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Comenzar",
          "path": "unir-facturas",
          "customCss": ":root {\n\t/* Fonts */\n\t--font-family: \"Open Sans\", sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 600;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-input-bg: #ffffff;\n\t--color-focus-border: #e51947;\n\t--color-focus-ring: rgba(229, 25, 71, 0.14);\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}\n\n*,\n::after,\n::before {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tmin-height: 100%;\n}\n\nbody {\n\tfont-family: var(--font-family);\n\tfont-weight: var(--font-weight-normal);\n\tfont-size: var(--font-size-body);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n\tmin-height: 100vh;\n\tbackground-color: var(--color-background);\n\tbackground-image:\n\t\tradial-gradient(720px 420px at 12% -8%, rgba(229, 25, 71, 0.10), transparent 60%),\n\t\tradial-gradient(760px 460px at 100% 0%, rgba(248, 203, 220, 0.55), transparent 55%);\n\tbackground-repeat: no-repeat;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.container {\n\tmargin: auto;\n\ttext-align: center;\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: var(--padding-container-top);\n\twidth: var(--container-width);\n}\n\n.test-notice {\n\tpadding: var(--padding-test-notice-vertical) var(--padding-test-notice-horizontal);\n\tcolor: var(--color-test-notice-text);\n\tbackground-color: var(--color-test-notice-bg);\n\tborder-radius: var(--border-radius-input);\n\tborder: 1px solid var(--color-test-notice-border);\n\tborder-left: 3px solid var(--color-brand);\n\tfont-size: var(--font-size-test-notice);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 16px;\n\ttext-align: left;\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card {\n\tposition: relative;\n\toverflow: hidden;\n\tpadding: var(--padding-card);\n\tbackground-color: var(--color-card-bg);\n\tborder: 1px solid var(--color-card-border);\n\tborder-radius: var(--border-radius-card);\n\tbox-shadow: var(--box-shadow-card);\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card::before {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 5px;\n\tbackground: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand-dark) 45%, var(--color-brand-light) 100%);\n}\n\n.n8n-link {\n\tpadding-bottom: var(--padding-container-top);\n}\n.n8n-link a {\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-medium);\n\tfont-size: var(--font-size-link);\n\ttext-decoration: none;\n}\n\n.n8n-link svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.form-header h1 {\n\tcolor: var(--color-header);\n\tfont-size: var(--font-size-header);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: -0.01em;\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-bottom: 14px;\n}\n\n.form-header h1::after {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twidth: 44px;\n\theight: 4px;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-brand), var(--color-brand-dark));\n}\n\n.form-header p {\n\tpadding-top: 16px;\n\tcolor: var(--color-link);\n\tfont-size: var(--font-size-paragraph);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 1.65;\n\ttext-align: left;\n}\n\n.form-header p a {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-medium);\n\ttext-decoration: none;\n}\n\n.form-header p a:hover {\n\ttext-decoration: underline;\n}\n\n.inputs-wrapper {\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: 8px;\n}\n\nform label {\n\tdisplay: block;\n\ttext-align: left;\n\tfont-size: var(--font-size-label);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-label);\n\tpadding-bottom: 8px;\n}\n\nform textarea {\n\tmax-width: 100%;\n}\n\nform .form-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tbackground-color: var(--color-input-bg);\n\tfont-weight: var(--font-weight-normal);\n\tpadding: var(--padding-form-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\nform textarea:focus,\nform input:focus {\n\toutline: none;\n\tborder-color: var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\n.select-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.select-input:focus-within {\n\tborder: 1px solid var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\nform select {\n\toutline: transparent;\n\tborder: none;\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tfont-weight: var(--font-weight-normal);\n\tbackground-color: var(--color-card-bg);\n\tpadding: var(--padding-form-input);\n\tborder-right: 12px solid transparent;\n}\n\ninput[type='date'] {\n\tfont-family: var(--font-family);\n}\n\n::placeholder {\n\topacity: var(--opacity-placeholder);\n}\n\n#submit-btn {\n\twidth: 100%;\n\theight: var(--submit-btn-height);\n\tpadding: var(--padding-form-input);\n\tborder-radius: var(--border-radius-input);\n\tborder: 0;\n\tfont-size: var(--font-size-input);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: 0.02em;\n\tfont-family: var(--font-family);\n\tbackground: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);\n\tcolor: var(--color-submit-btn-text);\n\tbox-shadow: 0 12px 24px -8px rgba(229, 25, 71, 0.55);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;\n}\n\n#submit-btn span {\n\tpadding-right: 6px;\n\tdisplay: none;\n}\n\n#submit-btn span svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tfill: var(--color-submit-btn-text);\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n\n#submit-btn:hover {\n\ttransform: translateY(-2px);\n\tbox-shadow: 0 16px 28px -8px rgba(229, 25, 71, 0.65);\n}\n\n#submit-btn:active {\n\ttransform: translateY(0);\n\tbox-shadow: 0 8px 16px -8px rgba(229, 25, 71, 0.55);\n}\n\n#submit-btn:disabled {\n\tcursor: not-allowed;\n\topacity: 0.7;\n\ttransform: none;\n}\n\n.error-hidden {\n\tdisplay: block;\n\tposition: relative;\n\tcolor: var(--color-error);\n\ttext-align: left;\n\tfont-size: var(--font-size-error);\n\tfont-weight: var(--font-weight-normal);\n\tvisibility: hidden;\n\tpadding-top: 6px;\n\tpadding-bottom: 9px;\n}\n\n.error-show {\n\tvisibility: visible;\n}\n\n/* multiselect ----------------------------------- */\n.multiselect {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.multiselect-option {\n\tpadding-top: 6px;\n\tdisplay: flex;\n}\n\n.multiselect-option label {\n\tpadding-left: 12px;\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-normal);\n\tcursor: pointer;\n}\n\n.multiselect-checkbox {\n\tvertical-align: middle;\n\tmin-width: var(--checkbox-size);\n}\n\ninput[type='checkbox'] {\n\tappearance: none;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tposition: relative;\n\ttransition: background 0.18s ease, border-color 0.18s ease;\n}\n.multiselect-checkbox:checked {\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder-color: var(--color-brand);\n}\n.multiselect-checkbox:checked::after {\n\tcontent: '✔';\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tcolor: white;\n\tfont-size: var(--font-size-label);\n\tfont-weight: bold;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox {\n\tborder-radius: 50%;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox:checked {\n\tbackground: white;\n\tborder-color: var(--color-brand);\n\tborder-width: 4px;\n\tborder-radius: 50%;\n}\n.multiselect[data-radio-select] .multiselect-checkbox:checked::after {\n\tcontent: '';\n}\n/* required field ----------------------------- */\nlabel.form-required::after {\n\tcontent: ' *';\n\tcolor: var(--color-required);\n}\n\nhr {\n\tborder: 0;\n\theight: 1px;\n\tborder-top: 1px solid var(--color-input-border);\n\tmargin-top: 24px;\n\tmargin-bottom: 24px;\n\tdisplay: none;\n}\n\n.file-input-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\ninput[type=\"file\"] {\n\tcursor: pointer;\n}\n\ninput[type=\"file\"]::file-selector-button {\n\tfont-family: var(--font-family);\n\tfont-size: 13px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-brand);\n\tbackground-color: var(--color-brand-tint);\n\tborder: 1px solid var(--color-brand-light);\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tmargin-right: 12px;\n\tcursor: pointer;\n\ttransition: background-color 0.18s ease, color 0.18s ease;\n}\n\ninput[type=\"file\"]::file-selector-button:hover {\n\tbackground-color: var(--color-brand-light);\n\tcolor: var(--color-brand-dark);\n}\n\n.clear-button {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 50%;\n\ttransform: translateY(-65%);\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder: none;\n\tborder-radius: var(--border-radius-clear-btn);\n\tfont-size: 14px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-family: var(--font-family);\n\tcolor: white;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\tline-height: 20px;\n\tcursor: pointer;\n\tdisplay: none;\n\ttransition: opacity 0.18s ease;\n}\n\n.clear-button:hover {\n\topacity: 0.85;\n}\n\ninput[type=\"file\"]:not(:empty) + .clear-button {\n\tdisplay: inline-block;\n}\n\ndiv.html {\n\ttext-align: left;\n\tcolor: var(--color-html-text);\n\tfont-size: var(--font-size-input);\n}\ndiv.html h1, div.html h2, div.html h3, div.html h4, div.html h5, div.html h6, div.html p, div.html ul, div.html ol, div.html a {\n\tfont-weight: var(--font-weight-normal);\n\tfont-style: normal;\n\tmargin-bottom: 8px;\n}\ndiv.html li {\n\tmargin-bottom: 8px;\n\tmargin-left: 24px;\n}\ndiv.html ul, div.html ol {\n\tfont-size: var(--font-size-input);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-self: stretch;\n\tline-height: normal;\n}\ndiv.html b {\n\tfont-weight: var(--font-weight-bold);\n}\ndiv.html h1 {\n\tfont-size: var(--font-size-html-h1);\n\tline-height: 35px;\n}\ndiv.html h2 {\n\tfont-size: var(--font-size-html-h2);\n\tline-height: 26px;\n}\ndiv.html h3 {\n\tfont-size: var(--font-size-html-h3);\n\tline-height: 24px;\n}\ndiv.html h4 {\n\tfont-size: var(--font-size-html-h4);\n\tline-height: 18px;\n}\ndiv.html h5 {\n\tfont-size: var(--font-size-html-h5);\n}\ndiv.html h6 {\n\tfont-size: var(--font-size-html-h6);\n}\ndiv.html p {\n\tmargin-bottom: 8px;\n}\ndiv.html a {\n\tcolor: var(--color-html-link);\n\tfont-size: var(--font-size-input);\n}\n\n@media only screen and (max-width: 500px) {\n\tbody {\n\t\tbackground-color: var(--color-background);\n\t}\n\thr {\n\t\tdisplay: block;\n\t}\n\t.container {\n\t\twidth: 95%;\n\t\tmin-height: 100vh;\n\t\tpadding: 24px;\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: 0px;\n\t\tbox-shadow: 0px 0px 0px 0px #ffffff;\n\t}\n\t.card {\n\t\tpadding: 20px;\n\t\tbackground-color: var(--color-card-bg);\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: var(--border-radius-card);\n\t\tbox-shadow: var(--box-shadow-card);\n\t\tmargin-bottom: 0px;\n\t}\n}\n\n\n.form-header p b,\n.form-header p strong {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-bold);\n}\n\n\n.form-header img {\n\tdisplay: block;\n\tmargin: 0 auto 12px auto;\n\theight: 40px;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        5248,
        4816
      ],
      "id": "cfaed30d-aed9-4124-895f-0d9de0ddb5b8",
      "name": "On form submission1",
      "webhookId": "784f9014-8db2-4009-b6af-48ccd66018c0",
      "credentials": {
        "httpBasicAuth": {
          "id": "eb3ciQbGH5EfWa7a",
          "name": "Acceder formulario Facturas"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const item = $('Renombrar factura1').item;\nconst requiereVerificarCif = $('On form submission').first().json[\"¿Es necesario verificar el CIF/VAT en esta/s factura/s?\"] !== 'No';\n\n// La 'B' inicial del CIF a veces se detecta como '8' (confusion visual en el analisis del documento).\n// Aceptamos ambas variantes para no generar avisos falsos por ese motivo.\nconst cifRoyalValidos = ['B91637967', 'ESB91637967', '891637967', 'ES891637967'];\nconst normalizar = (s) => (s || '').toString().toUpperCase().replace(/[^A-Z0-9]/g, '');\n\nconst cifProveedor = item.json.cif_proveedor;\nconst cifRoyal = item.json.cif_royal;\n\nlet faltaCifProveedor = false;\nlet faltaOIncorrectoCifRoyal = false;\n\nif (requiereVerificarCif) {\n  faltaCifProveedor = !cifProveedor || cifProveedor.toLowerCase() === 'desconocido';\n\n  const cifRoyalNormalizado = normalizar(cifRoyal);\n  const royalCoincide = cifRoyalValidos.some((c) => normalizar(c) === cifRoyalNormalizado);\n  faltaOIncorrectoCifRoyal = !cifRoyal || cifRoyal.toLowerCase() === 'desconocido' || !royalCoincide;\n}\n\nreturn [{\n  json: {\n    ...item.json,\n    requiere_verificar_cif: requiereVerificarCif,\n    falta_cif_proveedor: faltaCifProveedor,\n    falta_o_incorrecto_cif_royal: faltaOIncorrectoCifRoyal,\n    hay_problema_cif: faltaCifProveedor || faltaOIncorrectoCifRoyal,\n  },\n  binary: item.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        10400,
        2896
      ],
      "id": "e7040f3f-2dd5-43ec-9883-d85145b27cf5",
      "name": "Comprobar CIF factura"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-problema-cif",
              "leftValue": "={{ $json.hay_problema_cif }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        10624,
        2896
      ],
      "id": "9c2d9e58-5c30-4101-9af6-f3ccac427d5c",
      "name": "¿Hay problema con el CIF?"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com, javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com",
        "subject": "=AVISO - Sistema Facturas | CIF/VAT no detectado: {{ $json.nombre_factura_final }} - No se ha guardado la factura por falta de CIF/VAT",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tFalta el CIF/VAT del proveedor o de Royal en una factura.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fff6e5; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9888;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tRevisar CIF/VAT de la factura\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tAl analizar la factura <b style=\"color:#e51947;\">{{ $json.nombre_factura_final }}</b>, no se ha podido confirmar el CIF/VAT de una o ambas partes. El archivo <b>no se ha guardado</b>, revíselo y vuelve a ingresarlo.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f5dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\t{{ $json.falta_cif_proveedor ? '<li>No se ha detectado el CIF/VAT del proveedor.</li>' : '' }}\n\t\t\t\t\t\t\t\t\t{{ $json.falta_o_incorrecto_cif_royal ? '<li>No se ha detectado el CIF de Royal (B91637967 / ESB91637967), o no coincide.</li>' : '' }}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<p style=\"margin:0 0 12px 0; font-size:12px; font-weight:700; color:#29292b; text-transform:uppercase; letter-spacing:0.06em;\">\n\t\t\t\t\t\t\tDatos detectados por Gemini\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; width:150px; color:#8a8d93;\">Proveedor</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.proveedor }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; color:#8a8d93;\">CIF/VAT proveedor</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.cif_proveedor }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; color:#8a8d93;\">CIF/VAT Royal detectado</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.cif_royal }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false,
          "attachments": "={{ Object.keys($binary || {}).join(',') }}"
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        10848,
        3024
      ],
      "id": "71e5de98-5a1d-463c-91d1-5d74a407332c",
      "name": "Aviso CIF faltante o incorrecto",
      "webhookId": "480b4c28-3626-4112-bed0-85332cbcdede",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const item = $input.first();\nconst binaryKeys = Object.keys(item.binary || {});\nlet cifrado = false;\nlet archivosCifrados = [];\n\nfor (const key of binaryKeys) {\n  const buffer = await this.helpers.getBinaryDataBuffer(0, key);\n  if (buffer.toString('latin1').includes('/Encrypt')) {\n    cifrado = true;\n    archivosCifrados.push(item.binary[key].fileName || key);\n  }\n}\n\nreturn [{\n  json: { ...item.json, pdf_cifrado: cifrado, archivos_cifrados: archivosCifrados },\n  binary: item.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5920,
        2224
      ],
      "id": "198cefad-43c9-4581-a040-df9ab44c7ca7",
      "name": "Detectar PDF cifrado (subida)"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-pdf-cifrado-subida",
              "leftValue": "={{ $json.pdf_cifrado }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        6144,
        2224
      ],
      "id": "5200bf78-ce98-43e8-9b9f-4b2bbeab7911",
      "name": "¿Hay PDF cifrado?"
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "Documento cifrado detectado",
        "completionMessage": "=<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" height=\"36\">\n<br><br>\nHemos detectado que el archivo <b>{{ $json.archivos_cifrados.join(', ') }}</b> está protegido con contraseña.\n<br><br>\nPor favor, <b>elimina la contraseña del PDF</b> (descífralo) antes de volver a subirlo. Mientras esté cifrado no podemos procesarlo.\n<br><br>\nSi no sabes cómo quitar la contraseña, contacta con <b>javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com</b>.\n<br><br>\nDisculpa las molestias.",
        "options": {
          "formTitle": "Royal Comunicación",
          "customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-focus-border: #e51947;\n\t--color-submit-btn-bg: #e51947;\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\t--color-header-subtext: #8a8d93;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 18px;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\t--card-padding: 32px;\n\t--card-margin-bottom: 20px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}"
        }
      },
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.3,
      "position": [
        6368,
        1936
      ],
      "id": "e2ce42d8-b5b7-47b8-adf3-cd649d4adcc9",
      "name": "PDF cifrado - Formulario",
      "webhookId": "9dd9c9a8-7ff4-4abd-90c5-cd8fdf086f0f"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "={{ $json[\"Introduzca su email (Obligatorio)\"] }},javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com ",
        "subject": "Documento cifrado detectado - Factura no procesada",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tTu factura no se ha procesado porque el PDF esta cifrado.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fff6e5; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9888;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tDocumento cifrado detectado\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tHemos detectado que el archivo <b style=\"color:#e51947;\">{{ $json.archivos_cifrados.join(', ') }}</b> que intentaste subir está protegido con contraseña, así que <b>no se ha procesado ni guardado</b>.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f5dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\tPor favor, <b>elimina la contraseña del PDF</b> (descífralo) y vuelve a subirlo desde el formulario.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\t<b>Subir de nuevo:</b> <a href=\"https://royalcomunicacion.app.n8n.cloud/form/gestion-de-facturas\" target=\"_blank\" style=\"color:#e51947;\">Ir al formulario</a>\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\tSi no sabes cómo quitar la contraseña, contacta con <b>javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com o a dirección</b>.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        6368,
        2128
      ],
      "id": "38a61cac-bace-4ee3-add7-3708d9805ac9",
      "name": "Aviso PDF cifrado (email usuario)",
      "webhookId": "1fb3d073-a7ce-41e2-953e-e01679f8d837",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nreturn $input.all().map(item => ({\n  json: { ...item.json, formulario_cerrado: staticData.formulario_cerrado === true },\n  binary: item.binary,\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5472,
        2128
      ],
      "id": "5924bd77-4904-4928-9028-6328188aa239",
      "name": "Leer estado formulario"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "meta-fecha",
              "name": "fecha_recepcion",
              "type": "string",
              "value": "={{ $now.toISO() }}"
            },
            {
              "id": "meta-nombre",
              "name": "nombre_archivo",
              "type": "string",
              "value": "=Factura_{{ $now.toFormat('yyyy-MM-dd_HH-mm-ss-SSS') }}_{{ Math.random().toString(36).slice(2,6) }}.{{ $binary.data.fileExtension }}"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "60854215-c91b-4482-a83e-50c95c8db745",
      "name": "Añadir metadatos",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        7936,
        3088
      ]
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "Subida procesada",
        "completionMessage": "=Este es el resultado de tu subida:\n<br><br>\n{{ $input.all().map(i => i.json).map(r => {\n  const txt = {\n    guardada: '✅ Guardada en la carpeta <b>Semana ' + $now.startOf('week').toFormat('dd/MM') + ' a ' + $now.endOf('week').toFormat('dd/MM') + '</b>',\n    duplicada: '⚠️ No guardada: esta factura ya se había subido antes. Te hemos enviado un email con los detalles.',\n    cif: '❌ No guardada: no se ha podido verificar el CIF/VAT. Revísala y vuelve a subirla.',\n  };\n  return '<b>' + (r.nombre || 'Factura') + '</b><br>' + (txt[r.resultado] || '');\n}).join('<br><br>') }}\n<br><br>\n<b>Subir otro archivo:</b> <a href=\"https://royalcomunicacion.app.n8n.cloud/form/gestion-de-facturas\" target=\"_blank\">Subir otro archivo</a>",
        "options": {
          "formTitle": "Royal Comunicación"
        }
      },
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.3,
      "position": [
        6816,
        2512
      ],
      "id": "f33f8e9f-a21c-4f9a-8fba-62ae1c5e3540",
      "name": "Form2",
      "webhookId": "0c2af0f3-53f9-4419-962f-82fc406262bd"
    },
    {
      "parameters": {
        "amount": 1.5
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        6816,
        2704
      ],
      "id": "9b9e991c-27cf-4f32-aa71-f7e5291016b3",
      "name": "Wait4",
      "webhookId": "1fd7d07b-6167-4991-bada-b6af6e743c01"
    },
    {
      "parameters": {
        "jsCode": "const inputItem = $input.first();\nconst binaryKeys = Object.keys(inputItem.binary || {});\n\nconst authResponse = await this.helpers.httpRequest({\n  method: 'POST',\n  url: 'https://api.ilovepdf.com/v1/auth',\n  body: {\n    public_key: 'project_public_814ccf16704eced217d6fe3157c409a4_Exrch15cde70303f8a78e2b682d98ee6c2740',\n  },\n  json: true,\n});\n\nconst token = authResponse.token;\n\nreturn binaryKeys.map((key) => ({\n  json: { ...inputItem.json, ilove_token: token },\n  binary: {\n    data: inputItem.binary[key],\n  },\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        6368,
        3072
      ],
      "id": "e3d984b6-ad32-48b8-b61f-10e1649ff2e3",
      "name": "Code in JavaScript4"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        6592,
        3072
      ],
      "id": "43c1fa24-9914-4018-8de6-e6490dfb917d",
      "name": "Loop Over Items1"
    },
    {
      "parameters": {
        "operation": "completion",
        "completionTitle": "Formulario temporalmente cerrado",
        "completionMessage": "<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" height=\"36\">\n<br><br>\nEl formulario está cerrado temporalmente <b>por mantenimiento o porque se está unificando todos los PDFs</b>, por favor espere para poder acceder.\n<br><br>\nDisculpa las molestias.",
        "options": {
          "formTitle": "Royal Comunicación",
          "customCss": ":root {\n\t--font-family: 'Open Sans', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-focus-border: #e51947;\n\t--color-submit-btn-bg: #e51947;\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\t--color-header-subtext: #8a8d93;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 18px;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\t--card-padding: 32px;\n\t--card-margin-bottom: 20px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}"
        }
      },
      "type": "n8n-nodes-base.form",
      "typeVersion": 2.3,
      "position": [
        5920,
        2032
      ],
      "id": "79296d32-685a-40a4-a8fb-fd24a2adce96",
      "name": "Form3",
      "webhookId": "950a515e-cafe-4d66-b2c7-7f815423d287"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-es-jpg",
              "leftValue": "={{ $binary.data.mimeType }}",
              "rightValue": "image/jpeg",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "e08a03c0-227e-448a-8444-b5eb3f4a9692",
      "name": "¿Es JPG?1",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        6816,
        3088
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.server }}/v1/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ $json.task }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "id": "f4642d01-272d-44db-8690-2521e6375dec",
      "name": "Upload imagen a ImagePDF1",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        7264,
        2896
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $('Start ImagePDF Task').item.json.server }}/v1/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"task\": \"{{ $('Start ImagePDF Task').item.json.task }}\",\n  \"tool\": \"imagepdf\",\n  \"files\": {{ JSON.stringify([{ server_filename: $json.server_filename, filename: 'imagen.pdf' }]) }}\n}",
        "options": {}
      },
      "id": "d6d94a36-0762-4a6d-a337-57b00740da4a",
      "name": "Process (ImagePDF)1",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        7488,
        2896
      ]
    },
    {
      "parameters": {
        "url": "=https://{{ $('Start ImagePDF Task').item.json.server }}/v1/download/{{ $('Start ImagePDF Task').item.json.task }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "id": "ad89edce-8d3d-4036-9e29-adceae70131f",
      "name": "Download PDF convertido1",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        7712,
        2896
      ]
    },
    {
      "parameters": {
        "jsCode": "const inputItem = $input.first();\n\nconst startResponse = await this.helpers.httpRequest({\n  method: 'GET',\n  url: 'https://api.ilovepdf.com/v1/start/imagepdf',\n  headers: {\n    Authorization: `Bearer ${inputItem.json.ilove_token}`,\n  },\n  json: true,\n});\n\nreturn [{\n  json: {\n    ...inputItem.json,\n    server: startResponse.server,\n    task: startResponse.task,\n  },\n  binary: inputItem.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        7040,
        2896
      ],
      "id": "72498071-c24c-4df4-918e-89f2dc9ddc00",
      "name": "Start ImagePDF Task"
    },
    {
      "parameters": {
        "resource": "fileFolder",
        "queryString": "=Semana {{ $now.startOf('week').toFormat('dd/MM') }} a {{ $now.endOf('week').toFormat('dd/MM') }}",
        "returnAll": true,
        "filter": {
          "folderId": {
            "__rl": true,
            "value": "1fCvWq3c5NnitM0D_ISDNZZfUymYr4dSz",
            "mode": "id"
          },
          "whatToSearch": "folders"
        },
        "options": {}
      },
      "id": "ccf847c0-5d52-4d6f-a922-22d90891dc53",
      "name": "Buscar carpeta semana1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        12416,
        2448
      ],
      "alwaysOutputData": true,
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "sIdXJwpdKQA7pd6B",
          "name": "Cuenta Joaquín (n8n compartida - no usar)"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-existe-carpeta",
              "leftValue": "={{ $json.id }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "3a18d806-1714-4806-96fc-83677bf8773d",
      "name": "¿Existe carpeta semana?1",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        12640,
        2448
      ]
    },
    {
      "parameters": {
        "resource": "folder",
        "name": "=Semana {{ $now.startOf('week').toFormat('dd/MM') }} a {{ $now.endOf('week').toFormat('dd/MM') }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "1fCvWq3c5NnitM0D_ISDNZZfUymYr4dSz",
          "mode": "id"
        },
        "options": {}
      },
      "id": "6942d637-509d-470e-b022-e4bda451e3e4",
      "name": "Crear carpeta semana1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        12864,
        2512
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "ROHYz6cpOHpI0blT",
          "name": "Cuenta Google Drive Javier (Compartida n8n - No usar)"
        }
      }
    },
    {
      "parameters": {
        "name": "={{ $json.nombre_factura_final }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "={{ $json.id }}",
          "mode": "id"
        },
        "options": {}
      },
      "id": "eb3d5c14-127a-4999-875b-af08dea11b0d",
      "name": "Guardar factura1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        13312,
        2640
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "ROHYz6cpOHpI0blT",
          "name": "Cuenta Google Drive Javier (Compartida n8n - No usar)"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "nombre-final",
              "name": "nombre_factura_final",
              "type": "string",
              "value": "={{ $json.proveedor.replace(/[^a-zA-Z0-9]/g, '_') }}_{{ $json.fecha }}_{{ $json.numero_factura.replace(/[^a-zA-Z0-9]/g, '_') }}.{{ $binary.data.fileExtension }}"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "b5a6c904-cbd2-4c11-ad72-a73bebb0038c",
      "name": "Renombrar factura1",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        9056,
        3088
      ]
    },
    {
      "parameters": {
        "resource": "document",
        "modelId": {
          "__rl": true,
          "value": "models/gemini-3.5-flash",
          "mode": "list",
          "cachedResultName": "models/gemini-3.5-flash"
        },
        "text": "Eres un asistente que extrae datos de facturas. Analiza la factura adjunta y devuelve ÚNICAMENTE estos cinco campos:\n- proveedor: el nombre de la empresa/proveedor que emite la factura y presta el servicio o vende el producto. IMPORTANTE: Royal Comunicación (o cualquier variante de su nombre, como \"Royal\", \"Royal Comunicación\", \"Royal Profit\", etc.) es siempre el CLIENTE que compra/recibe el servicio en estas facturas, por lo que NUNCA puede ser el valor de \"proveedor\". Si detectas el nombre \"Royal\" en el documento, ese es el cliente/destinatario, no el proveedor — busca el otro nombre de empresa que aparece en la factura (el que realmente presta el servicio o emite el documento) y usa ese como proveedor.\n- fecha: la fecha de emisión de la factura, en formato YYYY-MM-DD\n- numero_factura: el número/identificador de la factura tal como aparece en el documento\n- cif_proveedor: el CIF, NIF o número de identificación fiscal (VAT number si es una empresa extranjera/intracomunitaria) del proveedor que emite la factura, tal como aparece en el documento. Este CIF nunca debe coincidir con el de Royal Comunicación (ver cif_royal más abajo), ya que Royal es el cliente, no el proveedor.\n- cif_royal: el CIF o VAT number de Royal Comunicación (el cliente/receptor de la factura). El CIF de Royal Comunicación es B91637967, o ESB91637967 si el proveedor es intracomunitario/extranjero y la factura usa el formato VAT con prefijo de país. Busca ese valor exacto (puede aparecer con o sin guiones/espacios, y con o sin el prefijo \"ES\") en los datos del destinatario/cliente de la factura, y devuélvelo tal como esté escrito en el documento.\n\nSi no puedes determinar alguno de estos datos con certeza, o el dato no aparece en el documento, devuelve el valor \"desconocido\" para ese campo en concreto. No inventes datos.\n\n\nUtiliza esta estructura:\n\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"proveedor\": { \"type\": \"string\" },\n    \"fecha\": { \"type\": \"string\" },\n    \"numero_factura\": { \"type\": \"string\" },\n    \"cif_proveedor\": { \"type\": \"string\" },\n    \"cif_royal\": { \"type\": \"string\" }\n  },\n  \"required\": [\"proveedor\", \"fecha\", \"numero_factura\", \"cif_proveedor\", \"cif_royal\"]\n}",
        "inputType": "binary",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1,
      "position": [
        8608,
        3088
      ],
      "id": "a0c5b915-6a43-46fb-8fd4-0804b4fa6d89",
      "name": "Analyze document1",
      "retryOnFail": true,
      "waitBetweenTries": 5000,
      "maxTries": 5,
      "credentials": {
        "googlePalmApi": {
          "id": "A2Gg7QnCuLQgVgmh",
          "name": "API Gemini Royal (De Pago)"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const raw = $input.first().json.content.parts[0].text;\nconst clean = raw.replace(/```json\\n?/g, '').replace(/```/g, '').trim();\nconst data = JSON.parse(clean);\n\nreturn [{\n  json: {\n    proveedor: data.proveedor,\n    fecha: data.fecha,\n    numero_factura: data.numero_factura,\n    cif_proveedor: data.cif_proveedor,\n    cif_royal: data.cif_royal\n  },\n  binary: $('Añadir metadatos').item.binary\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8832,
        3088
      ],
      "id": "b4e4e068-b3e9-4875-be9d-9fd62e7d4a36",
      "name": "Code in JavaScript5"
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "id": "695f5f72-1f43-488d-9bf2-7dd6f73e0ed5",
      "name": "Merge2",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.1,
      "position": [
        13088,
        2640
      ]
    },
    {
      "parameters": {
        "jsCode": "return [{\n  binary: $('Añadir metadatos').item.binary\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8384,
        3088
      ],
      "id": "06bfb742-fd97-4cb9-9b58-d128682175bb",
      "name": "Code in JavaScript6",
      "retryOnFail": true,
      "waitBetweenTries": 5000,
      "maxTries": 5
    },
    {
      "parameters": {
        "content": "## Analizar documento, renombrarlo (número factura, empresa, fecha), categorizarlo en drive",
        "height": 416,
        "width": 3222,
        "color": 3
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        8288,
        2832
      ],
      "typeVersion": 1,
      "id": "1dd03dce-e118-4935-a545-1d964143e70a",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "amount": 1
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        7712,
        3216
      ],
      "id": "3a54b38d-7110-4ce0-8528-c59dba83f89d",
      "name": "Wait6",
      "webhookId": "9666ba94-4633-491d-b661-9159f9de5016"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "ff376709-0eec-40d5-8b35-429ce9c0aae6",
              "leftValue": "={{ $json.formulario_cerrado }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        5696,
        2128
      ],
      "id": "203876df-abe6-4218-a095-e68c30023aaa",
      "name": "¿Formulario cerrado?1"
    },
    {
      "parameters": {
        "jsCode": "const item = $input.first();\nconst proyecto = (item.json['Proyecto'] || '').trim();\nconst gastoAutorizadoPor = (item.json['Gasto autorizado por'] || '').trim();\nlet tarjeta = (item.json['Seleccione tarjeta'] || '').trim();\nif (tarjeta === '-') tarjeta = '';\nconst observaciones = (item.json['Observaciones'] || '').trim();\nconst hayCamposEspeciales = !!(proyecto || gastoAutorizadoPor || tarjeta || observaciones);\n\nreturn [{\n  json: {\n    ...item.json,\n    proyecto,\n    gasto_autorizado_por: gastoAutorizadoPor,\n    tarjeta,\n    observaciones,\n    hay_campos_especiales: hayCamposEspeciales,\n  },\n  binary: item.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        6368,
        2320
      ],
      "id": "a9242415-f156-4b56-8a0f-3aca22f51f6f",
      "name": "Comprobar campos adicionales1"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-campos-especiales",
              "leftValue": "={{ $json.hay_campos_especiales }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        6592,
        2320
      ],
      "id": "c134f925-8687-442d-bc7f-d0ea7758a303",
      "name": "¿Hay campos especiales rellenados?1"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "=javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com",
        "subject": "=AVISO - Sistema Facturas | Gasto autorizado por {{ $json.gasto_autorizado_por }}",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tAviso del sistema de facturas: Proyecto, Gasto autorizado por u Observaciones.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fdf1f4; font-size:26px; color:#e51947; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9993;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tAVISO - Sistema Facturas\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tSe ha subido una factura con información adicional que requiere revisión. Revisa los datos y el/los archivo(s) adjunto(s).\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<b style=\"color:#e51947;\">Subido por:</b> {{ $json[\"Introduzca su email (Obligatorio)\"] }}\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf1f4; border:1px solid #F8CBDC; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\t{{ $json.proyecto ? '<b style=\"color:#e51947;\">Proyecto:</b> ' + $json.proyecto + '<br>' : '' }}\n\t\t\t\t\t\t\t\t\t{{ $json.gasto_autorizado_por ? '<b style=\"color:#e51947;\">Gasto autorizado por:</b> ' + $json.gasto_autorizado_por + '<br>' : '' }}\n\t\t\t\t\t\t\t\t\t{{ $json.tarjeta ? '<b style=\"color:#e51947;\">Tarjeta:</b> ' + $json.tarjeta + '<br>' : '' }}\n\t\t\t\t\t\t\t\t\t{{ $json.observaciones ? '<b style=\"color:#e51947;\">Observaciones:</b> ' + $json.observaciones : '' }}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:13px; line-height:1.6; color:#8a8d93;\">\n\t\t\t\t\t\tArchivo(s) adjunto(s) a este correo: {{ Object.values($binary || {}).map(b => b.fileName).join(', ') }}\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false,
          "attachments": "={{ Object.keys($binary || {}).join(',') }}"
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        6816,
        2320
      ],
      "id": "af8435d9-e167-4c62-8f92-0834319c705c",
      "name": "Send email5",
      "webhookId": "3acdf766-0ae0-4a30-982c-29d0a4a3887f",
      "executeOnce": true,
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "={{ $('On form submission').first().json[\"Introduzca su email (Obligatorio)\"] }}",
        "subject": "Resultado de la subida de facturas",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tFactura subida correctamente a Royal Comunicación.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\n\t\t\t\t<!-- barra de acento -->\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\n\t\t\t\t<!-- logo -->\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\n\t\t\t\t<!-- cabecera -->\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fdf1f4; font-size:26px; color:#e51947; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t{{ $('Loop Over Items1').all(0).every(i => i.json.resultado === 'guardada') ? '&#10003;' : '&#9888;' }}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\t{{ (() => {\n  const r = $('Loop Over Items1').all(0).map(i => i.json.resultado);\n  if (r.length && r.every(x => x === 'guardada')) return '¡Factura/s subida/s con éxito!';\n  if (r.length && r.every(x => x === 'duplicada')) return 'Factura duplicada';\n  if (r.length && r.every(x => x === 'cif')) return 'Factura no guardada';\n  return 'Subida procesada';\n})() }}\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\n\t\t\t\t<!-- cuerpo -->\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tEste es el resultado de tu subida:\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\t{{ $('Loop Over Items1').all(0).map(i => i.json).map(r => {\n\t\t\t\t\t\t  const txt = {\n\t\t\t\t\t\t    guardada: '✅ Guardada en la carpeta <b>Semana ' + $now.startOf('week').toFormat('dd/MM') + ' a ' + $now.endOf('week').toFormat('dd/MM') + '</b>',\n\t\t\t\t\t\t    duplicada: '⚠️ No guardada: esta factura ya se había subido antes. Te hemos enviado un email con los detalles.',\n\t\t\t\t\t\t    cif: '❌ No guardada: no se ha podido verificar el CIF/VAT. Revísala y vuelve a subirla.',\n\t\t\t\t\t\t  };\n\t\t\t\t\t\t  return '<b style=\"color:#e51947;\">' + (r.nombre || 'Factura') + '</b><br>' + (txt[r.resultado] || '');\n\t\t\t\t\t\t}).join('<br><br>') }}\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\n\t\t\t\t<!-- botón CTA -->\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 36px 32px; text-align:center;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"border-radius:10px; background-color:#e51947;\">\n\t\t\t\t\t\t\t\t\t<a href=\"https://royalcomunicacion.app.n8n.cloud/form/gestion-de-facturas\" target=\"_blank\" style=\"display:inline-block; padding:14px 28px; font-family:Arial, Helvetica, sans-serif; font-size:14px; font-weight:700; color:#ffffff; text-decoration:none; border-radius:10px;\">\n\t\t\t\t\t\t\t\t\t\tSubir otro archivo\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\n\t\t\t</table>\n\n\t\t\t<!-- pie -->\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        7040,
        2704
      ],
      "id": "5f560717-2f73-4ffd-92e7-9c0ad3f77c09",
      "name": "Send email6",
      "webhookId": "3acdf766-0ae0-4a30-982c-29d0a4a3887f",
      "executeOnce": true,
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "operation": "append",
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Usuario": "={{ $('On form submission').item.json[\"Introduzca su email (Obligatorio)\"] }}",
            "Fecha y hora": "={{ $now.toFormat('yyyy-MM-dd HH:mm:ss') }}",
            "Archivo temporal": "={{ $('Añadir metadatos').item.json.nombre_archivo }}",
            "Proyecto": "={{ $('On form submission').item.json.Proyecto || \"No rellenado\" }}",
            "Gasto autorizado por": "={{ $('On form submission').item.json[\"Gasto autorizado por\"] || \"No rellenado\" }}",
            "Observaciones": "={{ $('On form submission').item.json.Observaciones || \"No rellenado\" }}",
            "Tarjeta utilizada": "={{ $('On form submission').item.json[\"Seleccione tarjeta\"] || \"No rellenado\" }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "Usuario",
              "displayName": "Usuario",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Archivo temporal",
              "displayName": "Archivo temporal",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Nombre archivo guardado",
              "displayName": "Nombre archivo guardado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "URL archivo",
              "displayName": "URL archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fecha y hora",
              "displayName": "Fecha y hora",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true
            },
            {
              "id": "Proyecto",
              "displayName": "Proyecto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Gasto autorizado por",
              "displayName": "Gasto autorizado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Observaciones",
              "displayName": "Observaciones",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Tarjeta utilizada",
              "displayName": "Tarjeta utilizada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Clave factura",
              "displayName": "Clave factura",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Duplicado de",
              "displayName": "Duplicado de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "ID archivo",
              "displayName": "ID archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fusionada",
              "displayName": "Fusionada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        8160,
        3088
      ],
      "id": "552e08af-d362-4421-a315-44a37cd42a74",
      "name": "Registrar log Excel2",
      "alwaysOutputData": false,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const items = $input.all();\nconst archivosCifrados = [];\n\nfor (let i = 0; i < items.length; i++) {\n  const item = items[i];\n  const binaryKeys = Object.keys(item.binary || {});\n  for (const key of binaryKeys) {\n    const buffer = await this.helpers.getBinaryDataBuffer(i, key);\n    if (buffer.toString('latin1').includes('/Encrypt')) {\n      archivosCifrados.push(item.json.name || item.binary[key].fileName || key);\n      break;\n    }\n  }\n}\n\nconst hayCifrados = archivosCifrados.length > 0;\n\nreturn items.map(item => ({\n  json: { ...item.json, hay_pdf_cifrado_semana: hayCifrados, archivos_cifrados_semana: archivosCifrados },\n  binary: item.binary,\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        7488,
        4736
      ],
      "id": "42b63a65-7979-4fc3-be97-b98b81d9401c",
      "name": "Detectar PDFs cifrados (semana)",
      "retryOnFail": true,
      "waitBetweenTries": 5000
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-pdf-cifrado-semana",
              "leftValue": "={{ $json.hay_pdf_cifrado_semana }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        7712,
        4736
      ],
      "id": "203b1c84-b8aa-460d-b78b-41f17a8eb5e1",
      "name": "¿Hay PDFs cifrados (semana)?"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com",
        "subject": "⚠️ Fusión de facturas detenida: PDF cifrado detectado",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tSe ha detenido la fusion semanal por un PDF cifrado.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fff6e5; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9888;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tProceso detenido: PDF cifrado\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tSe ha iniciado la unificación semanal de facturas, pero se ha detectado que uno o más PDFs están protegidos con contraseña. El proceso <b>se ha detenido</b> y no se ha generado el PDF unificado.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f5dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\t<b style=\"color:#b8860b;\">Archivo(s) cifrado(s):</b> {{ $json.archivos_cifrados_semana.join(', ') }}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tPor favor, entra en la carpeta semanal de Drive, elimina la contraseña del archivo indicado y vuelve a lanzar la unificación desde el formulario <b>\"Unir todas las facturas subidas a Drive\"</b>.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        10624,
        4928
      ],
      "id": "bce4591e-65d4-4c86-bfb5-b2a82e16705e",
      "name": "Aviso PDF cifrado (semana)",
      "executeOnce": true,
      "webhookId": "02b5eb03-0876-4884-ad80-1cd99bcd065f",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "operation": "download",
        "fileId": {
          "__rl": true,
          "value": "={{ $json.id_archivo }}",
          "mode": "id"
        },
        "options": {}
      },
      "id": "421a8d95-b831-41d8-a4c0-a044785d1a35",
      "name": "Descargar cada PDF1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        6816,
        4816
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "ROHYz6cpOHpI0blT",
          "name": "Cuenta Google Drive Javier (Compartida n8n - No usar)"
        }
      },
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "name": "=Facturas_semana_{{ $now.minus({days: 7}).toFormat('yyyy-MM-dd') }}_a_{{ $now.toFormat('yyyy-MM-dd') }}.pdf",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "={{ $('Crear carpeta backup semana1').first().json.id }}",
          "mode": "id"
        },
        "options": {}
      },
      "id": "57b3c718-1b27-4b62-830c-8be8972a2b05",
      "name": "Archivar semana procesada1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        10400,
        4496
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "ROHYz6cpOHpI0blT",
          "name": "Cuenta Google Drive Javier (Compartida n8n - No usar)"
        }
      },
      "notes": "Mueve los PDFs de la semana ya enviada a una carpeta historica, dejando la carpeta de la semana en curso vacia para la siguiente."
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.ilovepdf.com/v1/auth",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        5920,
        4816
      ],
      "id": "30155122-31ac-4bd6-97e4-02cadb17a18f",
      "name": "HTTP Request \"Auth iLoveAPI\"1",
      "executeOnce": true,
      "credentials": {
        "httpBasicAuth": {
          "id": "RGIhzpaasI3UKfBT",
          "name": "WordPress Trops.es"
        },
        "httpCustomAuth": {
          "id": "udOOvCOdGDreirK3",
          "name": "iLoveAPI Public Key"
        }
      }
    },
    {
      "parameters": {
        "url": "https://api.ilovepdf.com/v1/start/merge",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $json.token }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        6144,
        4816
      ],
      "id": "10debd93-669b-4e92-aa55-a12b67238055",
      "name": "HTTP Request \"Start Merge Task\"1",
      "executeOnce": true,
      "disabled": true
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $('HTTP Request \"Start Merge Task\"1').item.json.server }}/v1/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').item.json.token }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ $('HTTP Request \"Start Merge Task\"1').item.json.task }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        5248,
        4128
      ],
      "id": "3b748e4c-8438-4411-a9e2-bf39d1f89900",
      "name": "HTTP Request \"Upload File\"1",
      "disabled": true
    },
    {
      "parameters": {
        "jsCode": "return [{\n  json: {\n    files: $input.all().map((item, index) => ({\n      server_filename: item.json.server_filename,\n      filename: `factura_${index + 1}.pdf`,\n    })),\n  },\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5472,
        4128
      ],
      "id": "17cadc6a-690f-4d28-92da-696fbd407759",
      "name": "Code in JavaScript7",
      "disabled": true
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $('HTTP Request \"Start Merge Task\"1').first().json.server }}/v1/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"task\": \"{{ $('HTTP Request \\\"Start Merge Task\\\"1').first().json.task }}\",\n  \"tool\": \"merge\",\n  \"files\": {{ JSON.stringify($json.files) }}\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        5696,
        4128
      ],
      "id": "27069eec-3bc8-4cb0-97ee-619aefc6826a",
      "name": "HTTP Request \"Process (Merge)\"1",
      "retryOnFail": false,
      "waitBetweenTries": 5000,
      "disabled": true
    },
    {
      "parameters": {
        "url": "=https://{{ $('HTTP Request \"Start Merge Task\"1').first().json.server }}/v1/download/{{ $('HTTP Request \"Start Merge Task\"1').first().json.task }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        5920,
        4128
      ],
      "id": "83ba0d87-b5d3-4f11-9bfe-1937e105a6b2",
      "name": "HTTP Request \"Download PDF fusionado\"1",
      "disabled": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "347dcbdf-33f6-46cf-964b-9cb57d0176b5",
              "name": "nombre_archivo_semanal",
              "value": "=Facturas_semana_{{ $now.minus({days: 7}).toFormat('yyyy-MM-dd') }}_a_{{ $now.toFormat('yyyy-MM-dd') }}.pdf",
              "type": "string"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        9728,
        4544
      ],
      "id": "8df935cb-a7d1-442b-89ef-10ecd656f51c",
      "name": "Nombrar archivo semanal1"
    },
    {
      "parameters": {
        "resource": "folder",
        "name": "=Facturas_semana_{{ $now.minus({days: 7}).toFormat('yyyy-MM-dd') }}_a_{{ $now.toFormat('yyyy-MM-dd') }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "mode": "id",
          "value": "1TzWVCkhbCO8SaUKIZFIcWc16PV9d62Ny"
        },
        "options": {}
      },
      "id": "9f620815-c25c-4d92-b870-74112d361cda",
      "name": "Crear carpeta backup semana1",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        9952,
        4544
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "ROHYz6cpOHpI0blT",
          "name": "Cuenta Google Drive Javier (Compartida n8n - No usar)"
        }
      },
      "notes": "Mueve los PDFs de la semana ya enviada a una carpeta historica, dejando la carpeta de la semana en curso vacia para la siguiente."
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        10176,
        4496
      ],
      "id": "3a46cc10-e4e7-477c-a839-2cff9994bf11",
      "name": "Merge3"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com",
        "subject": "=Facturas semana {{ $now.minus({days: 7}).toFormat('dd/MM') }} - {{ $now.toFormat('dd/MM') }}",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tFacturas de la semana listas y enviadas a la Asesoría.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<h1 style=\"margin:0; font-size:22px; color:#29292b; font-weight:700;\">Facturas de la semana</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tAdjunto el PDF con todas las facturas recibidas esta semana (<b style=\"color:#e51947;\">{{ $now.minus({days: 7}).toFormat('dd/MM') }} - {{ $now.toFormat('dd/MM') }}</b>), ordenadas por fecha.\n\t\t\t\t\t\t{{ ($('Comprobar descargas').first().json.faltantes || []).length ? '<br><br><b style=\"color:#b8860b;\">&#9888; No se han encontrado en Drive y no van en el PDF:</b> ' + $('Comprobar descargas').first().json.faltantes.map(f => f.name).join(', ') : '' }}\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false,
          "attachments": "data"
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        9952,
        4736
      ],
      "id": "4c0aae7c-7a57-4730-a619-c7b1a982c401",
      "name": "Send email3",
      "webhookId": "0e5e0fda-9f03-4143-a2d5-5d022ffe09e9",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        10176,
        4736
      ],
      "id": "87ba48de-d54f-4d42-a1ea-6a0432a5a002",
      "name": "Wait7",
      "webhookId": "0243d0df-2eab-401a-86c6-c298050a4e4f"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.formulario_cerrado = true;\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5472,
        4816
      ],
      "id": "346cbe00-01d1-41b2-9f8f-0842e73f6f46",
      "name": "Cerrar formulario facturas1"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.formulario_cerrado = false;\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        10848,
        4912
      ],
      "id": "64718c8c-c3a0-4f81-bc78-00f9568b1d0b",
      "name": "Reabrir formulario facturas1",
      "executeOnce": true
    },
    {
      "parameters": {
        "amount": 7
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        5696,
        4816
      ],
      "id": "5340f50d-fe55-4f79-8d89-e59c9318e5c8",
      "name": "Wait8",
      "webhookId": "c3e06de3-1f70-41ae-b3cd-cb1aeb94ac0c"
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Nombre archivo guardado": "={{ $json.nombre_factura_final }}",
            "Archivo temporal": "={{ $('Añadir metadatos').item.json.nombre_archivo }}",
            "Clave factura": "={{ $json.clave_factura }}"
          },
          "matchingColumns": [
            "Archivo temporal"
          ],
          "schema": [
            {
              "id": "Usuario",
              "displayName": "Usuario",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Archivo temporal",
              "displayName": "Archivo temporal",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Nombre archivo guardado",
              "displayName": "Nombre archivo guardado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "URL archivo",
              "displayName": "URL archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fecha y hora",
              "displayName": "Fecha y hora",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Proyecto",
              "displayName": "Proyecto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Gasto autorizado por",
              "displayName": "Gasto autorizado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Observaciones",
              "displayName": "Observaciones",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Tarjeta utilizada",
              "displayName": "Tarjeta utilizada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Clave factura",
              "displayName": "Clave factura",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Duplicado de",
              "displayName": "Duplicado de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "ID archivo",
              "displayName": "ID archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fusionada",
              "displayName": "Fusionada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        9504,
        3088
      ],
      "id": "caf119c7-9040-4ec2-ab64-be352cbda55f",
      "name": "Registrar log Excel3",
      "alwaysOutputData": false,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      }
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "URL archivo": "={{ $json.webViewLink }}",
            "Archivo temporal": "={{ $('Añadir metadatos').item.json.nombre_archivo }}",
            "ID archivo": "={{ $json.id }}"
          },
          "matchingColumns": [
            "Archivo temporal"
          ],
          "schema": [
            {
              "id": "Usuario",
              "displayName": "Usuario",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Archivo temporal",
              "displayName": "Archivo temporal",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Nombre archivo guardado",
              "displayName": "Nombre archivo guardado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "URL archivo",
              "displayName": "URL archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Fecha y hora",
              "displayName": "Fecha y hora",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Proyecto",
              "displayName": "Proyecto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Gasto autorizado por",
              "displayName": "Gasto autorizado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Observaciones",
              "displayName": "Observaciones",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Tarjeta utilizada",
              "displayName": "Tarjeta utilizada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Clave factura",
              "displayName": "Clave factura",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Duplicado de",
              "displayName": "Duplicado de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "ID archivo",
              "displayName": "ID archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Fusionada",
              "displayName": "Fusionada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        13536,
        2640
      ],
      "id": "a1df6862-2fde-4761-bc10-8b0968645f84",
      "name": "Registrar log Excel4",
      "alwaysOutputData": false,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      }
    },
    {
      "parameters": {
        "batchSize": 100,
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        7936,
        4544
      ],
      "id": "cbf773b6-0339-4924-a6c6-094181206927",
      "name": "Loop Over Items (Lotes)"
    },
    {
      "parameters": {
        "jsCode": "const authToken = $('HTTP Request \"Auth iLoveAPI\"1').first().json.token;\n\nconst response = await this.helpers.httpRequest({\n  method: 'GET',\n  url: 'https://api.ilovepdf.com/v1/start/merge',\n  headers: {\n    Authorization: `Bearer ${authToken}`,\n  },\n  json: true,\n});\n\nreturn $input.all().map(item => ({\n  json: { ...item.json, lote_server: response.server, lote_task: response.task },\n  binary: item.binary,\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8160,
        4352
      ],
      "id": "374f008c-35aa-4440-b07b-54bbcfade4bd",
      "name": "Iniciar tarea de lote"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.lote_server }}/v1/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ $json.lote_task }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        8384,
        4352
      ],
      "id": "40014fcc-cf8d-43e7-ad2b-dded7eb770fc",
      "name": "HTTP Request \"Upload File\" (Lote)"
    },
    {
      "parameters": {
        "jsCode": "const task = $('Iniciar tarea de lote').first().json.lote_task;\nconst server = $('Iniciar tarea de lote').first().json.lote_server;\nreturn [{\n  json: {\n    lote_task: task,\n    lote_server: server,\n    files: $input.all().map((item, index) => ({\n      server_filename: item.json.server_filename,\n      filename: `factura_${index + 1}.pdf`,\n    })),\n  },\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8608,
        4352
      ],
      "id": "bb287a1b-107a-4801-8a47-94bc5ce82792",
      "name": "Code (Recopilar lote)"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.lote_server }}/v1/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"task\": \"{{ $json.lote_task }}\",\n  \"tool\": \"merge\",\n  \"files\": {{ JSON.stringify($json.files) }}\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        8832,
        4352
      ],
      "id": "1a24a6dd-2022-4772-90bb-82979caa0bf6",
      "name": "HTTP Request \"Process (Merge)\" (Lote)"
    },
    {
      "parameters": {
        "url": "=https://{{ $('Iniciar tarea de lote').first().json.lote_server }}/v1/download/{{ $('Iniciar tarea de lote').first().json.lote_task }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        9056,
        4352
      ],
      "id": "ceafef5c-6d4b-4348-8641-1711d3eea14b",
      "name": "HTTP Request \"Download PDF fusionado\" (Lote)"
    },
    {
      "parameters": {
        "jsCode": "return $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8160,
        4544
      ],
      "id": "c1fe39fe-c353-488a-a110-417197fad3f0",
      "name": "Code (Recopilar todos los lotes)"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-mas-de-un-lote",
              "leftValue": "={{ $input.all().length }}",
              "rightValue": 1,
              "operator": {
                "type": "number",
                "operation": "gt"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        8384,
        4544
      ],
      "id": "680ed54d-5f7f-4259-a94c-a3913671f938",
      "name": "¿Más de un lote?"
    },
    {
      "parameters": {
        "jsCode": "const authToken = $('HTTP Request \"Auth iLoveAPI\"1').first().json.token;\n\nconst response = await this.helpers.httpRequest({\n  method: 'GET',\n  url: 'https://api.ilovepdf.com/v1/start/merge',\n  headers: {\n    Authorization: `Bearer ${authToken}`,\n  },\n  json: true,\n});\n\nreturn $input.all().map(item => ({\n  json: { ...item.json, final_server: response.server, final_task: response.task },\n  binary: item.binary,\n}));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        8608,
        4672
      ],
      "id": "7a384d27-7bf8-42be-9646-52a782f3123f",
      "name": "Preparar fusión final"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.final_server }}/v1/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ $json.final_task }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        8832,
        4672
      ],
      "id": "add144b7-a2b7-4764-92fd-d8e8f1932815",
      "name": "HTTP Request \"Upload File\" (Final)"
    },
    {
      "parameters": {
        "jsCode": "const task = $('Preparar fusión final').first().json.final_task;\nconst server = $('Preparar fusión final').first().json.final_server;\nreturn [{\n  json: {\n    final_task: task,\n    final_server: server,\n    files: $input.all().map((item, index) => ({\n      server_filename: item.json.server_filename,\n      filename: `lote_${index + 1}.pdf`,\n    })),\n  },\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        9056,
        4672
      ],
      "id": "4c74ba19-ecdb-4dc7-90a5-af840a5e1da4",
      "name": "Code (Recopilar final)"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.final_server }}/v1/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"task\": \"{{ $json.final_task }}\",\n  \"tool\": \"merge\",\n  \"files\": {{ JSON.stringify($json.files) }}\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        9280,
        4672
      ],
      "id": "7409fb22-edbf-4334-9a81-d50e90739832",
      "name": "HTTP Request \"Process (Merge)\" (Final)"
    },
    {
      "parameters": {
        "url": "=https://{{ $('Preparar fusión final').first().json.final_server }}/v1/download/{{ $('Preparar fusión final').first().json.final_task }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('HTTP Request \"Auth iLoveAPI\"1').first().json.token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        9504,
        4672
      ],
      "id": "7a8c4eee-3e33-4a6d-90fc-403634b04516",
      "name": "HTTP Request \"Download PDF fusionado\" (Final)"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.formulario_cerrado = false;\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5472,
        3456
      ],
      "id": "074c91af-9fcb-42d6-ae27-ef7184912329",
      "name": "Reabrir formulario facturas2",
      "executeOnce": true
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.formulario_cerrado = true;\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5472,
        3680
      ],
      "id": "56c3077b-02be-4e1b-a843-2a885c573719",
      "name": "Cerrar formulario facturas",
      "executeOnce": true
    },
    {
      "parameters": {
        "authentication": "basicAuth",
        "formTitle": "Abrir formulario Facturas",
        "formDescription": "En caso de querer abrir manualmante el formulario de subida de pdfs (porque esté cerrado, sea necesario y urgente subir una factura) desde estas urls se pueden hacer, esto <b>debe de ser muy puntual, ya que afecta al funcionamiento del sistema.</b>",
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Abrir formulario >",
          "path": "abrir-form-facturas",
          "customCss": ":root {\n\t/* Fonts */\n\t--font-family: \"Open Sans\", sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 600;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-input-bg: #ffffff;\n\t--color-focus-border: #e51947;\n\t--color-focus-ring: rgba(229, 25, 71, 0.14);\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}\n\n*,\n::after,\n::before {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tmin-height: 100%;\n}\n\nbody {\n\tfont-family: var(--font-family);\n\tfont-weight: var(--font-weight-normal);\n\tfont-size: var(--font-size-body);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n\tmin-height: 100vh;\n\tbackground-color: var(--color-background);\n\tbackground-image:\n\t\tradial-gradient(720px 420px at 12% -8%, rgba(229, 25, 71, 0.10), transparent 60%),\n\t\tradial-gradient(760px 460px at 100% 0%, rgba(248, 203, 220, 0.55), transparent 55%);\n\tbackground-repeat: no-repeat;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.container {\n\tmargin: auto;\n\ttext-align: center;\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: var(--padding-container-top);\n\twidth: var(--container-width);\n}\n\n.test-notice {\n\tpadding: var(--padding-test-notice-vertical) var(--padding-test-notice-horizontal);\n\tcolor: var(--color-test-notice-text);\n\tbackground-color: var(--color-test-notice-bg);\n\tborder-radius: var(--border-radius-input);\n\tborder: 1px solid var(--color-test-notice-border);\n\tborder-left: 3px solid var(--color-brand);\n\tfont-size: var(--font-size-test-notice);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 16px;\n\ttext-align: left;\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card {\n\tposition: relative;\n\toverflow: hidden;\n\tpadding: var(--padding-card);\n\tbackground-color: var(--color-card-bg);\n\tborder: 1px solid var(--color-card-border);\n\tborder-radius: var(--border-radius-card);\n\tbox-shadow: var(--box-shadow-card);\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card::before {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 5px;\n\tbackground: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand-dark) 45%, var(--color-brand-light) 100%);\n}\n\n.n8n-link {\n\tpadding-bottom: var(--padding-container-top);\n}\n.n8n-link a {\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-medium);\n\tfont-size: var(--font-size-link);\n\ttext-decoration: none;\n}\n\n.n8n-link svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.form-header h1 {\n\tcolor: var(--color-header);\n\tfont-size: var(--font-size-header);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: -0.01em;\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-bottom: 14px;\n}\n\n.form-header h1::after {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twidth: 44px;\n\theight: 4px;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-brand), var(--color-brand-dark));\n}\n\n.form-header p {\n\tpadding-top: 16px;\n\tcolor: var(--color-link);\n\tfont-size: var(--font-size-paragraph);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 1.65;\n\ttext-align: left;\n}\n\n.form-header p a {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-medium);\n\ttext-decoration: none;\n}\n\n.form-header p a:hover {\n\ttext-decoration: underline;\n}\n\n.inputs-wrapper {\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: 8px;\n}\n\nform label {\n\tdisplay: block;\n\ttext-align: left;\n\tfont-size: var(--font-size-label);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-label);\n\tpadding-bottom: 8px;\n}\n\nform textarea {\n\tmax-width: 100%;\n}\n\nform .form-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tbackground-color: var(--color-input-bg);\n\tfont-weight: var(--font-weight-normal);\n\tpadding: var(--padding-form-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\nform textarea:focus,\nform input:focus {\n\toutline: none;\n\tborder-color: var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\n.select-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.select-input:focus-within {\n\tborder: 1px solid var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\nform select {\n\toutline: transparent;\n\tborder: none;\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tfont-weight: var(--font-weight-normal);\n\tbackground-color: var(--color-card-bg);\n\tpadding: var(--padding-form-input);\n\tborder-right: 12px solid transparent;\n}\n\ninput[type='date'] {\n\tfont-family: var(--font-family);\n}\n\n::placeholder {\n\topacity: var(--opacity-placeholder);\n}\n\n#submit-btn {\n\twidth: 100%;\n\theight: var(--submit-btn-height);\n\tpadding: var(--padding-form-input);\n\tborder-radius: var(--border-radius-input);\n\tborder: 0;\n\tfont-size: var(--font-size-input);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: 0.02em;\n\tfont-family: var(--font-family);\n\tbackground: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);\n\tcolor: var(--color-submit-btn-text);\n\tbox-shadow: 0 12px 24px -8px rgba(229, 25, 71, 0.55);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;\n}\n\n#submit-btn span {\n\tpadding-right: 6px;\n\tdisplay: none;\n}\n\n#submit-btn span svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tfill: var(--color-submit-btn-text);\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n\n#submit-btn:hover {\n\ttransform: translateY(-2px);\n\tbox-shadow: 0 16px 28px -8px rgba(229, 25, 71, 0.65);\n}\n\n#submit-btn:active {\n\ttransform: translateY(0);\n\tbox-shadow: 0 8px 16px -8px rgba(229, 25, 71, 0.55);\n}\n\n#submit-btn:disabled {\n\tcursor: not-allowed;\n\topacity: 0.7;\n\ttransform: none;\n}\n\n.error-hidden {\n\tdisplay: block;\n\tposition: relative;\n\tcolor: var(--color-error);\n\ttext-align: left;\n\tfont-size: var(--font-size-error);\n\tfont-weight: var(--font-weight-normal);\n\tvisibility: hidden;\n\tpadding-top: 6px;\n\tpadding-bottom: 9px;\n}\n\n.error-show {\n\tvisibility: visible;\n}\n\n/* multiselect ----------------------------------- */\n.multiselect {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.multiselect-option {\n\tpadding-top: 6px;\n\tdisplay: flex;\n}\n\n.multiselect-option label {\n\tpadding-left: 12px;\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-normal);\n\tcursor: pointer;\n}\n\n.multiselect-checkbox {\n\tvertical-align: middle;\n\tmin-width: var(--checkbox-size);\n}\n\ninput[type='checkbox'] {\n\tappearance: none;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tposition: relative;\n\ttransition: background 0.18s ease, border-color 0.18s ease;\n}\n.multiselect-checkbox:checked {\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder-color: var(--color-brand);\n}\n.multiselect-checkbox:checked::after {\n\tcontent: '✔';\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tcolor: white;\n\tfont-size: var(--font-size-label);\n\tfont-weight: bold;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox {\n\tborder-radius: 50%;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox:checked {\n\tbackground: white;\n\tborder-color: var(--color-brand);\n\tborder-width: 4px;\n\tborder-radius: 50%;\n}\n.multiselect[data-radio-select] .multiselect-checkbox:checked::after {\n\tcontent: '';\n}\n/* required field ----------------------------- */\nlabel.form-required::after {\n\tcontent: ' *';\n\tcolor: var(--color-required);\n}\n\nhr {\n\tborder: 0;\n\theight: 1px;\n\tborder-top: 1px solid var(--color-input-border);\n\tmargin-top: 24px;\n\tmargin-bottom: 24px;\n\tdisplay: none;\n}\n\n.file-input-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\ninput[type=\"file\"] {\n\tcursor: pointer;\n}\n\ninput[type=\"file\"]::file-selector-button {\n\tfont-family: var(--font-family);\n\tfont-size: 13px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-brand);\n\tbackground-color: var(--color-brand-tint);\n\tborder: 1px solid var(--color-brand-light);\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tmargin-right: 12px;\n\tcursor: pointer;\n\ttransition: background-color 0.18s ease, color 0.18s ease;\n}\n\ninput[type=\"file\"]::file-selector-button:hover {\n\tbackground-color: var(--color-brand-light);\n\tcolor: var(--color-brand-dark);\n}\n\n.clear-button {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 50%;\n\ttransform: translateY(-65%);\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder: none;\n\tborder-radius: var(--border-radius-clear-btn);\n\tfont-size: 14px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-family: var(--font-family);\n\tcolor: white;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\tline-height: 20px;\n\tcursor: pointer;\n\tdisplay: none;\n\ttransition: opacity 0.18s ease;\n}\n\n.clear-button:hover {\n\topacity: 0.85;\n}\n\ninput[type=\"file\"]:not(:empty) + .clear-button {\n\tdisplay: inline-block;\n}\n\ndiv.html {\n\ttext-align: left;\n\tcolor: var(--color-html-text);\n\tfont-size: var(--font-size-input);\n}\ndiv.html h1, div.html h2, div.html h3, div.html h4, div.html h5, div.html h6, div.html p, div.html ul, div.html ol, div.html a {\n\tfont-weight: var(--font-weight-normal);\n\tfont-style: normal;\n\tmargin-bottom: 8px;\n}\ndiv.html li {\n\tmargin-bottom: 8px;\n\tmargin-left: 24px;\n}\ndiv.html ul, div.html ol {\n\tfont-size: var(--font-size-input);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-self: stretch;\n\tline-height: normal;\n}\ndiv.html b {\n\tfont-weight: var(--font-weight-bold);\n}\ndiv.html h1 {\n\tfont-size: var(--font-size-html-h1);\n\tline-height: 35px;\n}\ndiv.html h2 {\n\tfont-size: var(--font-size-html-h2);\n\tline-height: 26px;\n}\ndiv.html h3 {\n\tfont-size: var(--font-size-html-h3);\n\tline-height: 24px;\n}\ndiv.html h4 {\n\tfont-size: var(--font-size-html-h4);\n\tline-height: 18px;\n}\ndiv.html h5 {\n\tfont-size: var(--font-size-html-h5);\n}\ndiv.html h6 {\n\tfont-size: var(--font-size-html-h6);\n}\ndiv.html p {\n\tmargin-bottom: 8px;\n}\ndiv.html a {\n\tcolor: var(--color-html-link);\n\tfont-size: var(--font-size-input);\n}\n\n@media only screen and (max-width: 500px) {\n\tbody {\n\t\tbackground-color: var(--color-background);\n\t}\n\thr {\n\t\tdisplay: block;\n\t}\n\t.container {\n\t\twidth: 95%;\n\t\tmin-height: 100vh;\n\t\tpadding: 24px;\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: 0px;\n\t\tbox-shadow: 0px 0px 0px 0px #ffffff;\n\t}\n\t.card {\n\t\tpadding: 20px;\n\t\tbackground-color: var(--color-card-bg);\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: var(--border-radius-card);\n\t\tbox-shadow: var(--box-shadow-card);\n\t\tmargin-bottom: 0px;\n\t}\n}\n\n\n.form-header p b,\n.form-header p strong {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-bold);\n}\n\n\n.form-header img {\n\tdisplay: block;\n\tmargin: 0 auto 12px auto;\n\theight: 40px;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        5248,
        3456
      ],
      "id": "eafdf665-ec49-4f84-a5f2-0c6d108e2330",
      "name": "Abrir Formulario",
      "webhookId": "df42b2ff-7fc1-4ce1-91bd-866742dda4ce",
      "credentials": {
        "httpBasicAuth": {
          "id": "eb3ciQbGH5EfWa7a",
          "name": "Acceder formulario Facturas"
        }
      }
    },
    {
      "parameters": {
        "authentication": "basicAuth",
        "formTitle": "Cerrar formulario Facturas",
        "formDescription": "En caso de querer abrir manualmante el formulario de subida de pdfs (porque esté cerrado, sea necesario y urgente subir una factura) desde estas urls se pueden hacer, esto <b>debe de ser muy puntual, ya que afecta al funcionamiento del sistema.</b>",
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Cerrar formulario >",
          "path": "cerrar-form-facturas",
          "customCss": ":root {\n\t/* Fonts */\n\t--font-family: \"Open Sans\", sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 600;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-input-bg: #ffffff;\n\t--color-focus-border: #e51947;\n\t--color-focus-ring: rgba(229, 25, 71, 0.14);\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}\n\n*,\n::after,\n::before {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tmin-height: 100%;\n}\n\nbody {\n\tfont-family: var(--font-family);\n\tfont-weight: var(--font-weight-normal);\n\tfont-size: var(--font-size-body);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n\tmin-height: 100vh;\n\tbackground-color: var(--color-background);\n\tbackground-image:\n\t\tradial-gradient(720px 420px at 12% -8%, rgba(229, 25, 71, 0.10), transparent 60%),\n\t\tradial-gradient(760px 460px at 100% 0%, rgba(248, 203, 220, 0.55), transparent 55%);\n\tbackground-repeat: no-repeat;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.container {\n\tmargin: auto;\n\ttext-align: center;\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: var(--padding-container-top);\n\twidth: var(--container-width);\n}\n\n.test-notice {\n\tpadding: var(--padding-test-notice-vertical) var(--padding-test-notice-horizontal);\n\tcolor: var(--color-test-notice-text);\n\tbackground-color: var(--color-test-notice-bg);\n\tborder-radius: var(--border-radius-input);\n\tborder: 1px solid var(--color-test-notice-border);\n\tborder-left: 3px solid var(--color-brand);\n\tfont-size: var(--font-size-test-notice);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 16px;\n\ttext-align: left;\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card {\n\tposition: relative;\n\toverflow: hidden;\n\tpadding: var(--padding-card);\n\tbackground-color: var(--color-card-bg);\n\tborder: 1px solid var(--color-card-border);\n\tborder-radius: var(--border-radius-card);\n\tbox-shadow: var(--box-shadow-card);\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card::before {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 5px;\n\tbackground: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand-dark) 45%, var(--color-brand-light) 100%);\n}\n\n.n8n-link {\n\tpadding-bottom: var(--padding-container-top);\n}\n.n8n-link a {\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-medium);\n\tfont-size: var(--font-size-link);\n\ttext-decoration: none;\n}\n\n.n8n-link svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.form-header h1 {\n\tcolor: var(--color-header);\n\tfont-size: var(--font-size-header);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: -0.01em;\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-bottom: 14px;\n}\n\n.form-header h1::after {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twidth: 44px;\n\theight: 4px;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-brand), var(--color-brand-dark));\n}\n\n.form-header p {\n\tpadding-top: 16px;\n\tcolor: var(--color-link);\n\tfont-size: var(--font-size-paragraph);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 1.65;\n\ttext-align: left;\n}\n\n.form-header p a {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-medium);\n\ttext-decoration: none;\n}\n\n.form-header p a:hover {\n\ttext-decoration: underline;\n}\n\n.inputs-wrapper {\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: 8px;\n}\n\nform label {\n\tdisplay: block;\n\ttext-align: left;\n\tfont-size: var(--font-size-label);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-label);\n\tpadding-bottom: 8px;\n}\n\nform textarea {\n\tmax-width: 100%;\n}\n\nform .form-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tbackground-color: var(--color-input-bg);\n\tfont-weight: var(--font-weight-normal);\n\tpadding: var(--padding-form-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\nform textarea:focus,\nform input:focus {\n\toutline: none;\n\tborder-color: var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\n.select-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.select-input:focus-within {\n\tborder: 1px solid var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\nform select {\n\toutline: transparent;\n\tborder: none;\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tfont-weight: var(--font-weight-normal);\n\tbackground-color: var(--color-card-bg);\n\tpadding: var(--padding-form-input);\n\tborder-right: 12px solid transparent;\n}\n\ninput[type='date'] {\n\tfont-family: var(--font-family);\n}\n\n::placeholder {\n\topacity: var(--opacity-placeholder);\n}\n\n#submit-btn {\n\twidth: 100%;\n\theight: var(--submit-btn-height);\n\tpadding: var(--padding-form-input);\n\tborder-radius: var(--border-radius-input);\n\tborder: 0;\n\tfont-size: var(--font-size-input);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: 0.02em;\n\tfont-family: var(--font-family);\n\tbackground: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);\n\tcolor: var(--color-submit-btn-text);\n\tbox-shadow: 0 12px 24px -8px rgba(229, 25, 71, 0.55);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;\n}\n\n#submit-btn span {\n\tpadding-right: 6px;\n\tdisplay: none;\n}\n\n#submit-btn span svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tfill: var(--color-submit-btn-text);\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n\n#submit-btn:hover {\n\ttransform: translateY(-2px);\n\tbox-shadow: 0 16px 28px -8px rgba(229, 25, 71, 0.65);\n}\n\n#submit-btn:active {\n\ttransform: translateY(0);\n\tbox-shadow: 0 8px 16px -8px rgba(229, 25, 71, 0.55);\n}\n\n#submit-btn:disabled {\n\tcursor: not-allowed;\n\topacity: 0.7;\n\ttransform: none;\n}\n\n.error-hidden {\n\tdisplay: block;\n\tposition: relative;\n\tcolor: var(--color-error);\n\ttext-align: left;\n\tfont-size: var(--font-size-error);\n\tfont-weight: var(--font-weight-normal);\n\tvisibility: hidden;\n\tpadding-top: 6px;\n\tpadding-bottom: 9px;\n}\n\n.error-show {\n\tvisibility: visible;\n}\n\n/* multiselect ----------------------------------- */\n.multiselect {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.multiselect-option {\n\tpadding-top: 6px;\n\tdisplay: flex;\n}\n\n.multiselect-option label {\n\tpadding-left: 12px;\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-normal);\n\tcursor: pointer;\n}\n\n.multiselect-checkbox {\n\tvertical-align: middle;\n\tmin-width: var(--checkbox-size);\n}\n\ninput[type='checkbox'] {\n\tappearance: none;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tposition: relative;\n\ttransition: background 0.18s ease, border-color 0.18s ease;\n}\n.multiselect-checkbox:checked {\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder-color: var(--color-brand);\n}\n.multiselect-checkbox:checked::after {\n\tcontent: '✔';\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tcolor: white;\n\tfont-size: var(--font-size-label);\n\tfont-weight: bold;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox {\n\tborder-radius: 50%;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox:checked {\n\tbackground: white;\n\tborder-color: var(--color-brand);\n\tborder-width: 4px;\n\tborder-radius: 50%;\n}\n.multiselect[data-radio-select] .multiselect-checkbox:checked::after {\n\tcontent: '';\n}\n/* required field ----------------------------- */\nlabel.form-required::after {\n\tcontent: ' *';\n\tcolor: var(--color-required);\n}\n\nhr {\n\tborder: 0;\n\theight: 1px;\n\tborder-top: 1px solid var(--color-input-border);\n\tmargin-top: 24px;\n\tmargin-bottom: 24px;\n\tdisplay: none;\n}\n\n.file-input-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\ninput[type=\"file\"] {\n\tcursor: pointer;\n}\n\ninput[type=\"file\"]::file-selector-button {\n\tfont-family: var(--font-family);\n\tfont-size: 13px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-brand);\n\tbackground-color: var(--color-brand-tint);\n\tborder: 1px solid var(--color-brand-light);\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tmargin-right: 12px;\n\tcursor: pointer;\n\ttransition: background-color 0.18s ease, color 0.18s ease;\n}\n\ninput[type=\"file\"]::file-selector-button:hover {\n\tbackground-color: var(--color-brand-light);\n\tcolor: var(--color-brand-dark);\n}\n\n.clear-button {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 50%;\n\ttransform: translateY(-65%);\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder: none;\n\tborder-radius: var(--border-radius-clear-btn);\n\tfont-size: 14px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-family: var(--font-family);\n\tcolor: white;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\tline-height: 20px;\n\tcursor: pointer;\n\tdisplay: none;\n\ttransition: opacity 0.18s ease;\n}\n\n.clear-button:hover {\n\topacity: 0.85;\n}\n\ninput[type=\"file\"]:not(:empty) + .clear-button {\n\tdisplay: inline-block;\n}\n\ndiv.html {\n\ttext-align: left;\n\tcolor: var(--color-html-text);\n\tfont-size: var(--font-size-input);\n}\ndiv.html h1, div.html h2, div.html h3, div.html h4, div.html h5, div.html h6, div.html p, div.html ul, div.html ol, div.html a {\n\tfont-weight: var(--font-weight-normal);\n\tfont-style: normal;\n\tmargin-bottom: 8px;\n}\ndiv.html li {\n\tmargin-bottom: 8px;\n\tmargin-left: 24px;\n}\ndiv.html ul, div.html ol {\n\tfont-size: var(--font-size-input);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-self: stretch;\n\tline-height: normal;\n}\ndiv.html b {\n\tfont-weight: var(--font-weight-bold);\n}\ndiv.html h1 {\n\tfont-size: var(--font-size-html-h1);\n\tline-height: 35px;\n}\ndiv.html h2 {\n\tfont-size: var(--font-size-html-h2);\n\tline-height: 26px;\n}\ndiv.html h3 {\n\tfont-size: var(--font-size-html-h3);\n\tline-height: 24px;\n}\ndiv.html h4 {\n\tfont-size: var(--font-size-html-h4);\n\tline-height: 18px;\n}\ndiv.html h5 {\n\tfont-size: var(--font-size-html-h5);\n}\ndiv.html h6 {\n\tfont-size: var(--font-size-html-h6);\n}\ndiv.html p {\n\tmargin-bottom: 8px;\n}\ndiv.html a {\n\tcolor: var(--color-html-link);\n\tfont-size: var(--font-size-input);\n}\n\n@media only screen and (max-width: 500px) {\n\tbody {\n\t\tbackground-color: var(--color-background);\n\t}\n\thr {\n\t\tdisplay: block;\n\t}\n\t.container {\n\t\twidth: 95%;\n\t\tmin-height: 100vh;\n\t\tpadding: 24px;\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: 0px;\n\t\tbox-shadow: 0px 0px 0px 0px #ffffff;\n\t}\n\t.card {\n\t\tpadding: 20px;\n\t\tbackground-color: var(--color-card-bg);\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: var(--border-radius-card);\n\t\tbox-shadow: var(--box-shadow-card);\n\t\tmargin-bottom: 0px;\n\t}\n}\n\n\n.form-header p b,\n.form-header p strong {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-bold);\n}\n\n\n.form-header img {\n\tdisplay: block;\n\tmargin: 0 auto 12px auto;\n\theight: 40px;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        5248,
        3680
      ],
      "id": "bb9698cc-b9a5-4fdd-98e1-94c9ddfe20b3",
      "name": "Cerrar formulario",
      "webhookId": "cd5edae1-90ce-44fa-89a3-6e30d154dc67",
      "credentials": {
        "httpBasicAuth": {
          "id": "eb3ciQbGH5EfWa7a",
          "name": "Acceder formulario Facturas"
        }
      }
    },
    {
      "parameters": {
        "amount": 3,
        "unit": "minutes"
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        5696,
        3904
      ],
      "id": "6e28a3fa-023d-49ad-99fd-a17527728c84",
      "name": "Wait",
      "webhookId": "b8d3688c-4f2f-451a-a018-edf44d77d762"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $getWorkflowStaticData('global');\nstaticData.formulario_cerrado = true;\nreturn $input.all();"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        5920,
        3904
      ],
      "id": "b5a0dc92-74a7-45f5-8965-52e96d681acf",
      "name": "Cerrar formulario facturas2",
      "executeOnce": true
    },
    {
      "parameters": {
        "amount": 10
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        5696,
        3456
      ],
      "id": "c66afb63-838b-4e1c-8500-38bdec2a6129",
      "name": "Wait1",
      "webhookId": "4407a8b9-c317-4293-bd04-c012ee490176"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "=javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com ",
        "subject": "Sistema Facturas disponible de nuevo",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tEl formulario de facturas ya está disponible de nuevo.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fdf1f4; font-size:26px; color:#e51947; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#10003;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tSistema disponible de nuevo\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tEl mantenimiento ha finalizado. El sistema <b style=\"color:#e51947;\">\"Ingresar Factura\"</b> ya está <b>abierto y disponible</b> para subir facturas con normalidad.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf1f4; border:1px solid #F8CBDC; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\tYa puedes subir tus facturas pendientes sin ningún problema.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 36px 32px; text-align:center;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"border-radius:10px; background-color:#e51947;\">\n\t\t\t\t\t\t\t\t\t<a href=\"https://royalcomunicacion.app.n8n.cloud/form/gestion-de-facturas\" target=\"_blank\" style=\"display:inline-block; padding:14px 28px; font-family:Arial, Helvetica, sans-serif; font-size:14px; font-weight:700; color:#ffffff; text-decoration:none; border-radius:10px;\">\n\t\t\t\t\t\t\t\t\t\tIr al formulario\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        5920,
        3456
      ],
      "id": "86846d70-e995-4987-9376-45348e0161f7",
      "name": "Sistema Facturas disponible de nuevo",
      "webhookId": "1fb3d073-a7ce-41e2-953e-e01679f8d837",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "=javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com ",
        "subject": "En mantenimiento - Sistema Facturas",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tEl formulario de facturas ya está en mantenimiento.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fff6e5; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#128295;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tSistema en mantenimiento\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tEl sistema <b style=\"color:#e51947;\">\"Ingresar Factura\"</b> ya está en mantenimiento. Mientras dure, no se pueden subir nuevas facturas.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f5dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\tSi intentas acceder al formulario ahora mismo, verás un mensaje indicando que está cerrado temporalmente.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tEn cuanto termine el mantenimiento, el formulario se reabrirá y recibirás la confirmación. Si tienes cualquier duda, contacta con <b>javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com</b>.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        6144,
        3904
      ],
      "id": "a81b21cd-f485-43c2-9ce2-73abda46310b",
      "name": "En mantenimiento - Sistema Facturas",
      "webhookId": "1fb3d073-a7ce-41e2-953e-e01679f8d837",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-hay-tarjeta",
              "leftValue": "={{ (() => { const t = $('On form submission').first().json[\"Seleccione tarjeta\"]; return !!(t && t !== '-'); })() }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        10848,
        2800
      ],
      "id": "d86ec599-b23b-4849-885e-4d723746d884",
      "name": "¿Hay tarjeta seleccionada?"
    },
    {
      "parameters": {
        "jsCode": "const item = $input.first();\nconst authToken = $('Code in JavaScript4').item.json.ilove_token;\n\nconst response = await this.helpers.httpRequest({\n  method: 'GET',\n  url: 'https://api.ilovepdf.com/v1/start/watermark',\n  headers: {\n    Authorization: `Bearer ${authToken}`,\n  },\n  json: true,\n});\n\nreturn [{\n  json: { ...item.json, wm_server: response.server, wm_task: response.task },\n  binary: item.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        11072,
        2512
      ],
      "id": "884d0a2f-313b-4601-a899-53c5ff7af00b",
      "name": "Iniciar tarea de marca de agua"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.wm_server }}/v1/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "task",
              "value": "={{ $json.wm_task }}"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        11296,
        2512
      ],
      "id": "d143a26a-7dec-4136-9dbe-71eb9da97106",
      "name": "HTTP Request \"Upload PDF a marca de agua\""
    },
    {
      "parameters": {
        "jsCode": "const item = $input.first();\nconst server = $('Iniciar tarea de marca de agua').item.json.wm_server;\nconst task = $('Iniciar tarea de marca de agua').item.json.wm_task;\nconst tarjeta = $('On form submission').first().json[\"Seleccione tarjeta\"];\n\nreturn [{\n  json: {\n    wm_server: server,\n    wm_task: task,\n    files: [{ server_filename: item.json.server_filename, filename: 'factura.pdf' }],\n    texto_marca: `Tarjeta: ${tarjeta}`,\n  },\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        11520,
        2512
      ],
      "id": "bec02a83-407b-40e5-8314-f8441b36d5a4",
      "name": "Code (Preparar proceso marca de agua)"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "=https://{{ $json.wm_server }}/v1/process",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"task\": \"{{ $json.wm_task }}\",\n  \"tool\": \"watermark\",\n  \"files\": {{ JSON.stringify($json.files) }},\n  \"mode\": \"text\",\n  \"text\": \"{{ $json.texto_marca }}\",\n  \"font_size\": 16,\n  \"font_color\": \"#4b4c51\",\n  \"vertical_position\": \"top\",\n  \"horizontal_position\": \"right\",\n  \"vertical_position_adjustment\": 5,\n  \"horizontal_position_adjustment\": 5,\n  \"rotation\": 0,\n  \"transparency\": 100,\n  \"mosaic\": false\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        11744,
        2512
      ],
      "id": "203e07d0-1ae3-497b-a530-54fcf7576033",
      "name": "HTTP Request \"Process (Watermark)\""
    },
    {
      "parameters": {
        "url": "=https://{{ $('Iniciar tarea de marca de agua').item.json.wm_server }}/v1/download/{{ $('Iniciar tarea de marca de agua').item.json.wm_task }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Code in JavaScript4').item.json.ilove_token }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "file"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        11968,
        2512
      ],
      "id": "5b1e3fa4-c5f7-4a80-ac5b-17f45a2c2661",
      "name": "HTTP Request \"Download PDF con marca de agua\""
    },
    {
      "parameters": {
        "jsCode": "const originalItem = $('Renombrar factura1').item;\nconst watermarkedBinary = $input.first().binary;\n\nreturn [{\n  json: originalItem.json,\n  binary: watermarkedBinary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        12192,
        2512
      ],
      "id": "07ffe84d-ac5e-44dd-8ae7-668ac42dab46",
      "name": "Code (Combinar marca de agua)"
    },
    {
      "parameters": {
        "authentication": "basicAuth",
        "formTitle": "Poner en mantenimiento sistema Facturas",
        "formDescription": "Formulario para poner en mantenimiento sistema Facturas",
        "options": {
          "appendAttribution": false,
          "buttonLabel": "Poner en mantenimiento >",
          "path": "poner-en-mantenimiento-facturas",
          "customCss": ":root {\n\t/* Fonts */\n\t--font-family: \"Open Sans\", sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-medium: 600;\n\t--font-weight-bold: 700;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\n\t/* Brand */\n\t--color-brand: #e51947;\n\t--color-brand-dark: #b8123a;\n\t--color-brand-light: #F8CBDC;\n\t--color-brand-tint: #fdf1f4;\n\t--color-white: #ffffff;\n\n\t/* Colors */\n\t--color-background: #fdf6f8;\n\t--color-test-notice-text: #b8123a;\n\t--color-test-notice-bg: #fdf1f4;\n\t--color-test-notice-border: #f5c2d3;\n\t--color-card-bg: #ffffff;\n\t--color-card-border: #f2dfe6;\n\t--color-card-shadow: rgba(229, 25, 71, 0.14);\n\t--color-link: #8a8d93;\n\t--color-header: #29292b;\n\t--color-label: #46474c;\n\t--color-input-border: #e7dde1;\n\t--color-input-text: #4b4c51;\n\t--color-input-bg: #ffffff;\n\t--color-focus-border: #e51947;\n\t--color-focus-ring: rgba(229, 25, 71, 0.14);\n\t--color-submit-btn-text: #ffffff;\n\t--color-error: #d81b3f;\n\t--color-required: #e51947;\n\t--color-clear-button-bg: #c6c2c4;\n\t--color-html-text: #4b4c51;\n\t--color-html-link: #e51947;\n\n\t/* Border Radii */\n\t--border-radius-card: 18px;\n\t--border-radius-input: 10px;\n\t--border-radius-clear-btn: 50%;\n\n\t/* Spacing */\n\t--padding-container-top: 32px;\n\t--padding-card: 32px;\n\t--padding-test-notice-vertical: 14px;\n\t--padding-test-notice-horizontal: 20px;\n\t--margin-bottom-card: 20px;\n\t--padding-form-input: 13px;\n\n\t/* Dimensions */\n\t--container-width: 460px;\n\t--submit-btn-height: 52px;\n\t--checkbox-size: 18px;\n\n\t/* Others */\n\t--box-shadow-card: 0px 24px 48px -16px var(--color-card-shadow), 0px 2px 6px rgba(20, 20, 20, 0.03);\n\t--opacity-placeholder: 0.55;\n}\n\n*,\n::after,\n::before {\n\tbox-sizing: border-box;\n\tmargin: 0;\n\tpadding: 0;\n}\n\nhtml {\n\tmin-height: 100%;\n}\n\nbody {\n\tfont-family: var(--font-family);\n\tfont-weight: var(--font-weight-normal);\n\tfont-size: var(--font-size-body);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n\tmin-height: 100vh;\n\tbackground-color: var(--color-background);\n\tbackground-image:\n\t\tradial-gradient(720px 420px at 12% -8%, rgba(229, 25, 71, 0.10), transparent 60%),\n\t\tradial-gradient(760px 460px at 100% 0%, rgba(248, 203, 220, 0.55), transparent 55%);\n\tbackground-repeat: no-repeat;\n\t-webkit-font-smoothing: antialiased;\n}\n\n.container {\n\tmargin: auto;\n\ttext-align: center;\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: var(--padding-container-top);\n\twidth: var(--container-width);\n}\n\n.test-notice {\n\tpadding: var(--padding-test-notice-vertical) var(--padding-test-notice-horizontal);\n\tcolor: var(--color-test-notice-text);\n\tbackground-color: var(--color-test-notice-bg);\n\tborder-radius: var(--border-radius-input);\n\tborder: 1px solid var(--color-test-notice-border);\n\tborder-left: 3px solid var(--color-brand);\n\tfont-size: var(--font-size-test-notice);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 16px;\n\ttext-align: left;\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card {\n\tposition: relative;\n\toverflow: hidden;\n\tpadding: var(--padding-card);\n\tbackground-color: var(--color-card-bg);\n\tborder: 1px solid var(--color-card-border);\n\tborder-radius: var(--border-radius-card);\n\tbox-shadow: var(--box-shadow-card);\n\tmargin-bottom: var(--margin-bottom-card);\n}\n\n.card::before {\n\tcontent: '';\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\theight: 5px;\n\tbackground: linear-gradient(90deg, var(--color-brand) 0%, var(--color-brand-dark) 45%, var(--color-brand-light) 100%);\n}\n\n.n8n-link {\n\tpadding-bottom: var(--padding-container-top);\n}\n.n8n-link a {\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-medium);\n\tfont-size: var(--font-size-link);\n\ttext-decoration: none;\n}\n\n.n8n-link svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.form-header h1 {\n\tcolor: var(--color-header);\n\tfont-size: var(--font-size-header);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: -0.01em;\n\tposition: relative;\n\tdisplay: inline-block;\n\tpadding-bottom: 14px;\n}\n\n.form-header h1::after {\n\tcontent: '';\n\tposition: absolute;\n\tbottom: 0;\n\tleft: 50%;\n\ttransform: translateX(-50%);\n\twidth: 44px;\n\theight: 4px;\n\tborder-radius: 4px;\n\tbackground: linear-gradient(90deg, var(--color-brand), var(--color-brand-dark));\n}\n\n.form-header p {\n\tpadding-top: 16px;\n\tcolor: var(--color-link);\n\tfont-size: var(--font-size-paragraph);\n\tfont-weight: var(--font-weight-normal);\n\tline-height: 1.65;\n\ttext-align: left;\n}\n\n.form-header p a {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-medium);\n\ttext-decoration: none;\n}\n\n.form-header p a:hover {\n\ttext-decoration: underline;\n}\n\n.inputs-wrapper {\n\tpadding-top: var(--padding-container-top);\n\tpadding-bottom: 8px;\n}\n\nform label {\n\tdisplay: block;\n\ttext-align: left;\n\tfont-size: var(--font-size-label);\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-label);\n\tpadding-bottom: 8px;\n}\n\nform textarea {\n\tmax-width: 100%;\n}\n\nform .form-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tbackground-color: var(--color-input-bg);\n\tfont-weight: var(--font-weight-normal);\n\tpadding: var(--padding-form-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\nform textarea:focus,\nform input:focus {\n\toutline: none;\n\tborder-color: var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\n.select-input {\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: var(--border-radius-input);\n\ttransition: border-color 0.18s ease, box-shadow 0.18s ease;\n}\n\n.select-input:focus-within {\n\tborder: 1px solid var(--color-focus-border);\n\tbox-shadow: 0 0 0 4px var(--color-focus-ring);\n}\n\nform select {\n\toutline: transparent;\n\tborder: none;\n\tborder-radius: var(--border-radius-input);\n\twidth: 100%;\n\tfont-size: var(--font-size-input);\n\tcolor: var(--color-input-text);\n\tfont-weight: var(--font-weight-normal);\n\tbackground-color: var(--color-card-bg);\n\tpadding: var(--padding-form-input);\n\tborder-right: 12px solid transparent;\n}\n\ninput[type='date'] {\n\tfont-family: var(--font-family);\n}\n\n::placeholder {\n\topacity: var(--opacity-placeholder);\n}\n\n#submit-btn {\n\twidth: 100%;\n\theight: var(--submit-btn-height);\n\tpadding: var(--padding-form-input);\n\tborder-radius: var(--border-radius-input);\n\tborder: 0;\n\tfont-size: var(--font-size-input);\n\tfont-weight: var(--font-weight-bold);\n\tletter-spacing: 0.02em;\n\tfont-family: var(--font-family);\n\tbackground: linear-gradient(135deg, var(--color-brand) 0%, var(--color-brand-dark) 100%);\n\tcolor: var(--color-submit-btn-text);\n\tbox-shadow: 0 12px 24px -8px rgba(229, 25, 71, 0.55);\n\tcursor: pointer;\n\ttransition: transform 0.18s ease, box-shadow 0.18s ease, opacity 0.18s ease;\n}\n\n#submit-btn span {\n\tpadding-right: 6px;\n\tdisplay: none;\n}\n\n#submit-btn span svg {\n\tdisplay: inline-block;\n\tvertical-align: middle;\n\tfill: var(--color-submit-btn-text);\n\tanimation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;\n}\n\n@keyframes lds-ring {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(360deg);\n\t}\n}\n\n#submit-btn:hover {\n\ttransform: translateY(-2px);\n\tbox-shadow: 0 16px 28px -8px rgba(229, 25, 71, 0.65);\n}\n\n#submit-btn:active {\n\ttransform: translateY(0);\n\tbox-shadow: 0 8px 16px -8px rgba(229, 25, 71, 0.55);\n}\n\n#submit-btn:disabled {\n\tcursor: not-allowed;\n\topacity: 0.7;\n\ttransform: none;\n}\n\n.error-hidden {\n\tdisplay: block;\n\tposition: relative;\n\tcolor: var(--color-error);\n\ttext-align: left;\n\tfont-size: var(--font-size-error);\n\tfont-weight: var(--font-weight-normal);\n\tvisibility: hidden;\n\tpadding-top: 6px;\n\tpadding-bottom: 9px;\n}\n\n.error-show {\n\tvisibility: visible;\n}\n\n/* multiselect ----------------------------------- */\n.multiselect {\n\tpadding-left: 6px;\n\tpadding-right: 6px;\n}\n\n.multiselect-option {\n\tpadding-top: 6px;\n\tdisplay: flex;\n}\n\n.multiselect-option label {\n\tpadding-left: 12px;\n\tcolor: var(--color-link);\n\tfont-weight: var(--font-weight-normal);\n\tcursor: pointer;\n}\n\n.multiselect-checkbox {\n\tvertical-align: middle;\n\tmin-width: var(--checkbox-size);\n}\n\ninput[type='checkbox'] {\n\tappearance: none;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tborder: 1px solid var(--color-input-border);\n\tborder-radius: 3px;\n\tcursor: pointer;\n\tposition: relative;\n\ttransition: background 0.18s ease, border-color 0.18s ease;\n}\n.multiselect-checkbox:checked {\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder-color: var(--color-brand);\n}\n.multiselect-checkbox:checked::after {\n\tcontent: '✔';\n\tposition: absolute;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tcolor: white;\n\tfont-size: var(--font-size-label);\n\tfont-weight: bold;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox {\n\tborder-radius: 50%;\n\twidth: var(--checkbox-size);\n\theight: var(--checkbox-size);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.multiselect[data-radio-select] .multiselect-checkbox:checked {\n\tbackground: white;\n\tborder-color: var(--color-brand);\n\tborder-width: 4px;\n\tborder-radius: 50%;\n}\n.multiselect[data-radio-select] .multiselect-checkbox:checked::after {\n\tcontent: '';\n}\n/* required field ----------------------------- */\nlabel.form-required::after {\n\tcontent: ' *';\n\tcolor: var(--color-required);\n}\n\nhr {\n\tborder: 0;\n\theight: 1px;\n\tborder-top: 1px solid var(--color-input-border);\n\tmargin-top: 24px;\n\tmargin-bottom: 24px;\n\tdisplay: none;\n}\n\n.file-input-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 100%;\n}\n\ninput[type=\"file\"] {\n\tcursor: pointer;\n}\n\ninput[type=\"file\"]::file-selector-button {\n\tfont-family: var(--font-family);\n\tfont-size: 13px;\n\tfont-weight: var(--font-weight-bold);\n\tcolor: var(--color-brand);\n\tbackground-color: var(--color-brand-tint);\n\tborder: 1px solid var(--color-brand-light);\n\tborder-radius: 8px;\n\tpadding: 8px 14px;\n\tmargin-right: 12px;\n\tcursor: pointer;\n\ttransition: background-color 0.18s ease, color 0.18s ease;\n}\n\ninput[type=\"file\"]::file-selector-button:hover {\n\tbackground-color: var(--color-brand-light);\n\tcolor: var(--color-brand-dark);\n}\n\n.clear-button {\n\tposition: absolute;\n\tright: 5px;\n\ttop: 50%;\n\ttransform: translateY(-65%);\n\tbackground: linear-gradient(135deg, var(--color-brand), var(--color-brand-dark));\n\tborder: none;\n\tborder-radius: var(--border-radius-clear-btn);\n\tfont-size: 14px;\n\tfont-weight: var(--font-weight-bold);\n\tfont-family: var(--font-family);\n\tcolor: white;\n\twidth: 20px;\n\theight: 20px;\n\ttext-align: center;\n\tline-height: 20px;\n\tcursor: pointer;\n\tdisplay: none;\n\ttransition: opacity 0.18s ease;\n}\n\n.clear-button:hover {\n\topacity: 0.85;\n}\n\ninput[type=\"file\"]:not(:empty) + .clear-button {\n\tdisplay: inline-block;\n}\n\ndiv.html {\n\ttext-align: left;\n\tcolor: var(--color-html-text);\n\tfont-size: var(--font-size-input);\n}\ndiv.html h1, div.html h2, div.html h3, div.html h4, div.html h5, div.html h6, div.html p, div.html ul, div.html ol, div.html a {\n\tfont-weight: var(--font-weight-normal);\n\tfont-style: normal;\n\tmargin-bottom: 8px;\n}\ndiv.html li {\n\tmargin-bottom: 8px;\n\tmargin-left: 24px;\n}\ndiv.html ul, div.html ol {\n\tfont-size: var(--font-size-input);\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-self: stretch;\n\tline-height: normal;\n}\ndiv.html b {\n\tfont-weight: var(--font-weight-bold);\n}\ndiv.html h1 {\n\tfont-size: var(--font-size-html-h1);\n\tline-height: 35px;\n}\ndiv.html h2 {\n\tfont-size: var(--font-size-html-h2);\n\tline-height: 26px;\n}\ndiv.html h3 {\n\tfont-size: var(--font-size-html-h3);\n\tline-height: 24px;\n}\ndiv.html h4 {\n\tfont-size: var(--font-size-html-h4);\n\tline-height: 18px;\n}\ndiv.html h5 {\n\tfont-size: var(--font-size-html-h5);\n}\ndiv.html h6 {\n\tfont-size: var(--font-size-html-h6);\n}\ndiv.html p {\n\tmargin-bottom: 8px;\n}\ndiv.html a {\n\tcolor: var(--color-html-link);\n\tfont-size: var(--font-size-input);\n}\n\n@media only screen and (max-width: 500px) {\n\tbody {\n\t\tbackground-color: var(--color-background);\n\t}\n\thr {\n\t\tdisplay: block;\n\t}\n\t.container {\n\t\twidth: 95%;\n\t\tmin-height: 100vh;\n\t\tpadding: 24px;\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: 0px;\n\t\tbox-shadow: 0px 0px 0px 0px #ffffff;\n\t}\n\t.card {\n\t\tpadding: 20px;\n\t\tbackground-color: var(--color-card-bg);\n\t\tborder: 0px solid var(--color-input-border);\n\t\tborder-radius: var(--border-radius-card);\n\t\tbox-shadow: var(--box-shadow-card);\n\t\tmargin-bottom: 0px;\n\t}\n}\n\n\n.form-header p b,\n.form-header p strong {\n\tcolor: var(--color-brand);\n\tfont-weight: var(--font-weight-bold);\n}\n\n\n.form-header img {\n\tdisplay: block;\n\tmargin: 0 auto 12px auto;\n\theight: 40px;\n}"
        }
      },
      "type": "n8n-nodes-base.formTrigger",
      "typeVersion": 2.3,
      "position": [
        5248,
        3904
      ],
      "id": "8b2ef473-be90-4581-a39e-1e6552f02f76",
      "name": "Mantenimiento",
      "webhookId": "43ffc406-d3fd-4f18-b3ef-30420527b063",
      "credentials": {
        "httpBasicAuth": {
          "id": "eb3ciQbGH5EfWa7a",
          "name": "Acceder formulario Facturas"
        }
      }
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "=javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com ",
        "subject": "En 3 minutos estará en mantenimiento - Sistema Facturas",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tEl formulario de facturas entrará en mantenimiento en 3 minutos.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e31947; background-image:linear-gradient(90deg,#e31947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"36\" height=\"36\" align=\"center\" valign=\"middle\" style=\"width:36px; height:36px; border-radius:30%; background-color:#fff6e3; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9201;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tMantenimiento en 3 minutos\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c31;\">\n\t\t\t\t\t\tEl sistema <b style=\"color:#e31947;\">\"Ingresar Factura\"</b> entrará en mantenimiento dentro de <b>3 minutos</b>. Durante ese tiempo no se podrán subir nuevas facturas.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f3dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; color:#4b4c31;\">\n\t\t\t\t\t\t\t\t\tSi tienes alguna factura pendiente de subir, hazlo <b>ahora</b>, antes de que comience el mantenimiento.\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 32px 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c31;\">\n\t\t\t\t\t\t<b>Subir factura ahora:</b> <a href=\"https://royalcomunicacion.app.n8n.cloud/form/gestion-de-facturas\" target=\"_blank\" style=\"color:#e31947;\">Ir al formulario</a>\n\t\t\t\t\t\t<br><br>\n\t\t\t\t\t\tCuando el mantenimiento termine, el formulario se reabrirá automáticamente. Si tienes cualquier duda, contacta con <b>javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com</b>.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        5472,
        3904
      ],
      "id": "83a2ed68-e9a5-4680-856c-d089b42b6ceb",
      "name": "En 3 minutos estará en mantenimiento - Sistema Facturas",
      "webhookId": "1fb3d073-a7ce-41e2-953e-e01679f8d837",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "const item = $('Renombrar factura1').item;\nconst j = item.json;\n\n// Normaliza: mayúsculas y solo letras/números.\nconst norm = (s) => (s || '').toString().toUpperCase().replace(/[^A-Z0-9]/g, '');\nconst esDesconocido = (s) => !s || norm(s) === '' || norm(s) === 'DESCONOCIDO';\n\n// CIF del proveedor: quitamos prefijo ES de VAT español y corregimos la 'B' leída como '8'.\nlet cif = esDesconocido(j.cif_proveedor) ? '' : norm(j.cif_proveedor);\nif (/^ES[A-Z0-9]\\d{7}[A-Z0-9]$/.test(cif)) cif = cif.slice(2);\nif (/^8\\d{8}$/.test(cif)) cif = 'B' + cif.slice(1);\n\nconst numero = esDesconocido(j.numero_factura) ? '' : norm(j.numero_factura);\n\n// Clave única de factura: CIF proveedor + número. Sin CIF, proveedor + fecha + número.\n// Sin número no se puede identificar la factura -> clave vacía (no se comprueba duplicado).\nlet clave = '';\nif (numero) {\n  clave = cif ? `${cif}|${numero}` : `${norm(j.proveedor)}|${norm(j.fecha)}|${numero}`;\n}\n\nreturn [{\n  json: { ...j, clave_factura: clave },\n  binary: item.binary,\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        9280,
        3088
      ],
      "id": "cd6ef26f-0219-47c5-a22b-2d76575d0f38",
      "name": "Calcular clave factura"
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        9728,
        3088
      ],
      "id": "87c1956e-6a0e-49e4-9f4b-ed419db40429",
      "name": "Leer registros (duplicados)",
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      },
      "notes": "Lee el registro completo para buscar si la factura ya se subió antes."
    },
    {
      "parameters": {
        "jsCode": "const actual = $('Calcular clave factura').item;\nconst j = actual.json;\nconst archivoTemporal = $('Añadir metadatos').item.json.nombre_archivo;\n\nconst norm = (s) => (s || '').toString().toUpperCase().replace(/[^A-Z0-9]/g, '');\nconst sinExtension = (s) => (s || '').toString().replace(/\\.[^.]+$/, '');\nconst nombreActual = norm(sinExtension(j.nombre_factura_final));\n\nlet original = null;\nif (j.clave_factura) {\n  const filas = $input.all().map((i) => i.json);\n  original = filas.find((f) =>\n    // Solo cuentan facturas que se llegaron a guardar (tienen URL) y que no son esta misma subida.\n    f['URL archivo'] &&\n    f['Archivo temporal'] !== archivoTemporal &&\n    (\n      (f['Clave factura'] && f['Clave factura'] === j.clave_factura) ||\n      // Filas antiguas sin clave, o CIF leído distinto: comparamos proveedor_fecha_numero.\n      (nombreActual && norm(sinExtension(f['Nombre archivo guardado'])) === nombreActual)\n    )\n  ) || null;\n}\n\nconst formatearFecha = (s) => {\n  const m = (s || '').toString().match(/^(\\d{4})-(\\d{2})-(\\d{2})\\s+(\\d{2}):(\\d{2})/);\n  return m ? `${m[3]}/${m[2]}/${m[1]} a las ${m[4]}:${m[5]}` : (s || 'fecha desconocida');\n};\n\nreturn [{\n  json: {\n    ...j,\n    archivo_temporal: archivoTemporal,\n    es_duplicada: !!original,\n    duplicada_usuario: original ? (original['Usuario'] || 'desconocido') : '',\n    duplicada_fecha: original ? formatearFecha(original['Fecha y hora']) : '',\n    duplicada_nombre: original ? (original['Nombre archivo guardado'] || '') : '',\n    duplicada_url: original ? (original['URL archivo'] || '') : '',\n  },\n  binary: actual.binary,\n  pairedItem: { item: 0 },\n}];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        9952,
        3088
      ],
      "id": "f22c82e4-2a0b-4e41-b8ee-446149fee0b6",
      "name": "Comprobar duplicado"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-es-duplicada",
              "leftValue": "={{ $json.es_duplicada }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        10176,
        3088
      ],
      "id": "0f102e86-351a-4a6a-be2e-d80b23a6fc98",
      "name": "¿Es duplicada?"
    },
    {
      "parameters": {
        "fromEmail": "no-reply@devroyal.es",
        "toEmail": "={{ $('On form submission').first().json[\"Introduzca su email (Obligatorio)\"] }}, admin@royalcomunicacion.com, vhernandez@royalcomunicacion.com, javier.munoz@royalcomunicacion.com, jgomez@royalcomunicacion.com",
        "subject": "=AVISO - Sistema Facturas | Factura duplicada: {{ $json.nombre_factura_final }} - No se ha guardado",
        "html": "=<div style=\"display:none; max-height:0; overflow:hidden; opacity:0; mso-hide:all;\">\n\tEsta factura ya se había subido anteriormente. No se ha guardado de nuevo.\n</div>\n\n<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fdf6f8; padding:32px 0;\">\n\t<tr>\n\t\t<td align=\"center\">\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; background-color:#ffffff; border-radius:16px; border:1px solid #f2dfe6;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"height:6px; line-height:6px; font-size:0; background-color:#e51947; background-image:linear-gradient(90deg,#e51947,#b8123a,#F8CBDC);\">&nbsp;</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:28px 32px 0 32px; text-align:center;\">\n\t\t\t\t\t\t<img src=\"https://royalcomunicacion.com/wp-content/themes/royalcom/assets/images/logo-royal-18.png\" alt=\"Royal Comunicación\" style=\"height:36px; margin-bottom:4px; display:block; margin-left:auto; margin-right:auto; border:0;\">\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:16px 32px 8px 32px; text-align:center; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<table role=\"presentation\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" style=\"margin:0 auto 16px auto;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td width=\"56\" height=\"56\" align=\"center\" valign=\"middle\" style=\"width:56px; height:56px; border-radius:50%; background-color:#fff6e5; font-size:26px; color:#b8860b; font-weight:bold;\">\n\t\t\t\t\t\t\t\t\t&#9888;\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<h1 style=\"margin:0; font-family:Arial, Helvetica, sans-serif; font-size:22px; line-height:1.3; color:#29292b; font-weight:700;\">\n\t\t\t\t\t\t\tFactura duplicada\n\t\t\t\t\t\t</h1>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:8px 32px 0 32px; text-align:left; font-family:Arial, Helvetica, sans-serif; font-size:14px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\tLa factura <b style=\"color:#e51947;\">{{ $json.nombre_factura_final }}</b> ya se había subido al sistema anteriormente, por lo que <b>no se ha guardado de nuevo</b>. No es necesario que hagas nada más.\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 0 32px;\">\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"background-color:#fff8e8; border:1px solid #f5dfa3; border-radius:10px;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:14px 16px; font-family:Arial, Helvetica, sans-serif; font-size:13px; line-height:1.6; color:#4b4c51;\">\n\t\t\t\t\t\t\t\t\tSubida original por <b>{{ $json.duplicada_usuario }}</b> el <b>{{ $json.duplicada_fecha }}</b>.<br>\n\t\t\t\t\t\t\t\t\tGuardada como: {{ $json.duplicada_nombre }}\n\t\t\t\t\t\t\t\t\t{{ $json.duplicada_url ? '<br><a href=\"' + $json.duplicada_url + '\" style=\"color:#e51947;\">Ver factura original</a>' : '' }}\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td style=\"padding:20px 32px 28px 32px; font-family:Arial, Helvetica, sans-serif;\">\n\t\t\t\t\t\t<p style=\"margin:0 0 8px 0; font-size:11px; color:#8a8d93; text-transform:uppercase; letter-spacing:0.06em;\">\n\t\t\t\t\t\t\tDatos detectados por Gemini\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<table role=\"presentation\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"font-size:13px; color:#4b4c51;\">\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; width:150px; color:#8a8d93;\">Proveedor</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.proveedor }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; color:#8a8d93;\">Nº factura</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.numero_factura }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; color:#8a8d93;\">Fecha</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.fecha }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0; color:#8a8d93;\">CIF/VAT proveedor</td>\n\t\t\t\t\t\t\t\t<td style=\"padding:4px 0;\">{{ $json.cif_proveedor }}</td>\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t</table>\n\t\t\t\t\t\t<p style=\"margin:16px 0 0 0; font-size:12px; line-height:1.5; color:#8a8d93;\">\n\t\t\t\t\t\t\tSi crees que no es la misma factura, contacta con <b>javier.munoz@royalcomunicacion.com</b>.\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t\t<table role=\"presentation\" width=\"480\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\" style=\"width:480px; max-width:480px; margin-top:20px;\">\n\t\t\t\t<tr>\n\t\t\t\t\t<td align=\"center\" style=\"font-family:Arial, Helvetica, sans-serif; font-size:11px; color:#8a8d93; padding:0 32px;\">\n\t\t\t\t\t\tAutomatización de facturas · Royal Comunicación\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>",
        "options": {
          "appendAttribution": false,
          "attachments": "={{ Object.keys($binary || {}).join(',') }}"
        }
      },
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 2.1,
      "position": [
        10400,
        3216
      ],
      "id": "a68b1b0e-dcb5-48e6-9e2e-9a6673177052",
      "name": "Aviso factura duplicada (email usuario)",
      "webhookId": "cc8db35a-d931-40c1-9aeb-602425b725ba",
      "credentials": {
        "smtp": {
          "id": "gHVqqO7l91RsTnsp",
          "name": "SMTP Correo no-reply Royal"
        }
      }
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Archivo temporal": "={{ $('Comprobar duplicado').item.json.archivo_temporal }}",
            "Duplicado de": "={{ $('Comprobar duplicado').item.json.duplicada_nombre }} (subida por {{ $('Comprobar duplicado').item.json.duplicada_usuario }} el {{ $('Comprobar duplicado').item.json.duplicada_fecha }})"
          },
          "matchingColumns": [
            "Archivo temporal"
          ],
          "schema": [
            {
              "id": "Usuario",
              "displayName": "Usuario",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Archivo temporal",
              "displayName": "Archivo temporal",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Nombre archivo guardado",
              "displayName": "Nombre archivo guardado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "URL archivo",
              "displayName": "URL archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fecha y hora",
              "displayName": "Fecha y hora",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Proyecto",
              "displayName": "Proyecto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Gasto autorizado por",
              "displayName": "Gasto autorizado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Observaciones",
              "displayName": "Observaciones",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Tarjeta utilizada",
              "displayName": "Tarjeta utilizada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Clave factura",
              "displayName": "Clave factura",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Duplicado de",
              "displayName": "Duplicado de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "ID archivo",
              "displayName": "ID archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fusionada",
              "displayName": "Fusionada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        10624,
        3216
      ],
      "id": "cbee4897-d595-47d2-a78d-9bf9c299b6dc",
      "name": "Registrar duplicado Excel",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      }
    },
    {
      "parameters": {
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        6368,
        4816
      ],
      "id": "ca8dec4b-7e86-4605-a71f-0ac6a6ff717a",
      "name": "Leer pendientes",
      "alwaysOutputData": true,
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      },
      "notes": "Lee el registro para saber qué facturas faltan por unificar."
    },
    {
      "parameters": {
        "jsCode": "// Pendientes = facturas guardadas en la carpeta semanal (tienen ID archivo) y aún sin fusionar.\nconst pendientes = $input.all()\n  .map((i) => i.json)\n  .filter((f) => f['ID archivo'] && !f['Fusionada'])\n  .map((f) => ({\n    json: {\n      id_archivo: f['ID archivo'],\n      archivo_temporal: f['Archivo temporal'],\n      name: f['Nombre archivo guardado'] || f['Archivo temporal'],\n      fecha_subida: f['Fecha y hora'] || '',\n    },\n  }));\n\n// Si no hay ninguna, pasamos un item vacío para que el flujo llegue a reabrir el formulario.\nreturn pendientes.length ? pendientes : [{ json: { sin_pendientes: true } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        6592,
        4816
      ],
      "id": "794ab7ac-cdc1-4929-a231-943da40eb32d",
      "name": "Filtrar pendientes"
    },
    {
      "parameters": {
        "jsCode": "// Separa las facturas descargadas de las que ya no existen en Drive y ordena por fecha de subida.\nconst ok = [];\nconst faltantes = [];\n\n$input.all().forEach((item, i) => {\n  const pendiente = $('Filtrar pendientes').itemMatching(i).json;\n  if (pendiente.sin_pendientes) return;\n  if (item.binary && Object.keys(item.binary).length) {\n    ok.push({ json: { ...pendiente }, binary: item.binary });\n  } else {\n    faltantes.push({ archivo_temporal: pendiente.archivo_temporal, name: pendiente.name });\n  }\n});\n\nok.sort((a, b) => a.json.fecha_subida.localeCompare(b.json.fecha_subida));\n\nif (!ok.length) {\n  return [{ json: { hay_facturas: false, faltantes } }];\n}\nreturn ok.map((item) => ({ ...item, json: { ...item.json, hay_facturas: true, faltantes } }));"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        7040,
        4816
      ],
      "id": "2f29ad22-8af4-4181-bf14-fcb0bd1f27e5",
      "name": "Comprobar descargas"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "cond-hay-facturas",
              "leftValue": "={{ $json.hay_facturas }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        7264,
        4816
      ],
      "id": "ac7e1377-94de-4557-8341-d822808f19fe",
      "name": "¿Hay facturas para unir?"
    },
    {
      "parameters": {
        "jsCode": "// Marca en el Sheet las facturas incluidas en este PDF semanal (y las que no se encontraron en Drive).\nconst ahora = $now.toFormat('yyyy-MM-dd HH:mm');\nconst descargadas = $('Comprobar descargas').all();\nconst faltantes = descargadas[0].json.faltantes || [];\n\nreturn [\n  ...descargadas.map((i) => ({ json: { archivo_temporal: i.json.archivo_temporal, fusionada: ahora } })),\n  ...faltantes.map((f) => ({ json: { archivo_temporal: f.archivo_temporal, fusionada: `No encontrada en Drive (${ahora})` } })),\n];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        10400,
        4736
      ],
      "id": "922a1f18-aa23-4711-a9d2-4e0e3a3cca3e",
      "name": "Preparar marcado fusionadas"
    },
    {
      "parameters": {
        "operation": "appendOrUpdate",
        "documentId": {
          "__rl": true,
          "value": "1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU",
          "mode": "id"
        },
        "sheetName": {
          "__rl": true,
          "value": "gid=0",
          "mode": "list",
          "cachedResultName": "Registros 1 NO MODIFICAR",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1yPi6RCud56fcxTEZR1-8IG0sEADb6GiA8wWf5t-5RtU/edit#gid=0"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "Archivo temporal": "={{ $json.archivo_temporal }}",
            "Fusionada": "={{ $json.fusionada }}"
          },
          "matchingColumns": [
            "Archivo temporal"
          ],
          "schema": [
            {
              "id": "Usuario",
              "displayName": "Usuario",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Archivo temporal",
              "displayName": "Archivo temporal",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            },
            {
              "id": "Nombre archivo guardado",
              "displayName": "Nombre archivo guardado",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "URL archivo",
              "displayName": "URL archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fecha y hora",
              "displayName": "Fecha y hora",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Proyecto",
              "displayName": "Proyecto",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Gasto autorizado por",
              "displayName": "Gasto autorizado por",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Observaciones",
              "displayName": "Observaciones",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Tarjeta utilizada",
              "displayName": "Tarjeta utilizada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Clave factura",
              "displayName": "Clave factura",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Duplicado de",
              "displayName": "Duplicado de",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "ID archivo",
              "displayName": "ID archivo",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": true
            },
            {
              "id": "Fusionada",
              "displayName": "Fusionada",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "type": "string",
              "canBeUsedToMatch": true,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [
        10624,
        4736
      ],
      "id": "c453082f-0843-4145-9905-c0201877635f",
      "name": "Marcar fusionadas",
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "qMQ0jVwqSLmz6Y4E",
          "name": "Cuenta Google Sheet Javier Muñoz"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "6d1744ba-c4bf-4a7d-bfbe-0c62b98ade70",
              "name": "resultado",
              "type": "string",
              "value": "guardada"
            },
            {
              "id": "a6f861a5-b48e-414e-a835-82297268022f",
              "name": "nombre",
              "type": "string",
              "value": "={{ $('Renombrar factura1').item.json.nombre_factura_final }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        13760,
        3232
      ],
      "id": "e920e163-4e25-44b1-8051-231740e4beac",
      "name": "Resultado: guardada"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cbcb6b1a-bfa9-4f76-989c-377bb61814da",
              "name": "resultado",
              "type": "string",
              "value": "duplicada"
            },
            {
              "id": "829a4b58-4afa-447a-b566-512e13d79282",
              "name": "nombre",
              "type": "string",
              "value": "={{ $('Renombrar factura1').item.json.nombre_factura_final }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        10848,
        3216
      ],
      "id": "cead59ac-1abf-49da-a9e8-8f4ae1615093",
      "name": "Resultado: duplicada"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "dc9a1a83-2188-4d0c-9b8f-aef83b7c461d",
              "name": "resultado",
              "type": "string",
              "value": "cif"
            },
            {
              "id": "5ffa54ff-f5a0-4de6-8e0b-509418160e0f",
              "name": "nombre",
              "type": "string",
              "value": "={{ $('Renombrar factura1').item.json.nombre_factura_final }}"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        11072,
        3024
      ],
      "id": "021d8cde-44c8-40dd-8399-cf43a13b8ae9",
      "name": "Resultado: CIF"
    }
  ],
  "pinData": {},
  "connections": {
    "On form submission": {
      "main": [
        [
          {
            "node": "Leer estado formulario",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission1": {
      "main": [
        [
          {
            "node": "Cerrar formulario facturas1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar CIF factura": {
      "main": [
        [
          {
            "node": "¿Hay problema con el CIF?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay problema con el CIF?": {
      "main": [
        [
          {
            "node": "Aviso CIF faltante o incorrecto",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "¿Hay tarjeta seleccionada?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aviso CIF faltante o incorrecto": {
      "main": [
        [
          {
            "node": "Resultado: CIF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Detectar PDF cifrado (subida)": {
      "main": [
        [
          {
            "node": "¿Hay PDF cifrado?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay PDF cifrado?": {
      "main": [
        [
          {
            "node": "PDF cifrado - Formulario",
            "type": "main",
            "index": 0
          },
          {
            "node": "Aviso PDF cifrado (email usuario)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code in JavaScript4",
            "type": "main",
            "index": 0
          },
          {
            "node": "Comprobar campos adicionales1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leer estado formulario": {
      "main": [
        [
          {
            "node": "¿Formulario cerrado?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Añadir metadatos": {
      "main": [
        [
          {
            "node": "Registrar log Excel2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait4": {
      "main": [
        [
          {
            "node": "Send email6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript4": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [
          {
            "node": "Form2",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait4",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "¿Es JPG?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Es JPG?1": {
      "main": [
        [
          {
            "node": "Start ImagePDF Task",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload imagen a ImagePDF1": {
      "main": [
        [
          {
            "node": "Process (ImagePDF)1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process (ImagePDF)1": {
      "main": [
        [
          {
            "node": "Download PDF convertido1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download PDF convertido1": {
      "main": [
        [
          {
            "node": "Añadir metadatos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start ImagePDF Task": {
      "main": [
        [
          {
            "node": "Upload imagen a ImagePDF1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Buscar carpeta semana1": {
      "main": [
        [
          {
            "node": "¿Existe carpeta semana?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Existe carpeta semana?1": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "Crear carpeta semana1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crear carpeta semana1": {
      "main": [
        [
          {
            "node": "Merge2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Guardar factura1": {
      "main": [
        [
          {
            "node": "Registrar log Excel4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Renombrar factura1": {
      "main": [
        [
          {
            "node": "Calcular clave factura",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze document1": {
      "main": [
        [
          {
            "node": "Code in JavaScript5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript5": {
      "main": [
        [
          {
            "node": "Renombrar factura1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge2": {
      "main": [
        [
          {
            "node": "Guardar factura1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript6": {
      "main": [
        [
          {
            "node": "Analyze document1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait6": {
      "main": [
        [
          {
            "node": "Añadir metadatos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Formulario cerrado?1": {
      "main": [
        [
          {
            "node": "Form3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Detectar PDF cifrado (subida)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar campos adicionales1": {
      "main": [
        [
          {
            "node": "¿Hay campos especiales rellenados?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay campos especiales rellenados?1": {
      "main": [
        [
          {
            "node": "Send email5",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Registrar log Excel2": {
      "main": [
        [
          {
            "node": "Code in JavaScript6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Detectar PDFs cifrados (semana)": {
      "main": [
        [
          {
            "node": "¿Hay PDFs cifrados (semana)?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay PDFs cifrados (semana)?": {
      "main": [
        [
          {
            "node": "Aviso PDF cifrado (semana)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Items (Lotes)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aviso PDF cifrado (semana)": {
      "main": [
        [
          {
            "node": "Reabrir formulario facturas1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Descargar cada PDF1": {
      "main": [
        [
          {
            "node": "Comprobar descargas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Archivar semana procesada1": {
      "main": [
        [
          {
            "node": "Reabrir formulario facturas1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Auth iLoveAPI\"1": {
      "main": [
        [
          {
            "node": "HTTP Request \"Start Merge Task\"1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Start Merge Task\"1": {
      "main": [
        [
          {
            "node": "Leer pendientes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Upload File\"1": {
      "main": [
        [
          {
            "node": "Code in JavaScript7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript7": {
      "main": [
        [
          {
            "node": "HTTP Request \"Process (Merge)\"1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Process (Merge)\"1": {
      "main": [
        [
          {
            "node": "HTTP Request \"Download PDF fusionado\"1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Nombrar archivo semanal1": {
      "main": [
        [
          {
            "node": "Crear carpeta backup semana1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge3",
            "type": "main",
            "index": 0
          },
          {
            "node": "Send email3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crear carpeta backup semana1": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge3": {
      "main": [
        [
          {
            "node": "Archivar semana procesada1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send email3": {
      "main": [
        [
          {
            "node": "Wait7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait7": {
      "main": [
        [
          {
            "node": "Preparar marcado fusionadas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cerrar formulario facturas1": {
      "main": [
        [
          {
            "node": "Wait8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait8": {
      "main": [
        [
          {
            "node": "HTTP Request \"Auth iLoveAPI\"1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Registrar log Excel3": {
      "main": [
        [
          {
            "node": "Leer registros (duplicados)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Registrar log Excel4": {
      "main": [
        [
          {
            "node": "Resultado: guardada",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items (Lotes)": {
      "main": [
        [
          {
            "node": "Code (Recopilar todos los lotes)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Iniciar tarea de lote",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Iniciar tarea de lote": {
      "main": [
        [
          {
            "node": "HTTP Request \"Upload File\" (Lote)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Upload File\" (Lote)": {
      "main": [
        [
          {
            "node": "Code (Recopilar lote)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Recopilar lote)": {
      "main": [
        [
          {
            "node": "HTTP Request \"Process (Merge)\" (Lote)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Process (Merge)\" (Lote)": {
      "main": [
        [
          {
            "node": "HTTP Request \"Download PDF fusionado\" (Lote)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Download PDF fusionado\" (Lote)": {
      "main": [
        [
          {
            "node": "Loop Over Items (Lotes)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Recopilar todos los lotes)": {
      "main": [
        [
          {
            "node": "¿Más de un lote?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Más de un lote?": {
      "main": [
        [
          {
            "node": "Preparar fusión final",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Nombrar archivo semanal1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Preparar fusión final": {
      "main": [
        [
          {
            "node": "HTTP Request \"Upload File\" (Final)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Upload File\" (Final)": {
      "main": [
        [
          {
            "node": "Code (Recopilar final)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Recopilar final)": {
      "main": [
        [
          {
            "node": "HTTP Request \"Process (Merge)\" (Final)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Process (Merge)\" (Final)": {
      "main": [
        [
          {
            "node": "HTTP Request \"Download PDF fusionado\" (Final)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Download PDF fusionado\" (Final)": {
      "main": [
        [
          {
            "node": "Nombrar archivo semanal1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reabrir formulario facturas2": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Abrir Formulario": {
      "main": [
        [
          {
            "node": "Reabrir formulario facturas2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cerrar formulario": {
      "main": [
        [
          {
            "node": "Cerrar formulario facturas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Cerrar formulario facturas2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Cerrar formulario facturas2": {
      "main": [
        [
          {
            "node": "En mantenimiento - Sistema Facturas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Sistema Facturas disponible de nuevo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay tarjeta seleccionada?": {
      "main": [
        [
          {
            "node": "Iniciar tarea de marca de agua",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Buscar carpeta semana1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Iniciar tarea de marca de agua": {
      "main": [
        [
          {
            "node": "HTTP Request \"Upload PDF a marca de agua\"",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Upload PDF a marca de agua\"": {
      "main": [
        [
          {
            "node": "Code (Preparar proceso marca de agua)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Preparar proceso marca de agua)": {
      "main": [
        [
          {
            "node": "HTTP Request \"Process (Watermark)\"",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Process (Watermark)\"": {
      "main": [
        [
          {
            "node": "HTTP Request \"Download PDF con marca de agua\"",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request \"Download PDF con marca de agua\"": {
      "main": [
        [
          {
            "node": "Code (Combinar marca de agua)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code (Combinar marca de agua)": {
      "main": [
        [
          {
            "node": "Buscar carpeta semana1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Mantenimiento": {
      "main": [
        [
          {
            "node": "En 3 minutos estará en mantenimiento - Sistema Facturas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "En 3 minutos estará en mantenimiento - Sistema Facturas": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calcular clave factura": {
      "main": [
        [
          {
            "node": "Registrar log Excel3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leer registros (duplicados)": {
      "main": [
        [
          {
            "node": "Comprobar duplicado",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar duplicado": {
      "main": [
        [
          {
            "node": "¿Es duplicada?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Es duplicada?": {
      "main": [
        [
          {
            "node": "Aviso factura duplicada (email usuario)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Comprobar CIF factura",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aviso factura duplicada (email usuario)": {
      "main": [
        [
          {
            "node": "Registrar duplicado Excel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Registrar duplicado Excel": {
      "main": [
        [
          {
            "node": "Resultado: duplicada",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Leer pendientes": {
      "main": [
        [
          {
            "node": "Filtrar pendientes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filtrar pendientes": {
      "main": [
        [
          {
            "node": "Descargar cada PDF1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comprobar descargas": {
      "main": [
        [
          {
            "node": "¿Hay facturas para unir?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "¿Hay facturas para unir?": {
      "main": [
        [
          {
            "node": "Detectar PDFs cifrados (semana)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Reabrir formulario facturas1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Preparar marcado fusionadas": {
      "main": [
        [
          {
            "node": "Marcar fusionadas",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Marcar fusionadas": {
      "main": [
        [
          {
            "node": "Reabrir formulario facturas1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resultado: guardada": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resultado: duplicada": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resultado: CIF": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "timeSavedMode": "fixed",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false,
    "errorWorkflow": "kVc6CLVysaTkPVcO"
  },
  "versionId": "5e75b543-63b5-49d9-8e62-e21c69b391ee",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "80c4e73d6e4b215e7708bb6d46edde27853913136eaeb076ba669a719550059e"
  },
  "id": "rhOaA1UB6GymUtmz",
  "tags": []
}