From f65a56fc3c4333d9bc435c347ba5d3c3d89c375d Mon Sep 17 00:00:00 2001 From: Isaac Aracena Date: Fri, 31 Jul 2026 10:53:28 -0400 Subject: [PATCH] =?UTF-8?q?Actualiza=20frontend,=20integraciones=20y=20dis?= =?UTF-8?q?t=20de=20producci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 8 +- AGENTS.md | 2 +- dist/apple-touch-icon.png | Bin 0 -> 5512 bytes dist/assets/glm-logo-BESrJPJ4.png | Bin 0 -> 5957 bytes dist/assets/index-DjmlsRNV.js | 9 + dist/assets/index-DrJGHNJG.css | 2 + dist/favicon-192.png | Bin 0 -> 6062 bytes dist/favicon-32.png | Bin 0 -> 767 bytes dist/favicon.ico | Bin 0 -> 18225 bytes dist/glm-logo-completo.png | Bin 0 -> 17295 bytes dist/index.html | 30 + n8n/CONFIGURACION.md | 107 ++- ...o-de-Impuestos-GLM-BambooHR-Contactos.json | 281 ++++++ ...ento-de-Impuestos-GLM-Google-Calendar.json | 775 +++++++++++++++ ...puestos-GLM-Recordatorios-Actualizado.json | 586 ++++++++++++ n8n/Seguimiento-de-Impuestos-GLM.json | 382 +++++--- public/glm-logo-completo.png | Bin 0 -> 17295 bytes src/TaxApp.tsx | 882 ++++++++++++++---- src/lib/supabase-data.ts | 279 ++++-- src/lib/tax-utils.ts | 31 +- src/vite-env.d.ts | 2 + supabase/README.md | 48 +- supabase/Seguimiento-de-Impuestos-GLM.sql | 448 +++++++++ ...actualizacion_bamboohr_google_calendar.sql | 266 ++++++ ...actualizacion_google_chat_sin_whatsapp.sql | 174 ++++ 25 files changed, 3876 insertions(+), 436 deletions(-) create mode 100644 dist/apple-touch-icon.png create mode 100644 dist/assets/glm-logo-BESrJPJ4.png create mode 100644 dist/assets/index-DjmlsRNV.js create mode 100644 dist/assets/index-DrJGHNJG.css create mode 100644 dist/favicon-192.png create mode 100644 dist/favicon-32.png create mode 100644 dist/favicon.ico create mode 100644 dist/glm-logo-completo.png create mode 100644 dist/index.html create mode 100644 n8n/Seguimiento-de-Impuestos-GLM-BambooHR-Contactos.json create mode 100644 n8n/Seguimiento-de-Impuestos-GLM-Google-Calendar.json create mode 100644 n8n/Seguimiento-de-Impuestos-GLM-Recordatorios-Actualizado.json create mode 100644 public/glm-logo-completo.png create mode 100644 supabase/actualizacion_bamboohr_google_calendar.sql create mode 100644 supabase/actualizacion_google_chat_sin_whatsapp.sql diff --git a/.env.example b/.env.example index 8cec9e4..78db007 100644 --- a/.env.example +++ b/.env.example @@ -5,5 +5,11 @@ VITE_SUPABASE_URL=https://dbit.digitalcompass.agency VITE_SUPABASE_PUBLISHABLE_KEY=sb_publishable_REEMPLAZAR # VITE_SUPABASE_ANON_KEY=REEMPLAZAR_CON_ANON_KEY -# Webhook de producción de n8n. El frontend lo notifica después de guardar cambios. +# Webhook del flujo de recordatorios, conservado como referencia de producción. VITE_TAX_WEBHOOK_URL=https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos + +# Busca empleados en BambooHR para completar contactos automáticamente. +VITE_BAMBOOHR_CONTACT_WEBHOOK_URL=https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-bamboohr-contacto + +# Sincroniza altas, cambios y eliminaciones con Google Calendar. +VITE_GOOGLE_CALENDAR_WEBHOOK_URL=https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-google-calendar diff --git a/AGENTS.md b/AGENTS.md index 4ba1e83..c246709 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,5 +9,5 @@ - Nunca hardcodear correos autorizados en React: se administran desde Supabase. - Nunca exponer la llave `service_role`; el frontend sólo utiliza una llave pública o `anon`. - El workflow de n8n consulta contactos y obligaciones directamente desde Supabase. -- Mantener la base de Vite en `/calendario-impuestos/` salvo cambio explícito de la ruta pública. +- Mantener la base de Vite en `/` porque la app se publica en la raíz de `https://home.digitalcompass.agency/`. - Antes de entregar cambios, ejecutar `npm run typecheck`, `npm run lint` y `npm run build`. diff --git a/dist/apple-touch-icon.png b/dist/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..30cd70e7e72097a087a7862cf2833776d311b23a GIT binary patch literal 5512 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 TJVCwOumTKpO?4`?U%dGrKU(e4 literal 0 HcmV?d00001 diff --git a/dist/assets/glm-logo-BESrJPJ4.png b/dist/assets/glm-logo-BESrJPJ4.png new file mode 100644 index 0000000000000000000000000000000000000000..e967662eb79e7c2ebcb99cd4c5228fab1767948e GIT binary patch literal 5957 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 ItO<+yAA|r=k^lez literal 0 HcmV?d00001 diff --git a/dist/assets/index-DjmlsRNV.js b/dist/assets/index-DjmlsRNV.js new file mode 100644 index 0000000..5f3ac23 --- /dev/null +++ b/dist/assets/index-DjmlsRNV.js @@ -0,0 +1,9 @@ +var e=(e,t)=>()=>(t||(e((t={exports:{}}).exports,t),e=null),t.exports);(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var t=e((e=>{function t(e,t){var n=e.length;e.push(t);a:for(;0>>1,a=e[r];if(0>>1;ri(c,n))li(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[s]=n,r=s);else if(li(u,n))e[r]=u,e[l]=n,r=l;else break a}}return t}function i(e,t){var n=e.sortIndex-t.sortIndex;return n===0?e.id-t.id:n}if(e.unstable_now=void 0,typeof performance==`object`&&typeof performance.now==`function`){var a=performance;e.unstable_now=function(){return a.now()}}else{var o=Date,s=o.now();e.unstable_now=function(){return o.now()-s}}var c=[],l=[],u=1,d=null,f=3,p=!1,m=!1,h=!1,g=!1,_=typeof setTimeout==`function`?setTimeout:null,v=typeof clearTimeout==`function`?clearTimeout:null,y=typeof setImmediate<`u`?setImmediate:null;function b(e){for(var i=n(l);i!==null;){if(i.callback===null)r(l);else if(i.startTime<=e)r(l),i.sortIndex=i.expirationTime,t(c,i);else break;i=n(l)}}function x(e){if(h=!1,b(e),!m)if(n(c)!==null)m=!0,ee||(ee=!0,w());else{var t=n(l);t!==null&&oe(x,t.startTime-e)}}var ee=!1,te=-1,S=5,ne=-1;function C(){return g?!0:!(e.unstable_now()-net&&C());){var o=d.callback;if(typeof o==`function`){d.callback=null,f=d.priorityLevel;var s=o(d.expirationTime<=t);if(t=e.unstable_now(),typeof s==`function`){d.callback=s,b(t),i=!0;break b}d===n(c)&&r(c),b(t)}else r(c);d=n(c)}if(d!==null)i=!0;else{var u=n(l);u!==null&&oe(x,u.startTime-t),i=!1}}break a}finally{d=null,f=a,p=!1}i=void 0}}finally{i?w():ee=!1}}}var w;if(typeof y==`function`)w=function(){y(re)};else if(typeof MessageChannel<`u`){var ie=new MessageChannel,ae=ie.port2;ie.port1.onmessage=re,w=function(){ae.postMessage(null)}}else w=function(){_(re,0)};function oe(t,n){te=_(function(){t(e.unstable_now())},n)}e.unstable_IdlePriority=5,e.unstable_ImmediatePriority=1,e.unstable_LowPriority=4,e.unstable_NormalPriority=3,e.unstable_Profiling=null,e.unstable_UserBlockingPriority=2,e.unstable_cancelCallback=function(e){e.callback=null},e.unstable_forceFrameRate=function(e){0>e||125o?(r.sortIndex=a,t(l,r),n(c)===null&&r===n(l)&&(h?(v(te),te=-1):h=!0,oe(x,a-o))):(r.sortIndex=s,t(c,r),m||p||(m=!0,ee||(ee=!0,w()))),r},e.unstable_shouldYield=C,e.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}})),n=e(((e,n)=>{n.exports=t()})),r=e((e=>{var t=Symbol.for(`react.transitional.element`),n=Symbol.for(`react.portal`),r=Symbol.for(`react.fragment`),i=Symbol.for(`react.strict_mode`),a=Symbol.for(`react.profiler`),o=Symbol.for(`react.consumer`),s=Symbol.for(`react.context`),c=Symbol.for(`react.forward_ref`),l=Symbol.for(`react.suspense`),u=Symbol.for(`react.memo`),d=Symbol.for(`react.lazy`),f=Symbol.for(`react.activity`),p=Symbol.iterator;function m(e){return typeof e!=`object`||!e?null:(e=p&&e[p]||e[`@@iterator`],typeof e==`function`?e:null)}var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},g=Object.assign,_={};function v(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}v.prototype.isReactComponent={},v.prototype.setState=function(e,t){if(typeof e!=`object`&&typeof e!=`function`&&e!=null)throw Error(`takes an object of state variables to update or a function which returns an object of state variables.`);this.updater.enqueueSetState(this,e,t,`setState`)},v.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,`forceUpdate`)};function y(){}y.prototype=v.prototype;function b(e,t,n){this.props=e,this.context=t,this.refs=_,this.updater=n||h}var x=b.prototype=new y;x.constructor=b,g(x,v.prototype),x.isPureReactComponent=!0;var ee=Array.isArray;function te(){}var S={H:null,A:null,T:null,S:null},ne=Object.prototype.hasOwnProperty;function C(e,n,r){var i=r.ref;return{$$typeof:t,type:e,key:n,ref:i===void 0?null:i,props:r}}function re(e,t){return C(e.type,t,e.props)}function w(e){return typeof e==`object`&&!!e&&e.$$typeof===t}function ie(e){var t={"=":`=0`,":":`=2`};return`$`+e.replace(/[=:]/g,function(e){return t[e]})}var ae=/\/+/g;function oe(e,t){return typeof e==`object`&&e&&e.key!=null?ie(``+e.key):t.toString(36)}function se(e){switch(e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason;default:switch(typeof e.status==`string`?e.then(te,te):(e.status=`pending`,e.then(function(t){e.status===`pending`&&(e.status=`fulfilled`,e.value=t)},function(t){e.status===`pending`&&(e.status=`rejected`,e.reason=t)})),e.status){case`fulfilled`:return e.value;case`rejected`:throw e.reason}}throw e}function ce(e,r,i,a,o){var s=typeof e;(s===`undefined`||s===`boolean`)&&(e=null);var c=!1;if(e===null)c=!0;else switch(s){case`bigint`:case`string`:case`number`:c=!0;break;case`object`:switch(e.$$typeof){case t:case n:c=!0;break;case d:return c=e._init,ce(c(e._payload),r,i,a,o)}}if(c)return o=o(e),c=a===``?`.`+oe(e,0):a,ee(o)?(i=``,c!=null&&(i=c.replace(ae,`$&/`)+`/`),ce(o,r,i,``,function(e){return e})):o!=null&&(w(o)&&(o=re(o,i+(o.key==null||e&&e.key===o.key?``:(``+o.key).replace(ae,`$&/`)+`/`)+c)),r.push(o)),1;c=0;var l=a===``?`.`:a+`:`;if(ee(e))for(var u=0;u{t.exports=r()})),a=e((e=>{var t=i();function n(e){var t=`https://react.dev/errors/`+e;if(1{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=a()})),s=e((e=>{var t=n(),r=i(),a=o();function s(e){var t=`https://react.dev/errors/`+e;if(1D||(e.current=fe[D],fe[D]=null,D--)}function k(e,t){D++,fe[D]=e.current,e.current=t}var me=pe(null),he=pe(null),ge=pe(null),_e=pe(null);function ve(e,t){switch(k(ge,t),k(he,e),k(me,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Vd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Vd(t),e=Hd(t,e);else switch(e){case`svg`:e=1;break;case`math`:e=2;break;default:e=0}}O(me),k(me,e)}function ye(){O(me),O(he),O(ge)}function be(e){e.memoizedState!==null&&k(_e,e);var t=me.current,n=Hd(t,e.type);t!==n&&(k(he,e),k(me,n))}function xe(e){he.current===e&&(O(me),O(he)),_e.current===e&&(O(_e),Qf._currentValue=de)}var Se,Ce;function we(e){if(Se===void 0)try{throw Error()}catch(e){var t=e.stack.trim().match(/\n( *(at )?)/);Se=t&&t[1]||``,Ce=-1)`:-1i||c[r]!==l[i]){var u=` +`+c[r].replace(` at new `,` at `);return e.displayName&&u.includes(``)&&(u=u.replace(``,e.displayName)),u}while(1<=r&&0<=i);break}}}finally{Te=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:``)?we(n):``}function De(e,t){switch(e.tag){case 26:case 27:case 5:return we(e.type);case 16:return we(`Lazy`);case 13:return e.child!==t&&t!==null?we(`Suspense Fallback`):we(`Suspense`);case 19:return we(`SuspenseList`);case 0:case 15:return Ee(e.type,!1);case 11:return Ee(e.type.render,!1);case 1:return Ee(e.type,!0);case 31:return we(`Activity`);default:return``}}function Oe(e){try{var t=``,n=null;do t+=De(e,n),n=e,e=e.return;while(e);return t}catch(e){return` +Error generating stack: `+e.message+` +`+e.stack}}var ke=Object.prototype.hasOwnProperty,Ae=t.unstable_scheduleCallback,je=t.unstable_cancelCallback,Me=t.unstable_shouldYield,Ne=t.unstable_requestPaint,A=t.unstable_now,Pe=t.unstable_getCurrentPriorityLevel,Fe=t.unstable_ImmediatePriority,Ie=t.unstable_UserBlockingPriority,Le=t.unstable_NormalPriority,Re=t.unstable_LowPriority,ze=t.unstable_IdlePriority,Be=t.log,Ve=t.unstable_setDisableYieldValue,He=null,Ue=null;function We(e){if(typeof Be==`function`&&Ve(e),Ue&&typeof Ue.setStrictMode==`function`)try{Ue.setStrictMode(He,e)}catch{}}var Ge=Math.clz32?Math.clz32:Je,Ke=Math.log,qe=Math.LN2;function Je(e){return e>>>=0,e===0?32:31-(Ke(e)/qe|0)|0}var Ye=256,Xe=262144,Ze=4194304;function Qe(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function $e(e,t,n){var r=e.pendingLanes;if(r===0)return 0;var i=0,a=e.suspendedLanes,o=e.pingedLanes;e=e.warmLanes;var s=r&134217727;return s===0?(s=r&~a,s===0?o===0?n||(n=r&~e,n!==0&&(i=Qe(n))):i=Qe(o):i=Qe(s)):(r=s&~a,r===0?(o&=s,o===0?n||(n=s&~e,n!==0&&(i=Qe(n))):i=Qe(o)):i=Qe(r)),i===0?0:t!==0&&t!==i&&(t&a)===0&&(a=i&-i,n=t&-t,a>=n||a===32&&n&4194048)?t:i}function et(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function tt(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function nt(){var e=Ze;return Ze<<=1,!(Ze&62914560)&&(Ze=4194304),e}function rt(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function it(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function at(e,t,n,r,i,a){var o=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var s=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=o&~n;0`u`||window.document===void 0||window.document.createElement===void 0),_n=!1;if(gn)try{var vn={};Object.defineProperty(vn,"passive",{get:function(){_n=!0}}),window.addEventListener(`test`,vn,vn),window.removeEventListener(`test`,vn,vn)}catch{_n=!1}var yn=null,bn=null,xn=null;function Sn(){if(xn)return xn;var e,t=bn,n=t.length,r,i=`value`in yn?yn.value:yn.textContent,a=i.length;for(e=0;e=er),rr=` `,ir=!1;function ar(e,t){switch(e){case`keyup`:return Qn.indexOf(t.keyCode)!==-1;case`keydown`:return t.keyCode!==229;case`keypress`:case`mousedown`:case`focusout`:return!0;default:return!1}}function or(e){return e=e.detail,typeof e==`object`&&`data`in e?e.data:null}var sr=!1;function cr(e,t){switch(e){case`compositionend`:return or(t);case`keypress`:return t.which===32?(ir=!0,rr):null;case`textInput`:return e=t.data,e===rr&&ir?null:e;default:return null}}function lr(e,t){if(sr)return e===`compositionend`||!$n&&ar(e,t)?(e=Sn(),xn=bn=yn=null,sr=!1,e):null;switch(e){case`paste`:return null;case`keypress`:if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}a:{for(;n;){if(n.nextSibling){n=n.nextSibling;break a}n=n.parentNode}n=void 0}n=jr(n)}}function Nr(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nr(e,t.parentNode):`contains`in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Pr(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Ut(e.document);t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==`string`}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ut(e.document)}return t}function Fr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t===`input`&&(e.type===`text`||e.type===`search`||e.type===`tel`||e.type===`url`||e.type===`password`)||t===`textarea`||e.contentEditable===`true`)}var Ir=gn&&`documentMode`in document&&11>=document.documentMode,Lr=null,Rr=null,zr=null,Br=!1;function Vr(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;Br||Lr==null||Lr!==Ut(r)||(r=Lr,`selectionStart`in r&&Fr(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),zr&&Ar(zr,r)||(zr=r,r=Ed(Rr,`onSelect`),0>=o,i-=o,Ni=1<<32-Ge(t)+i|n<h?(g=d,d=null):g=d.sibling;var _=p(i,d,s[h],c);if(_===null){d===null&&(d=g);break}e&&d&&_.alternate===null&&t(i,d),o=a(_,o,h),u===null?l=_:u.sibling=_,u=_,d=g}if(h===s.length)return n(i,d),N&&Fi(i,h),l;if(d===null){for(;hg?(_=h,h=null):_=h.sibling;var y=p(i,h,v.value,l);if(y===null){h===null&&(h=_);break}e&&h&&y.alternate===null&&t(i,h),o=a(y,o,g),d===null?u=y:d.sibling=y,d=y,h=_}if(v.done)return n(i,h),N&&Fi(i,g),u;if(h===null){for(;!v.done;g++,v=c.next())v=f(i,v.value,l),v!==null&&(o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return N&&Fi(i,g),u}for(h=r(h);!v.done;g++,v=c.next())v=m(h,i,g,v.value,l),v!==null&&(e&&v.alternate!==null&&h.delete(v.key===null?g:v.key),o=a(v,o,g),d===null?u=v:d.sibling=v,d=v);return e&&h.forEach(function(e){return t(i,e)}),N&&Fi(i,g),u}function b(e,r,a,c){if(typeof a==`object`&&a&&a.type===y&&a.key===null&&(a=a.props.children),typeof a==`object`&&a){switch(a.$$typeof){case _:a:{for(var l=a.key;r!==null;){if(r.key===l){if(l=a.type,l===y){if(r.tag===7){n(e,r.sibling),c=i(r,a.props.children),c.return=e,e=c;break a}}else if(r.elementType===l||typeof l==`object`&&l&&l.$$typeof===w&&Na(l)===r.type){n(e,r.sibling),c=i(r,a.props),Ba(c,a),c.return=e,e=c;break a}n(e,r);break}else t(e,r);r=r.sibling}a.type===y?(c=bi(a.props.children,e.mode,c,a.key),c.return=e,e=c):(c=yi(a.type,a.key,a.props,null,e.mode,c),Ba(c,a),c.return=e,e=c)}return o(e);case v:a:{for(l=a.key;r!==null;){if(r.key===l)if(r.tag===4&&r.stateNode.containerInfo===a.containerInfo&&r.stateNode.implementation===a.implementation){n(e,r.sibling),c=i(r,a.children||[]),c.return=e,e=c;break a}else{n(e,r);break}else t(e,r);r=r.sibling}c=Ci(a,e.mode,c),c.return=e,e=c}return o(e);case w:return a=Na(a),b(e,r,a,c)}if(ue(a))return h(e,r,a,c);if(se(a)){if(l=se(a),typeof l!=`function`)throw Error(s(150));return a=l.call(a),g(e,r,a,c)}if(typeof a.then==`function`)return b(e,r,za(a),c);if(a.$$typeof===te)return b(e,r,ca(e,a),c);Va(e,a)}return typeof a==`string`&&a!==``||typeof a==`number`||typeof a==`bigint`?(a=``+a,r!==null&&r.tag===6?(n(e,r.sibling),c=i(r,a),c.return=e,e=c):(n(e,r),c=xi(a,e.mode,c),c.return=e,e=c),o(e)):n(e,r)}return function(e,t,n,r){try{Ra=0;var i=b(e,t,n,r);return La=null,i}catch(t){if(t===Da||t===ka)throw t;var a=hi(29,t,null,e.mode);return a.lanes=r,a.return=e,a}}}var Ua=Ha(!0),Wa=Ha(!1),Ga=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function qa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function Ja(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function Ya(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,G&2){var i=r.pending;return i===null?t.next=t:(t.next=i.next,i.next=t),r.pending=t,t=fi(e),di(e,null,n),t}return ci(e,r,t,n),fi(e)}function Xa(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,n&4194048)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}function Za(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var i=null,a=null;if(n=n.firstBaseUpdate,n!==null){do{var o={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};a===null?i=a=o:a=a.next=o,n=n.next}while(n!==null);a===null?i=a=t:a=a.next=t}else i=a=t;n={baseState:r.baseState,firstBaseUpdate:i,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var Qa=!1;function $a(){if(Qa){var e=va;if(e!==null)throw e}}function eo(e,t,n,r){Qa=!1;var i=e.updateQueue;Ga=!1;var a=i.firstBaseUpdate,o=i.lastBaseUpdate,s=i.shared.pending;if(s!==null){i.shared.pending=null;var c=s,l=c.next;c.next=null,o===null?a=l:o.next=l,o=c;var u=e.alternate;u!==null&&(u=u.updateQueue,s=u.lastBaseUpdate,s!==o&&(s===null?u.firstBaseUpdate=l:s.next=l,u.lastBaseUpdate=c))}if(a!==null){var d=i.baseState;o=0,u=l=c=null,s=a;do{var f=s.lane&-536870913,p=f!==s.lane;if(p?(J&f)===f:(r&f)===f){f!==0&&f===_a&&(Qa=!0),u!==null&&(u=u.next={lane:0,tag:s.tag,payload:s.payload,callback:null,next:null});a:{var m=e,g=s;f=t;var _=n;switch(g.tag){case 1:if(m=g.payload,typeof m==`function`){d=m.call(_,d,f);break a}d=m;break a;case 3:m.flags=m.flags&-65537|128;case 0:if(m=g.payload,f=typeof m==`function`?m.call(_,d,f):m,f==null)break a;d=h({},d,f);break a;case 2:Ga=!0}}f=s.callback,f!==null&&(e.flags|=64,p&&(e.flags|=8192),p=i.callbacks,p===null?i.callbacks=[f]:p.push(f))}else p={lane:f,tag:s.tag,payload:s.payload,callback:s.callback,next:null},u===null?(l=u=p,c=d):u=u.next=p,o|=f;if(s=s.next,s===null){if(s=i.shared.pending,s===null)break;p=s,s=p.next,p.next=null,i.lastBaseUpdate=p,i.shared.pending=null}}while(1);u===null&&(c=d),i.baseState=c,i.firstBaseUpdate=l,i.lastBaseUpdate=u,a===null&&(i.shared.lanes=0),Gl|=o,e.lanes=o,e.memoizedState=d}}function to(e,t){if(typeof e!=`function`)throw Error(s(191,e));e.call(t)}function no(e,t){var n=e.callbacks;if(n!==null)for(e.callbacks=null,e=0;ea?a:8;var o=T.T,s={};T.T=s,Ls(e,!1,t,n);try{var c=i(),l=T.S;l!==null&&l(s,c),typeof c==`object`&&c&&typeof c.then==`function`?Is(e,t,xa(c,r),pu(e)):Is(e,t,r,pu(e))}catch(n){Is(e,t,{then:function(){},status:`rejected`,reason:n},pu())}finally{E.p=a,o!==null&&s.types!==null&&(o.types=s.types),T.T=o}}function Es(){}function Ds(e,t,n,r){if(e.tag!==5)throw Error(s(476));var i=Os(e).queue;Ts(e,i,t,de,n===null?Es:function(){return ks(e),n(r)})}function Os(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:de,baseState:de,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:de},next:null};var n={};return t.next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ro,lastRenderedState:n},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function ks(e){var t=Os(e);t.next===null&&(t=e.alternate.memoizedState),Is(e,t.next.queue,{},pu())}function As(){return sa(Qf)}function js(){return B().memoizedState}function Ms(){return B().memoizedState}function Ns(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var n=pu();e=Ja(n);var r=Ya(t,e,n);r!==null&&(hu(r,t,n),Xa(r,t,n)),t={cache:pa()},e.payload=t;return}t=t.return}}function Ps(e,t,n){var r=pu();n={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null},Rs(e)?zs(t,n):(n=li(e,t,n,r),n!==null&&(hu(n,e,r),Bs(n,t,r)))}function Fs(e,t,n){Is(e,t,n,pu())}function Is(e,t,n,r){var i={lane:r,revertLane:0,gesture:null,action:n,hasEagerState:!1,eagerState:null,next:null};if(Rs(e))zs(t,i);else{var a=e.alternate;if(e.lanes===0&&(a===null||a.lanes===0)&&(a=t.lastRenderedReducer,a!==null))try{var o=t.lastRenderedState,s=a(o,n);if(i.hasEagerState=!0,i.eagerState=s,kr(s,o))return ci(e,t,i,0),K===null&&si(),!1}catch{}if(n=li(e,t,i,r),n!==null)return hu(n,e,r),Bs(n,t,r),!0}return!1}function Ls(e,t,n,r){if(r={lane:2,revertLane:dd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},Rs(e)){if(t)throw Error(s(479))}else t=li(e,n,r,2),t!==null&&hu(t,e,2)}function Rs(e){var t=e.alternate;return e===I||t!==null&&t===I}function zs(e,t){yo=vo=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Bs(e,t,n){if(n&4194048){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,st(e,n)}}var Vs={readContext:sa,use:Io,useCallback:z,useContext:z,useEffect:z,useImperativeHandle:z,useLayoutEffect:z,useInsertionEffect:z,useMemo:z,useReducer:z,useRef:z,useState:z,useDebugValue:z,useDeferredValue:z,useTransition:z,useSyncExternalStore:z,useId:z,useHostTransitionStatus:z,useFormState:z,useActionState:z,useOptimistic:z,useMemoCache:z,useCacheRefresh:z};Vs.useEffectEvent=z;var Hs={readContext:sa,use:Io,useCallback:function(e,t){return No().memoizedState=[e,t===void 0?null:t],e},useContext:sa,useEffect:fs,useImperativeHandle:function(e,t,n){n=n==null?null:n.concat([e]),us(4194308,4,vs.bind(null,t,e),n)},useLayoutEffect:function(e,t){return us(4194308,4,e,t)},useInsertionEffect:function(e,t){us(4,2,e,t)},useMemo:function(e,t){var n=No();t=t===void 0?null:t;var r=e();if(bo){We(!0);try{e()}finally{We(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=No();if(n!==void 0){var i=n(t);if(bo){We(!0);try{n(t)}finally{We(!1)}}}else i=t;return r.memoizedState=r.baseState=i,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:i},r.queue=e,e=e.dispatch=Ps.bind(null,I,e),[r.memoizedState,e]},useRef:function(e){var t=No();return e={current:e},t.memoizedState=e},useState:function(e){e=Jo(e);var t=e.queue,n=Fs.bind(null,I,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:bs,useDeferredValue:function(e,t){return Cs(No(),e,t)},useTransition:function(){var e=Jo(!1);return e=Ts.bind(null,I,e.queue,!0,!1),No().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=I,i=No();if(N){if(n===void 0)throw Error(s(407));n=n()}else{if(n=t(),K===null)throw Error(s(349));J&127||Uo(r,t,n)}i.memoizedState=n;var a={value:n,getSnapshot:t};return i.queue=a,fs(Go.bind(null,r,a,e),[e]),r.flags|=2048,cs(9,{destroy:void 0},Wo.bind(null,r,a,n,t),null),n},useId:function(){var e=No(),t=K.identifierPrefix;if(N){var n=Pi,r=Ni;n=(r&~(1<<32-Ge(r)-1)).toString(32)+n,t=`_`+t+`R_`+n,n=xo++,0<\/script>`,a=a.removeChild(a.firstChild);break;case`select`:a=typeof r.is==`string`?o.createElement(`select`,{is:r.is}):o.createElement(`select`),r.multiple?a.multiple=!0:r.size&&(a.size=r.size);break;default:a=typeof r.is==`string`?o.createElement(i,{is:r.is}):o.createElement(i)}}a[mt]=t,a[ht]=r;a:for(o=t.child;o!==null;){if(o.tag===5||o.tag===6)a.appendChild(o.stateNode);else if(o.tag!==4&&o.tag!==27&&o.child!==null){o.child.return=o,o=o.child;continue}if(o===t)break a;for(;o.sibling===null;){if(o.return===null||o.return===t)break a;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=a;a:switch(Pd(a,i,r),i){case`button`:case`input`:case`select`:case`textarea`:r=!!r.autoFocus;break a;case`img`:r=!0;break a;default:r=!1}r&&Fc(t)}}return H(t),Ic(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,n),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&Fc(t);else{if(typeof r!=`string`&&t.stateNode===null)throw Error(s(166));if(e=ge.current,qi(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,i=Bi,i!==null)switch(i.tag){case 27:case 5:r=i.memoizedProps}e[mt]=t,e=!!(e.nodeValue===n||r!==null&&!0===r.suppressHydrationWarning||Md(e.nodeValue,n)),e||Wi(t,!0)}else e=Bd(e).createTextNode(r),e[mt]=t,t.stateNode=e}return H(t),null;case 31:if(n=t.memoizedState,e===null||e.memoizedState!==null){if(r=qi(t),n!==null){if(e===null){if(!r)throw Error(s(318));if(e=t.memoizedState,e=e===null?null:e.dehydrated,!e)throw Error(s(557));e[mt]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),e=!1}else n=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=n),e=!0;if(!e)return t.flags&256?(ho(t),t):(ho(t),null);if(t.flags&128)throw Error(s(558))}return H(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(i=qi(t),r!==null&&r.dehydrated!==null){if(e===null){if(!i)throw Error(s(318));if(i=t.memoizedState,i=i===null?null:i.dehydrated,!i)throw Error(s(317));i[mt]=t}else Ji(),!(t.flags&128)&&(t.memoizedState=null),t.flags|=4;H(t),i=!1}else i=Yi(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),i=!0;if(!i)return t.flags&256?(ho(t),t):(ho(t),null)}return ho(t),t.flags&128?(t.lanes=n,t):(n=r!==null,e=e!==null&&e.memoizedState!==null,n&&(r=t.child,i=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(i=r.alternate.memoizedState.cachePool.pool),a=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(a=r.memoizedState.cachePool.pool),a!==i&&(r.flags|=2048)),n!==e&&n&&(t.child.flags|=8192),Rc(t,t.updateQueue),H(t),null);case 4:return ye(),e===null&&Sd(t.stateNode.containerInfo),H(t),null;case 10:return ta(t.type),H(t),null;case 19:if(O(F),r=t.memoizedState,r===null)return H(t),null;if(i=(t.flags&128)!=0,a=r.rendering,a===null)if(i)zc(r,!1);else{if(X!==0||e!==null&&e.flags&128)for(e=t.child;e!==null;){if(a=go(e),a!==null){for(t.flags|=128,zc(r,!1),e=a.updateQueue,t.updateQueue=e,Rc(t,e),t.subtreeFlags=0,e=n,n=t.child;n!==null;)vi(n,e),n=n.sibling;return k(F,F.current&1|2),N&&Fi(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&A()>tu&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304)}else{if(!i)if(e=go(a),e!==null){if(t.flags|=128,i=!0,e=e.updateQueue,t.updateQueue=e,Rc(t,e),zc(r,!0),r.tail===null&&r.tailMode===`hidden`&&!a.alternate&&!N)return H(t),null}else 2*A()-r.renderingStartTime>tu&&n!==536870912&&(t.flags|=128,i=!0,zc(r,!1),t.lanes=4194304);r.isBackwards?(a.sibling=t.child,t.child=a):(e=r.last,e===null?t.child=a:e.sibling=a,r.last=a)}return r.tail===null?(H(t),null):(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=A(),e.sibling=null,n=F.current,k(F,i?n&1|2:n&1),N&&Fi(t,r.treeForkCount),e);case 22:case 23:return ho(t),so(),r=t.memoizedState!==null,e===null?r&&(t.flags|=8192):e.memoizedState!==null!==r&&(t.flags|=8192),r?n&536870912&&!(t.flags&128)&&(H(t),t.subtreeFlags&6&&(t.flags|=8192)):H(t),n=t.updateQueue,n!==null&&Rc(t,n.retryQueue),n=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(n=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),e!==null&&O(Ca),null;case 24:return n=null,e!==null&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ta(P),H(t),null;case 25:return null;case 30:return null}throw Error(s(156,t.tag))}function Vc(e,t){switch(Ri(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ta(P),ye(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return xe(t),null;case 31:if(t.memoizedState!==null){if(ho(t),t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(ho(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(s(340));Ji()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return O(F),null;case 4:return ye(),null;case 10:return ta(t.type),null;case 22:case 23:return ho(t),so(),e!==null&&O(Ca),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return ta(P),null;case 25:return null;default:return null}}function Hc(e,t){switch(Ri(t),t.tag){case 3:ta(P),ye();break;case 26:case 27:case 5:xe(t);break;case 4:ye();break;case 31:t.memoizedState!==null&&ho(t);break;case 13:ho(t);break;case 19:O(F);break;case 10:ta(t.type);break;case 22:case 23:ho(t),so(),e!==null&&O(Ca);break;case 24:ta(P)}}function Uc(e,t){try{var n=t.updateQueue,r=n===null?null:n.lastEffect;if(r!==null){var i=r.next;n=i;do{if((n.tag&e)===e){r=void 0;var a=n.create,o=n.inst;r=a(),o.destroy=r}n=n.next}while(n!==i)}}catch(e){Z(t,t.return,e)}}function Wc(e,t,n){try{var r=t.updateQueue,i=r===null?null:r.lastEffect;if(i!==null){var a=i.next;r=a;do{if((r.tag&e)===e){var o=r.inst,s=o.destroy;if(s!==void 0){o.destroy=void 0,i=t;var c=n,l=s;try{l()}catch(e){Z(i,c,e)}}}r=r.next}while(r!==a)}}catch(e){Z(t,t.return,e)}}function Gc(e){var t=e.updateQueue;if(t!==null){var n=e.stateNode;try{no(t,n)}catch(t){Z(e,e.return,t)}}}function Kc(e,t,n){n.props=Ys(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(n){Z(e,t,n)}}function qc(e,t){try{var n=e.ref;if(n!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof n==`function`?e.refCleanup=n(r):n.current=r}}catch(n){Z(e,t,n)}}function Jc(e,t){var n=e.ref,r=e.refCleanup;if(n!==null)if(typeof r==`function`)try{r()}catch(n){Z(e,t,n)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof n==`function`)try{n(null)}catch(n){Z(e,t,n)}else n.current=null}function Yc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{a:switch(t){case`button`:case`input`:case`select`:case`textarea`:n.autoFocus&&r.focus();break a;case`img`:n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(t){Z(e,e.return,t)}}function Xc(e,t,n){try{var r=e.stateNode;Fd(r,e.type,n,t),r[ht]=t}catch(t){Z(e,e.return,t)}}function Zc(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&Zd(e.type)||e.tag===4}function Qc(e){a:for(;;){for(;e.sibling===null;){if(e.return===null||Zc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&Zd(e.type)||e.flags&2||e.child===null||e.tag===4)continue a;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function $c(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n).insertBefore(e,t):(t=n.nodeType===9?n.body:n.nodeName===`HTML`?n.ownerDocument.body:n,t.appendChild(e),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=sn));else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode,t=null),e=e.child,e!==null))for($c(e,t,n),e=e.sibling;e!==null;)$c(e,t,n),e=e.sibling}function el(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(r===27&&Zd(e.type)&&(n=e.stateNode),e=e.child,e!==null))for(el(e,t,n),e=e.sibling;e!==null;)el(e,t,n),e=e.sibling}function tl(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,i=t.attributes;i.length;)t.removeAttributeNode(i[0]);Pd(t,r,n),t[mt]=e,t[ht]=n}catch(t){Z(e,e.return,t)}}var nl=!1,U=!1,rl=!1,il=typeof WeakSet==`function`?WeakSet:Set,al=null;function ol(e,t){if(e=e.containerInfo,Rd=sp,e=Pr(e),Fr(e)){if(`selectionStart`in e)var n={start:e.selectionStart,end:e.selectionEnd};else a:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var i=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch{n=null;break a}var o=0,c=-1,l=-1,u=0,d=0,f=e,p=null;b:for(;;){for(var m;f!==n||i!==0&&f.nodeType!==3||(c=o+i),f!==a||r!==0&&f.nodeType!==3||(l=o+r),f.nodeType===3&&(o+=f.nodeValue.length),(m=f.firstChild)!==null;)p=f,f=m;for(;;){if(f===e)break b;if(p===n&&++u===i&&(c=o),p===a&&++d===r&&(l=o),(m=f.nextSibling)!==null)break;f=p,p=f.parentNode}f=m}n=c===-1||l===-1?null:{start:c,end:l}}else n=null}n||={start:0,end:0}}else n=null;for(zd={focusedElem:e,selectionRange:n},sp=!1,al=t;al!==null;)if(t=al,e=t.child,t.subtreeFlags&1028&&e!==null)e.return=t,al=e;else for(;al!==null;){switch(t=al,a=t.alternate,e=t.flags,t.tag){case 0:if(e&4&&(e=t.updateQueue,e=e===null?null:e.events,e!==null))for(n=0;n title`))),Pd(a,r,n),a[mt]=e,j(a),r=a;break a;case`link`:var o=Vf(`link`,`href`,i).get(r+(n.href||``));if(o){for(var c=0;cg&&(o=g,g=h,h=o);var _=Mr(s,h),v=Mr(s,g);if(_&&v&&(p.rangeCount!==1||p.anchorNode!==_.node||p.anchorOffset!==_.offset||p.focusNode!==v.node||p.focusOffset!==v.offset)){var y=d.createRange();y.setStart(_.node,_.offset),p.removeAllRanges(),h>g?(p.addRange(y),p.extend(v.node,v.offset)):(y.setEnd(v.node,v.offset),p.addRange(y))}}}}for(d=[],p=s;p=p.parentNode;)p.nodeType===1&&d.push({element:p,left:p.scrollLeft,top:p.scrollTop});for(typeof s.focus==`function`&&s.focus(),s=0;sn?32:n,T.T=null,n=lu,lu=null;var a=au,o=su;if(iu=0,ou=au=null,su=0,G&6)throw Error(s(331));var c=G;if(G|=4,Fl(a.current),Dl(a,a.current,o,n),G=c,id(0,!1),Ue&&typeof Ue.onPostCommitFiberRoot==`function`)try{Ue.onPostCommitFiberRoot(He,a)}catch{}return!0}finally{E.p=i,T.T=r,Vu(e,t)}}function Wu(e,t,n){t=Ti(n,t),t=tc(e.stateNode,t,2),e=Ya(e,t,2),e!==null&&(it(e,2),rd(e))}function Z(e,t,n){if(e.tag===3)Wu(e,e,n);else for(;t!==null;){if(t.tag===3){Wu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==`function`||typeof r.componentDidCatch==`function`&&(ru===null||!ru.has(r))){e=Ti(n,e),n=nc(2),r=Ya(t,n,2),r!==null&&(rc(n,r,t,e),it(r,2),rd(r));break}}t=t.return}}function Gu(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new zl;var i=new Set;r.set(t,i)}else i=r.get(t),i===void 0&&(i=new Set,r.set(t,i));i.has(n)||(Ul=!0,i.add(n),e=Ku.bind(null,e,t,n),t.then(e,e))}function Ku(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,K===e&&(J&n)===n&&(X===4||X===3&&(J&62914560)===J&&300>A()-$l?!(G&2)&&Su(e,0):ql|=n,Yl===J&&(Yl=0)),rd(e)}function qu(e,t){t===0&&(t=nt()),e=ui(e,t),e!==null&&(it(e,t),rd(e))}function Ju(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),qu(e,n)}function Yu(e,t){var n=0;switch(e.tag){case 31:case 13:var r=e.stateNode,i=e.memoizedState;i!==null&&(n=i.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}r!==null&&r.delete(t),qu(e,n)}function Xu(e,t){return Ae(e,t)}var Zu=null,Qu=null,$u=!1,ed=!1,td=!1,nd=0;function rd(e){e!==Qu&&e.next===null&&(Qu===null?Zu=Qu=e:Qu=Qu.next=e),ed=!0,$u||($u=!0,ud())}function id(e,t){if(!td&&ed){td=!0;do for(var n=!1,r=Zu;r!==null;){if(!t)if(e!==0){var i=r.pendingLanes;if(i===0)var a=0;else{var o=r.suspendedLanes,s=r.pingedLanes;a=(1<<31-Ge(42|e)+1)-1,a&=i&~(o&~s),a=a&201326741?a&201326741|1:a?a|2:0}a!==0&&(n=!0,ld(r,a))}else a=J,a=$e(r,r===K?a:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),!(a&3)||et(r,a)||(n=!0,ld(r,a));r=r.next}while(n);td=!1}}function ad(){od()}function od(){ed=$u=!1;var e=0;nd!==0&&Gd()&&(e=nd);for(var t=A(),n=null,r=Zu;r!==null;){var i=r.next,a=sd(r,t);a===0?(r.next=null,n===null?Zu=i:n.next=i,i===null&&(Qu=n)):(n=r,(e!==0||a&3)&&(ed=!0)),r=i}iu!==0&&iu!==5||id(e,!1),nd!==0&&(nd=0)}function sd(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,i=e.expirationTimes,a=e.pendingLanes&-62914561;0s)break;var u=c.transferSize,d=c.initiatorType;u&&Id(d)&&(c=c.responseEnd,o+=u*(c`u`?null:document;function xf(e,t,n){var r=bf;if(r&&typeof t==`string`&&t){var i=Gt(t);i=`link[rel="`+e+`"][href="`+i+`"]`,typeof n==`string`&&(i+=`[crossorigin="`+n+`"]`),hf.has(i)||(hf.add(i),e={rel:e,crossOrigin:n,href:t},r.querySelector(i)===null&&(t=r.createElement(`link`),Pd(t,`link`,e),j(t),r.head.appendChild(t)))}}function Sf(e){_f.D(e),xf(`dns-prefetch`,e,null)}function Cf(e,t){_f.C(e,t),xf(`preconnect`,e,t)}function wf(e,t,n){_f.L(e,t,n);var r=bf;if(r&&e&&t){var i=`link[rel="preload"][as="`+Gt(t)+`"]`;t===`image`&&n&&n.imageSrcSet?(i+=`[imagesrcset="`+Gt(n.imageSrcSet)+`"]`,typeof n.imageSizes==`string`&&(i+=`[imagesizes="`+Gt(n.imageSizes)+`"]`)):i+=`[href="`+Gt(e)+`"]`;var a=i;switch(t){case`style`:a=Af(e);break;case`script`:a=Pf(e)}mf.has(a)||(e=h({rel:`preload`,href:t===`image`&&n&&n.imageSrcSet?void 0:e,as:t},n),mf.set(a,e),r.querySelector(i)!==null||t===`style`&&r.querySelector(jf(a))||t===`script`&&r.querySelector(Ff(a))||(t=r.createElement(`link`),Pd(t,`link`,e),j(t),r.head.appendChild(t)))}}function Tf(e,t){_f.m(e,t);var n=bf;if(n&&e){var r=t&&typeof t.as==`string`?t.as:`script`,i=`link[rel="modulepreload"][as="`+Gt(r)+`"][href="`+Gt(e)+`"]`,a=i;switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:a=Pf(e)}if(!mf.has(a)&&(e=h({rel:`modulepreload`,href:e},t),mf.set(a,e),n.querySelector(i)===null)){switch(r){case`audioworklet`:case`paintworklet`:case`serviceworker`:case`sharedworker`:case`worker`:case`script`:if(n.querySelector(Ff(a)))return}r=n.createElement(`link`),Pd(r,`link`,e),j(r),n.head.appendChild(r)}}}function Ef(e,t,n){_f.S(e,t,n);var r=bf;if(r&&e){var i=Et(r).hoistableStyles,a=Af(e);t||=`default`;var o=i.get(a);if(!o){var s={loading:0,preload:null};if(o=r.querySelector(jf(a)))s.loading=5;else{e=h({rel:`stylesheet`,href:e,"data-precedence":t},n),(n=mf.get(a))&&Rf(e,n);var c=o=r.createElement(`link`);j(c),Pd(c,`link`,e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener(`load`,function(){s.loading|=1}),c.addEventListener(`error`,function(){s.loading|=2}),s.loading|=4,Lf(o,t,r)}o={type:`stylesheet`,instance:o,count:1,state:s},i.set(a,o)}}}function Df(e,t){_f.X(e,t);var n=bf;if(n&&e){var r=Et(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),j(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function Of(e,t){_f.M(e,t);var n=bf;if(n&&e){var r=Et(n).hoistableScripts,i=Pf(e),a=r.get(i);a||(a=n.querySelector(Ff(i)),a||(e=h({src:e,async:!0,type:`module`},t),(t=mf.get(i))&&zf(e,t),a=n.createElement(`script`),j(a),Pd(a,`link`,e),n.head.appendChild(a)),a={type:`script`,instance:a,count:1,state:null},r.set(i,a))}}function kf(e,t,n,r){var i=(i=ge.current)?gf(i):null;if(!i)throw Error(s(446));switch(e){case`meta`:case`title`:return null;case`style`:return typeof n.precedence==`string`&&typeof n.href==`string`?(t=Af(n.href),n=Et(i).hoistableStyles,r=n.get(t),r||(r={type:`style`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};case`link`:if(n.rel===`stylesheet`&&typeof n.href==`string`&&typeof n.precedence==`string`){e=Af(n.href);var a=Et(i).hoistableStyles,o=a.get(e);if(o||(i=i.ownerDocument||i,o={type:`stylesheet`,instance:null,count:0,state:{loading:0,preload:null}},a.set(e,o),(a=i.querySelector(jf(e)))&&!a._p&&(o.instance=a,o.state.loading=5),mf.has(e)||(n={rel:`preload`,as:`style`,href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},mf.set(e,n),a||Nf(i,e,n,o.state))),t&&r===null)throw Error(s(528,``));return o}if(t&&r!==null)throw Error(s(529,``));return null;case`script`:return t=n.async,n=n.src,typeof n==`string`&&t&&typeof t!=`function`&&typeof t!=`symbol`?(t=Pf(n),n=Et(i).hoistableScripts,r=n.get(t),r||(r={type:`script`,instance:null,count:0,state:null},n.set(t,r)),r):{type:`void`,instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Af(e){return`href="`+Gt(e)+`"`}function jf(e){return`link[rel="stylesheet"][`+e+`]`}function Mf(e){return h({},e,{"data-precedence":e.precedence,precedence:null})}function Nf(e,t,n,r){e.querySelector(`link[rel="preload"][as="style"][`+t+`]`)?r.loading=1:(t=e.createElement(`link`),r.preload=t,t.addEventListener(`load`,function(){return r.loading|=1}),t.addEventListener(`error`,function(){return r.loading|=2}),Pd(t,`link`,n),j(t),e.head.appendChild(t))}function Pf(e){return`[src="`+Gt(e)+`"]`}function Ff(e){return`script[async]`+e}function If(e,t,n){if(t.count++,t.instance===null)switch(t.type){case`style`:var r=e.querySelector(`style[data-href~="`+Gt(n.href)+`"]`);if(r)return t.instance=r,j(r),r;var i=h({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement(`style`),j(r),Pd(r,`style`,i),Lf(r,n.precedence,e),t.instance=r;case`stylesheet`:i=Af(n.href);var a=e.querySelector(jf(i));if(a)return t.state.loading|=4,t.instance=a,j(a),a;r=Mf(n),(i=mf.get(i))&&Rf(r,i),a=(e.ownerDocument||e).createElement(`link`),j(a);var o=a;return o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),t.state.loading|=4,Lf(a,n.precedence,e),t.instance=a;case`script`:return a=Pf(n.src),(i=e.querySelector(Ff(a)))?(t.instance=i,j(i),i):(r=n,(i=mf.get(a))&&(r=h({},n),zf(r,i)),e=e.ownerDocument||e,i=e.createElement(`script`),j(i),Pd(i,`link`,r),e.head.appendChild(i),t.instance=i);case`void`:return null;default:throw Error(s(443,t.type))}else t.type===`stylesheet`&&!(t.state.loading&4)&&(r=t.instance,t.state.loading|=4,Lf(r,n.precedence,e));return t.instance}function Lf(e,t,n){for(var r=n.querySelectorAll(`link[rel="stylesheet"][data-precedence],style[data-precedence]`),i=r.length?r[r.length-1]:null,a=i,o=0;o title`):null)}function Uf(e,t,n){if(n===1||t.itemProp!=null)return!1;switch(e){case`meta`:case`title`:return!0;case`style`:if(typeof t.precedence!=`string`||typeof t.href!=`string`||t.href===``)break;return!0;case`link`:if(typeof t.rel!=`string`||typeof t.href!=`string`||t.href===``||t.onLoad||t.onError)break;switch(t.rel){case`stylesheet`:return e=t.disabled,typeof t.precedence==`string`&&e==null;default:return!0}case`script`:if(t.async&&typeof t.async!=`function`&&typeof t.async!=`symbol`&&!t.onLoad&&!t.onError&&t.src&&typeof t.src==`string`)return!0}return!1}function Wf(e){return!(e.type===`stylesheet`&&!(e.state.loading&3))}function Gf(e,t,n,r){if(n.type===`stylesheet`&&(typeof r.media!=`string`||!1!==matchMedia(r.media).matches)&&!(n.state.loading&4)){if(n.instance===null){var i=Af(r.href),a=t.querySelector(jf(i));if(a){t=a._p,typeof t==`object`&&t&&typeof t.then==`function`&&(e.count++,e=Jf.bind(e),t.then(e,e)),n.state.loading|=4,n.instance=a,j(a);return}a=t.ownerDocument||t,r=Mf(r),(i=mf.get(i))&&Rf(r,i),a=a.createElement(`link`),j(a);var o=a;o._p=new Promise(function(e,t){o.onload=e,o.onerror=t}),Pd(a,`link`,r),n.instance=a}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(n,t),(t=n.state.preload)&&!(n.state.loading&3)&&(e.count++,n=Jf.bind(e),t.addEventListener(`load`,n),t.addEventListener(`error`,n))}}var Kf=0;function qf(e,t){return e.stylesheets&&e.count===0&&Xf(e,e.stylesheets),0Kf?50:800)+t);return e.unsuspend=n,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(i)}}:null}function Jf(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Xf(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var Yf=null;function Xf(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,Yf=new Map,t.forEach(Zf,e),Yf=null,Jf.call(e))}function Zf(e,t){if(!(t.state.loading&4)){var n=Yf.get(e);if(n)var r=n.get(null);else{n=new Map,Yf.set(e,n);for(var i=e.querySelectorAll(`link[data-precedence],style[data-precedence]`),a=0;a{function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>`u`||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=`function`))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(e){console.error(e)}}n(),t.exports=s()})),l=i(),u=c(),d=`/calendario-impuestos/assets/glm-logo-BESrJPJ4.png`,f=`https://dbit.digitalcompass.agency`.replace(/\/+$/,``),p=`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE`,m=`https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-bamboohr-contacto`,h=`https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-google-calendar`;async function g(e){return(await C(e,`/rest/v1/rpc/tax_obligation_delivery_status`,{method:`POST`,body:`{}`})).map(e=>({obligationId:e.obligation_id,hasSentNotification:e.has_sent_notification,firstSentAt:e.first_sent_at,sentNotificationCount:Number(e.sent_notification_count??0)}))}async function _(e){let t=await ne(e),n=new Map(t.map(e=>[e.id,e])),[r,i,a]=await Promise.all([C(e,`/rest/v1/tax_obligations?select=id,due_date,description,country_id,category,source&active=eq.true&order=due_date.asc,description.asc`),C(e,`/rest/v1/tax_contacts?select=id,country_id,full_name,email,job_title,area,department,division,location,source,bamboo_employee_id,bamboo_employee_number,bamboo_status,email_enabled,google_chat_enabled,calendar_enabled&active=eq.true&order=full_name.asc`),g(e)]),o=new Map(a.map(e=>[e.obligationId,e]));return{countries:t,events:r.map(e=>{let t=n.get(e.country_id);if(!t)throw Error(`Una obligación tiene un país inválido.`);let r=o.get(e.id);return{id:e.id,date:e.due_date,text:e.description,countryId:e.country_id,country:t.name,countryCode:t.code,category:e.category,source:e.source,hasSentNotification:r?.hasSentNotification??!1,firstSentAt:r?.firstSentAt??null,sentNotificationCount:r?.sentNotificationCount??0}}),contacts:i.map(e=>re(e,n))}}async function v(e,t){ie(t.date);let[n]=await C(e,`/rest/v1/tax_obligations`,{method:`POST`,headers:{Prefer:`return=representation`},body:JSON.stringify({due_date:t.date,description:t.text.trim(),country_id:t.countryId,category:t.category,source:`app`,is_historical:!1})}),r=(await ne(e)).find(e=>e.id===n.country_id);if(!r)throw Error(`No se encontró el país de la obligación.`);return oe(`obligation.created`,{obligation_id:n.id,due_date:n.due_date}),{id:n.id,date:n.due_date,text:n.description,countryId:n.country_id,country:r.name,countryCode:r.code,category:n.category,source:n.source,hasSentNotification:!1,firstSentAt:null,sentNotificationCount:0}}async function y(e,t,n){ie(n.date);let[r]=await C(e,`/rest/v1/tax_obligations?id=eq.${encodeURIComponent(t)}`,{method:`PATCH`,headers:{Prefer:`return=representation`},body:JSON.stringify({due_date:n.date,description:n.text.trim(),country_id:n.countryId,category:n.category})});if(!r)throw Error(`No se encontró la obligación.`);let i=(await ne(e)).find(e=>e.id===r.country_id);if(!i)throw Error(`No se encontró el país de la obligación.`);return oe(`obligation.updated`,{obligation_id:r.id,due_date:r.due_date}),{id:r.id,date:r.due_date,text:r.description,countryId:r.country_id,country:i.name,countryCode:i.code,category:r.category,source:r.source,hasSentNotification:!1,firstSentAt:null,sentNotificationCount:0}}async function b(e,t){await C(e,`/rest/v1/tax_obligations?id=eq.${encodeURIComponent(t)}`,{method:`PATCH`,headers:{Prefer:`return=minimal`},body:JSON.stringify({active:!1})}),oe(`obligation.deleted`,{obligation_id:t})}async function x(e,t){let[n]=await C(e,`/rest/v1/tax_contacts`,{method:`POST`,headers:{Prefer:`return=representation`},body:JSON.stringify(w(t))}),r=await ne(e);return re(n,new Map(r.map(e=>[e.id,e])))}async function ee(e,t,n){let[r]=await C(e,`/rest/v1/tax_contacts?id=eq.${encodeURIComponent(t)}`,{method:`PATCH`,headers:{Prefer:`return=representation`},body:JSON.stringify(w(n))});if(!r)throw Error(`No se encontró el contacto.`);let i=await ne(e);return re(r,new Map(i.map(e=>[e.id,e])))}async function te(e,t){await C(e,`/rest/v1/tax_contacts?id=eq.${encodeURIComponent(t)}`,{method:`PATCH`,headers:{Prefer:`return=minimal`},body:JSON.stringify({active:!1})})}async function S(e,t){if(!m)throw Error(`Falta configurar el webhook de BambooHR.`);let n=new AbortController,r=window.setTimeout(()=>n.abort(),3e5);try{let r=await fetch(m,{method:`POST`,headers:{"Content-Type":`text/plain;charset=UTF-8`},body:JSON.stringify({action:`search_contact`,full_name:t.trim(),requested_by:e.user.email,source:`seguimiento-impuestos-glm`}),signal:n.signal});if(!r.ok)throw Error(`No pudimos consultar BambooHR.`);let i=await r.json();if(i.ok===!1)throw Error(i.message||`No pudimos consultar BambooHR.`);return Array.isArray(i.candidates)?i.candidates:[]}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?Error(`La búsqueda tardó demasiado. Inténtalo nuevamente.`):e}finally{window.clearTimeout(r)}}async function ne(e){return(await C(e,`/rest/v1/tax_countries?select=id,code,name,is_regional,sort_order&active=eq.true&order=sort_order.asc,name.asc`)).map(e=>({id:e.id,code:e.code,name:e.name,isRegional:e.is_regional,sortOrder:e.sort_order}))}async function C(e,t,n={}){let r=new Headers(n.headers);r.set(`apikey`,p),r.set(`Authorization`,`Bearer ${e.accessToken}`),r.set(`Content-Type`,`application/json`);let i=await fetch(`${f}${t}`,{...n,headers:r});if(!i.ok)throw Error(await ae(i));if(i.status===204)return;let a=await i.text();return a?JSON.parse(a):void 0}function re(e,t){let n=t.get(e.country_id);if(!n)throw Error(`Un contacto tiene un país inválido.`);return{id:e.id,countryId:e.country_id,country:n.name,countryCode:n.code,name:e.full_name,email:e.email??``,role:e.job_title??``,area:e.area,department:e.department??``,division:e.division??``,location:e.location??``,source:e.source??`manual`,bambooEmployeeId:e.bamboo_employee_id??``,bambooEmployeeNumber:e.bamboo_employee_number??``,bambooStatus:e.bamboo_status??``,emailEnabled:e.email_enabled,googleChatEnabled:e.google_chat_enabled,calendarEnabled:e.calendar_enabled}}function w(e){return{country_id:e.countryId,full_name:e.name.trim(),email:e.email.trim()||null,job_title:e.role.trim()||null,area:e.area,department:e.department?.trim()||null,division:e.division?.trim()||null,location:e.location?.trim()||null,source:e.source||`manual`,bamboo_employee_id:e.bambooEmployeeId?.trim()||null,bamboo_employee_number:e.bambooEmployeeNumber?.trim()||null,bamboo_status:e.bambooStatus?.trim()||null,email_enabled:e.emailEnabled,google_chat_enabled:e.googleChatEnabled,calendar_enabled:e.calendarEnabled}}function ie(e){let t=String(e??``).trim(),n=/^(\d{4})-(\d{2})-(\d{2})$/.exec(t);if(!n)throw Error(`Selecciona una fecha válida.`);let r=Number(n[1]),i=Number(n[2]),a=Number(n[3]),o=new Date(Date.UTC(r,i-1,a));if(o.getUTCFullYear()!==r||o.getUTCMonth()!==i-1||o.getUTCDate()!==a)throw Error(`Selecciona una fecha válida.`);let s=new Intl.DateTimeFormat(`en-US`,{timeZone:`America/Santo_Domingo`,year:`numeric`,month:`2-digit`,day:`2-digit`}).formatToParts(new Date),c=Object.fromEntries(s.map(e=>[e.type,e.value]));if(t<`${c.year}-${c.month}-${c.day}`)throw Error(`No puedes crear ni mover una obligación a una fecha que ya pasó.`)}async function ae(e){try{let t=await e.json();return t.message??t.details??`No se pudo guardar el cambio.`}catch{return`No se pudo guardar el cambio.`}}async function oe(e,t){await se(h,e,t)}async function se(e,t,n){if(e)try{await fetch(e,{method:`POST`,headers:{"Content-Type":`text/plain;charset=UTF-8`},body:JSON.stringify({action:t,payload:n,source:`frontend`}),keepalive:!0})}catch{}}function ce(e){let[t,n,r]=e.split(`-`).map(Number),i=new Date(Date.UTC(t,n-1,r)),a=(i.getUTCDay()-3+7)%7,o=a===0?7:a,s=new Date(i);return s.setUTCDate(i.getUTCDate()-o),[le(s),e].filter((e,t,n)=>n.indexOf(e)===t)}function le(e){return`${e.getUTCFullYear()}-${String(e.getUTCMonth()+1).padStart(2,`0`)}-${String(e.getUTCDate()).padStart(2,`0`)}`}var ue=[`Enero`,`Febrero`,`Marzo`,`Abril`,`Mayo`,`Junio`,`Julio`,`Agosto`,`Septiembre`,`Octubre`,`Noviembre`,`Diciembre`],T=[`Lun`,`Mar`,`Mié`,`Jue`,`Vie`,`Sáb`,`Dom`];function E(e){let[t,n,r]=e.split(`-`).map(Number);return`${r} ${ue[n-1]} ${t}`}function de(e){return e.normalize(`NFD`).replace(/[\u0300-\u036f]/g,``).toLowerCase().trim()}var fe=e((e=>{var t=Symbol.for(`react.transitional.element`);function n(e,n,r){var i=null;if(r!==void 0&&(i=``+r),n.key!==void 0&&(i=``+n.key),`key`in n)for(var a in r={},n)a!==`key`&&(r[a]=n[a]);else r=n;return n=r.ref,{$$typeof:t,type:e,key:i,ref:n===void 0?null:n,props:r}}e.jsx=n,e.jsxs=n})),D=e(((e,t)=>{t.exports=fe()}))();function pe({session:e,onSignOut:t}){let[n,r]=(0,l.useState)([]),[i,a]=(0,l.useState)([]),[o,s]=(0,l.useState)([]),[c,u]=(0,l.useState)(!0),[d,f]=(0,l.useState)(!1),[p,m]=(0,l.useState)(null),[h,ne]=(0,l.useState)(`calendar`),C=new Date,[re,w]=(0,l.useState)(C.getFullYear()),[ie,ae]=(0,l.useState)(C.getMonth()),[oe,se]=(0,l.useState)(!1),[ce,le]=(0,l.useState)(null),[ue,T]=(0,l.useState)(null),[E,de]=(0,l.useState)(!1),[fe,pe]=(0,l.useState)(null);(0,l.useEffect)(()=>{let t=!1;return(async()=>{try{let n=await _(e);if(t)return;s(n.countries),r(n.events),a(n.contacts)}catch{t||m({type:`error`,message:`No pudimos cargar la información.`})}finally{t||u(!1)}})(),()=>{t=!0}},[e]),(0,l.useEffect)(()=>{let t=!1,n=async()=>{try{let n=await g(e);if(t)return;let i=new Map(n.map(e=>[e.obligationId,e])),a=e=>{let t=i.get(e.id);return t?{...e,hasSentNotification:t.hasSentNotification,firstSentAt:t.firstSentAt,sentNotificationCount:t.sentNotificationCount}:e};r(e=>e.map(a)),T(e=>e?a(e):null)}catch{}},i=window.setInterval(()=>void n(),6e4),a=()=>void n();return window.addEventListener(`focus`,a),()=>{t=!0,window.clearInterval(i),window.removeEventListener(`focus`,a)}},[e]),(0,l.useEffect)(()=>{if(!p)return;let e=window.setTimeout(()=>m(null),3800);return()=>window.clearTimeout(e)},[p]);let me=(0,l.useMemo)(()=>{let e={};for(let t of n)(e[t.date]||=[]).push(t);return e},[n]),he=(0,l.useMemo)(()=>n.filter(e=>{let[t,n]=e.date.split(`-`).map(Number);return t===re&&n-1===ie}).sort((e,t)=>e.date.localeCompare(t.date)||e.text.localeCompare(t.text)),[n,ie,re]),ge=()=>{ie===0?(ae(11),w(e=>e-1)):ae(e=>e-1)},ve=()=>{ie===11?(ae(0),w(e=>e+1)):ae(e=>e+1)},ye=async t=>{f(!0);try{let n=await v(e,t);r(e=>[...e,n]),se(!1),m({type:`success`,message:`Obligación guardada.`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:`No pudimos guardar la obligación.`})}finally{f(!1)}},be=async(t,n)=>{f(!0);try{let i=await y(e,t,n);r(e=>e.map(e=>e.id===t?i:e)),T(null),m({type:`success`,message:`Obligación actualizada.`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:`No pudimos actualizar la obligación.`})}finally{f(!1)}},Se=async t=>{if(window.confirm(`¿Eliminar esta obligación?`)){f(!0);try{await b(e,t),r(e=>e.filter(e=>e.id!==t)),T(null),m({type:`success`,message:`Obligación eliminada.`})}catch{m({type:`error`,message:`No pudimos eliminar la obligación.`})}finally{f(!1)}}},Ce=async t=>{f(!0);try{let n=await x(e,t);a(e=>[...e,n]),de(!1),m({type:`success`,message:`Contacto guardado.`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:`No pudimos guardar el contacto.`})}finally{f(!1)}},we=async(t,n)=>{f(!0);try{let r=await ee(e,t,n);a(e=>e.map(e=>e.id===t?r:e)),pe(null),m({type:`success`,message:`Contacto actualizado.`})}catch(e){m({type:`error`,message:e instanceof Error?e.message:`No pudimos actualizar el contacto.`})}finally{f(!1)}},De=async t=>S(e,t),Ae=async t=>{if(window.confirm(`¿Eliminar este contacto?`)){f(!0);try{await te(e,t),a(e=>e.filter(e=>e.id!==t)),pe(null),m({type:`success`,message:`Contacto eliminado.`})}catch{m({type:`error`,message:`No pudimos eliminar el contacto.`})}finally{f(!1)}}};return(0,D.jsxs)(`div`,{className:`flex h-dvh min-h-0 flex-col overflow-hidden bg-background`,children:[(0,D.jsx)(O,{onAdd:()=>{le(null),se(!0)},view:h,setView:ne,onSignOut:t}),(0,D.jsx)(`main`,{className:`app-scrollbar-hidden mx-auto min-h-0 w-full max-w-7xl flex-1 overflow-y-auto px-4 py-6 sm:px-6 lg:px-8`,children:c?(0,D.jsx)(ze,{}):h===`calendar`?(0,D.jsx)(k,{year:re,month:ie,eventsByDay:me,onPrev:ge,onNext:ve,onToday:()=>{w(C.getFullYear()),ae(C.getMonth())},onDayClick:e=>{if(ede(!0),onOpen:pe,onDelete:Ae})}),oe&&(0,D.jsx)(Te,{countries:o.filter(e=>!e.isRegional),defaultDate:ce??He(),busy:d,onClose:()=>se(!1),onSave:ye}),ue&&(0,D.jsx)(Ee,{event:ue,countries:o.filter(e=>!e.isRegional),busy:d,onClose:()=>T(null),onSave:e=>be(ue.id,e),onDelete:()=>Se(ue.id)}),E&&(0,D.jsx)(Oe,{countries:o,busy:d,onClose:()=>de(!1),onSearch:De,onSave:Ce}),fe&&(0,D.jsx)(ke,{contact:fe,countries:o,busy:d,onClose:()=>pe(null),onSave:e=>we(fe.id,e),onDelete:()=>Ae(fe.id)}),p&&(0,D.jsx)(Re,{toast:p})]})}function O({onAdd:e,onSignOut:t,view:n,setView:r}){let i=[{id:`calendar`,label:`Calendario`},{id:`list`,label:`Lista`},{id:`contacts`,label:`Contactos`}];return(0,D.jsxs)(`header`,{className:`sticky top-0 z-20 border-b border-border bg-card/90 backdrop-blur`,children:[(0,D.jsxs)(`div`,{className:`mx-auto flex max-w-7xl items-center gap-4 px-4 py-3 sm:px-6 lg:px-8`,children:[(0,D.jsx)(`img`,{src:d,alt:`GomezLee Marketing`,className:`h-8 w-auto shrink-0 object-contain sm:h-9`}),(0,D.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,D.jsx)(`h1`,{className:`truncate text-base font-semibold leading-tight text-glm-blue sm:text-lg`,children:`Seguimiento de Impuestos GLM`}),(0,D.jsx)(`p`,{className:`hidden text-xs text-muted-foreground sm:block`,children:`Calendario tributario regional · GomezLee Marketing`})]}),(0,D.jsx)(`nav`,{className:`hidden gap-1 rounded-lg bg-muted p-1 md:flex`,children:i.map(e=>(0,D.jsx)(`button`,{onClick:()=>r(e.id),className:`rounded-md px-3 py-1.5 text-sm font-medium transition-colors `+(n===e.id?`bg-card text-glm-blue shadow-sm`:`text-muted-foreground hover:text-foreground`),children:e.label},e.id))}),(0,D.jsxs)(`button`,{onClick:e,className:`inline-flex items-center gap-1.5 rounded-lg bg-glm-green px-3 py-2 text-sm font-medium text-white shadow-sm transition-transform hover:-translate-y-px hover:bg-glm-green/90`,children:[(0,D.jsx)(Ke,{}),(0,D.jsx)(`span`,{className:`hidden sm:inline`,children:`Añadir`})]}),(0,D.jsxs)(`button`,{type:`button`,onClick:t,"aria-label":`Cerrar sesión`,title:`Cerrar sesión`,className:`inline-flex items-center gap-1.5 rounded-lg border border-destructive/30 bg-destructive/5 px-3 py-2 text-sm font-semibold text-destructive shadow-sm transition hover:-translate-y-px hover:border-destructive hover:bg-destructive hover:text-white`,children:[(0,D.jsx)(qe,{}),(0,D.jsx)(`span`,{className:`hidden lg:inline`,children:`Cerrar sesión`})]})]}),(0,D.jsx)(`nav`,{className:`mx-auto flex max-w-7xl gap-1 border-t border-border px-4 py-2 md:hidden`,children:i.map(e=>(0,D.jsx)(`button`,{onClick:()=>r(e.id),className:`flex-1 rounded-md px-2 py-1.5 text-sm font-medium transition-colors `+(n===e.id?`bg-glm-blue-soft text-glm-blue`:`text-muted-foreground`),children:e.label},e.id))})]})}function k({year:e,month:t,eventsByDay:n,onPrev:r,onNext:i,onToday:a,onDayClick:o,onEventOpen:s}){let c=Ge(e,t),u=He(),[d,f]=(0,l.useState)(null);return(0,D.jsxs)(`div`,{children:[(0,D.jsx)(he,{year:e,month:t,onPrev:r,onNext:i,onToday:a}),(0,D.jsxs)(`div`,{className:`overflow-hidden rounded-2xl border border-border bg-card shadow-sm`,children:[(0,D.jsx)(`div`,{className:`grid grid-cols-7 border-b border-border bg-muted/60 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:T.map(e=>(0,D.jsx)(`div`,{className:`px-2 py-2 text-center`,children:e},e))}),(0,D.jsx)(`div`,{className:`grid grid-cols-7`,children:c.map((e,r)=>{let i=e.month===t,a=n[e.iso]??[],c=e.iso===u,l=e.dow===2;return(0,D.jsxs)(`div`,{onClick:()=>o(e.iso),className:`group relative min-h-[110px] cursor-pointer border-b border-r border-border p-2 transition-colors `+(i?`bg-card`:`bg-muted/30`)+(l&&i?` bg-glm-blue-soft/40`:``)+` hover:bg-glm-blue-soft/60`,children:[(0,D.jsxs)(`div`,{className:`mb-1 flex items-center justify-between`,children:[(0,D.jsx)(`span`,{className:`inline-flex h-6 min-w-6 items-center justify-center rounded-full px-1.5 text-xs font-semibold `+(c?`bg-glm-green text-white`:i?`text-foreground`:`text-muted-foreground/60`),children:e.day}),l&&i&&(0,D.jsx)(`span`,{className:`text-[9px] font-semibold uppercase tracking-wider text-glm-blue`,children:`Mié`})]}),(0,D.jsxs)(`div`,{className:`space-y-1`,children:[a.slice(0,3).map(e=>(0,D.jsx)(ye,{event:e,onOpen:s},e.id)),a.length>3&&(0,D.jsxs)(`button`,{type:`button`,onClick:t=>{t.stopPropagation(),f({iso:e.iso,events:a})},className:`inline-flex items-center gap-1 rounded-md px-1.5 py-0.5 text-[10px] font-semibold text-glm-blue transition hover:bg-glm-blue-soft hover:underline`,"aria-label":`Ver ${a.length-3} obligaciones adicionales del ${E(e.iso)}`,children:[`+`,a.length-3,` más · Ver todos`]})]})]},r)})})]}),(0,D.jsx)(ge,{}),d&&(0,D.jsx)(me,{date:d.iso,events:d.events,onClose:()=>f(null),onEventOpen:e=>{f(null),s(e)}})]})}function me({date:e,events:t,onClose:n,onEventOpen:r}){let i=[...t].sort((e,t)=>e.category.localeCompare(t.category)||e.text.localeCompare(t.text));return(0,D.jsxs)(Pe,{onClose:n,title:`Obligaciones · ${E(e)}`,children:[(0,D.jsx)(`p`,{className:`mb-4 text-sm text-muted-foreground`,children:`Selecciona una obligación para consultar su información completa.`}),(0,D.jsx)(`div`,{className:`space-y-2`,children:i.map(e=>(0,D.jsxs)(`button`,{type:`button`,onClick:()=>r(e),className:`flex w-full items-start gap-3 rounded-xl border border-border bg-card p-3 text-left transition hover:border-glm-blue/35 hover:bg-glm-blue-soft/25`,children:[(0,D.jsx)(`span`,{className:`mt-1 h-2.5 w-2.5 shrink-0 rounded-full `+(e.category===`nomina`?`bg-glm-orange`:`bg-glm-blue`)}),(0,D.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,D.jsxs)(`span`,{className:`mb-1 flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(be,{category:e.category}),(0,D.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground`,children:e.country}),e.hasSentNotification&&(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full bg-glm-green/15 px-2 py-0.5 text-[11px] font-semibold text-glm-green`,children:[(0,D.jsx)($e,{size:11}),` Solo lectura`]})]}),(0,D.jsx)(`span`,{className:`block text-sm font-medium leading-snug text-foreground`,children:e.text})]}),(0,D.jsx)(Je,{dir:`right`})]},e.id))})]})}function he({year:e,month:t,onPrev:n,onNext:r,onToday:i}){return(0,D.jsxs)(`div`,{className:`mb-4 flex flex-wrap items-center justify-between gap-3`,children:[(0,D.jsxs)(`h2`,{className:`text-2xl font-semibold tracking-tight text-glm-blue`,children:[ue[t],` `,(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:e})]}),(0,D.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,D.jsx)(`button`,{onClick:i,className:`rounded-md border border-border bg-card px-3 py-1.5 text-sm font-medium text-glm-blue hover:bg-glm-blue-soft`,children:`Hoy`}),(0,D.jsxs)(`div`,{className:`flex overflow-hidden rounded-md border border-border`,children:[(0,D.jsx)(`button`,{onClick:n,"aria-label":`Mes anterior`,className:`border-r border-border bg-card p-2 hover:bg-muted`,children:(0,D.jsx)(Je,{dir:`left`})}),(0,D.jsx)(`button`,{onClick:r,"aria-label":`Mes siguiente`,className:`bg-card p-2 hover:bg-muted`,children:(0,D.jsx)(Je,{dir:`right`})})]})]})]})}function ge(){return(0,D.jsxs)(`div`,{className:`mt-4 flex flex-wrap items-center gap-4 text-xs text-muted-foreground`,children:[(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,D.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-full bg-glm-orange`}),` Nómina`]}),(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,D.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-full bg-glm-blue`}),` Administración`]}),(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,D.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-full bg-glm-green`}),` Hoy`]}),(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1.5`,children:[(0,D.jsx)(`span`,{className:`h-2.5 w-2.5 rounded-sm bg-glm-blue-soft`}),` Miércoles de alerta`]})]})}function _e({events:e,year:t,month:n,onPrev:r,onNext:i,onEventOpen:a}){let[o,s]=(0,l.useState)(`all`),[c,u]=(0,l.useState)(``),d=de(c),f=e.filter(e=>{let t=o===`all`||e.category===o,n=!d||de(`${e.text} ${e.country}`).includes(d);return t&&n});return(0,D.jsxs)(`div`,{children:[(0,D.jsx)(he,{year:t,month:n,onPrev:r,onNext:i,onToday:()=>void 0}),(0,D.jsxs)(`div`,{className:`mb-4 grid gap-3 lg:grid-cols-[minmax(0,1fr)_auto] lg:items-center`,children:[(0,D.jsx)(we,{value:c,onChange:u,placeholder:`Buscar obligación por nombre o país...`}),(0,D.jsx)(`div`,{className:`flex flex-wrap gap-2`,children:[{id:`all`,label:`Todos (${e.length})`},{id:`nomina`,label:`Nómina (${e.filter(e=>e.category===`nomina`).length})`},{id:`admin`,label:`Administración (${e.filter(e=>e.category===`admin`).length})`}].map(e=>(0,D.jsx)(`button`,{onClick:()=>s(e.id),className:`rounded-full border px-3 py-1.5 text-xs font-medium transition-colors `+(o===e.id?`border-glm-blue bg-glm-blue text-white`:`border-border bg-card text-muted-foreground hover:text-foreground`),children:e.label},e.id))})]}),f.length===0?(0,D.jsx)(Be,{message:`No encontramos obligaciones con esos filtros.`}):(0,D.jsx)(`ul`,{className:`space-y-2`,children:f.map(e=>(0,D.jsx)(`li`,{children:(0,D.jsx)(ve,{event:e,onOpen:a})},e.id))})]})}function ve({event:e,onOpen:t}){let n=ce(e.date);return(0,D.jsxs)(`button`,{type:`button`,onClick:()=>t(e),className:`flex w-full flex-col gap-3 rounded-xl border border-border bg-card p-4 text-left shadow-sm transition hover:-translate-y-px hover:border-glm-blue/30 hover:shadow-md sm:flex-row sm:items-center`,children:[(0,D.jsxs)(`div`,{className:`flex min-w-[110px] flex-col items-center rounded-lg bg-glm-blue-soft/50 px-3 py-2`,children:[(0,D.jsx)(`span`,{className:`text-[10px] font-semibold uppercase tracking-wider text-glm-blue`,children:ue[Number(e.date.slice(5,7))-1].slice(0,3)}),(0,D.jsx)(`span`,{className:`text-2xl font-bold leading-none text-glm-blue`,children:Number(e.date.slice(8,10))}),(0,D.jsx)(`span`,{className:`mt-0.5 text-[10px] font-medium text-muted-foreground`,children:We(e.date)})]}),(0,D.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,D.jsxs)(`div`,{className:`mb-1 flex flex-wrap items-center gap-2`,children:[(0,D.jsx)(be,{category:e.category}),(0,D.jsx)(`span`,{className:`rounded-full bg-muted px-2 py-0.5 text-[11px] font-medium text-muted-foreground`,children:e.country}),e.hasSentNotification&&(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full bg-glm-green/15 px-2 py-0.5 text-[11px] font-semibold text-glm-green`,children:[(0,D.jsx)($e,{}),` Aviso enviado · Solo lectura`]})]}),(0,D.jsx)(`p`,{className:`text-sm font-medium text-foreground`,children:e.text}),(0,D.jsxs)(`div`,{className:`mt-2 flex flex-wrap gap-1.5 text-[11px]`,children:[(0,D.jsx)(`span`,{className:`text-muted-foreground`,children:`Alertas:`}),n.map(t=>(0,D.jsx)(`span`,{className:`rounded-md px-1.5 py-0.5 font-medium `+(t===e.date?`bg-glm-orange/15 text-glm-orange`:`bg-glm-green/15 text-glm-green`),children:E(t)},t))]})]}),(0,D.jsx)(`span`,{className:`self-start rounded-md p-2 text-muted-foreground sm:self-center`,"aria-hidden":`true`,children:e.hasSentNotification?(0,D.jsx)($e,{size:18}):(0,D.jsx)(et,{})})]})}function ye({event:e,onOpen:t}){return(0,D.jsxs)(`button`,{type:`button`,onClick:n=>{n.stopPropagation(),t(e)},className:`flex w-full items-center gap-1 truncate rounded-md border px-1.5 py-0.5 text-left text-[10.5px] font-medium leading-tight hover:opacity-80 ${e.category===`nomina`?`bg-glm-orange/15 text-glm-orange border-glm-orange/30`:`bg-glm-blue-soft text-glm-blue border-glm-blue/20`}`,title:`${e.country}: ${e.text}${e.hasSentNotification?` · Aviso enviado`:``}`,children:[e.hasSentNotification&&(0,D.jsx)($e,{size:11}),(0,D.jsx)(`span`,{className:`truncate`,children:e.text})]})}function be({category:e}){let t=e===`nomina`;return(0,D.jsxs)(`span`,{className:`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold uppercase tracking-wide `+(t?`bg-glm-orange/15 text-glm-orange`:`bg-glm-blue-soft text-glm-blue`),children:[(0,D.jsx)(`span`,{className:`h-1.5 w-1.5 rounded-full `+(t?`bg-glm-orange`:`bg-glm-blue`)}),t?`Nómina`:`Administración`]})}function xe({countries:e,contacts:t,onAdd:n,onOpen:r,onDelete:i}){let[a,o]=(0,l.useState)(`all`),[s,c]=(0,l.useState)(``),u=de(s),d=e.filter(e=>a===`all`||e.id===a),f=(0,l.useMemo)(()=>{let n=new Map;for(let t of e)n.set(t.id,[]);for(let e of t)(n.get(e.countryId)??[]).push(e);for(let e of n.values())e.sort((e,t)=>e.name.localeCompare(t.name));return n},[t,e]);return(0,D.jsxs)(`div`,{children:[(0,D.jsxs)(`div`,{className:`mb-5 flex flex-col gap-3 sm:flex-row sm:items-end sm:justify-between`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`h2`,{className:`text-2xl font-semibold tracking-tight text-glm-blue`,children:`Contactos por país`}),(0,D.jsx)(`p`,{className:`mt-1 max-w-3xl text-sm text-muted-foreground`,children:`Busca empleados en BambooHR o agrégalos manualmente. Los datos importados siempre se pueden revisar y modificar antes o después de guardar.`})]}),(0,D.jsxs)(`button`,{type:`button`,onClick:n,className:`inline-flex shrink-0 items-center justify-center gap-1.5 rounded-lg bg-glm-green px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:-translate-y-px hover:bg-glm-green/90`,children:[(0,D.jsx)(Ke,{}),` Agregar contacto`]})]}),(0,D.jsxs)(`div`,{className:`mb-6 grid gap-3 md:grid-cols-2`,children:[(0,D.jsx)(Se,{countries:e,value:a,onChange:o}),(0,D.jsx)(we,{value:s,onChange:c,placeholder:`Buscar contacto por nombre...`})]}),(0,D.jsx)(`div`,{className:`grid gap-4 sm:grid-cols-2 lg:grid-cols-3`,children:d.map(e=>{let t=(f.get(e.id)??[]).filter(e=>!u||de(`${e.name} ${e.email} ${e.role} ${e.department} ${e.location}`).includes(u));return(0,D.jsxs)(`section`,{className:`flex min-h-52 flex-col rounded-xl border border-border bg-card p-4 shadow-sm`,children:[(0,D.jsxs)(`div`,{className:`mb-3 flex items-center justify-between gap-3`,children:[(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsx)(`h3`,{className:`truncate font-semibold text-glm-blue`,children:e.name}),(0,D.jsxs)(`p`,{className:`text-[11px] text-muted-foreground`,children:[t.length,` contacto`,t.length===1?``:`s`]})]}),(0,D.jsx)(`span`,{className:`rounded-md bg-glm-green/15 px-2 py-0.5 text-[11px] font-semibold text-glm-green`,children:e.code})]}),t.length===0?(0,D.jsx)(`div`,{className:`flex flex-1 items-center justify-center rounded-lg border border-dashed border-border bg-muted/30 px-4 py-6 text-center text-xs text-muted-foreground`,children:u?`No hay coincidencias en este país.`:`Todavía no hay contactos registrados.`}):(0,D.jsx)(`ul`,{className:`flex-1 space-y-3`,children:t.map(e=>(0,D.jsxs)(`li`,{className:`group relative border-t border-border pt-3 first:border-0 first:pt-0`,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:()=>r(e),className:`block w-full rounded-lg pr-8 text-left transition hover:bg-muted/45 focus:outline-none focus:ring-2 focus:ring-glm-green/25`,"aria-label":`Ver y editar ${e.name}`,children:[(0,D.jsx)(`p`,{className:`pr-1 text-sm font-medium text-foreground`,children:e.name}),(0,D.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:e.role||Ve(e.area)}),(0,D.jsxs)(`div`,{className:`mt-1 flex flex-wrap gap-1`,children:[(0,D.jsx)(`span`,{className:`rounded bg-muted px-1.5 py-0.5 text-[10px] font-semibold text-muted-foreground`,children:Ve(e.area)}),e.source===`bamboohr`&&(0,D.jsx)(`span`,{className:`rounded bg-glm-blue-soft px-1.5 py-0.5 text-[10px] font-semibold text-glm-blue`,children:`BambooHR`}),e.emailEnabled&&(0,D.jsx)(`span`,{className:`rounded bg-glm-blue-soft px-1.5 py-0.5 text-[10px] font-semibold text-glm-blue`,children:`Correo`}),e.googleChatEnabled&&(0,D.jsx)(`span`,{className:`rounded bg-glm-green/15 px-1.5 py-0.5 text-[10px] font-semibold text-glm-green`,children:`Google Chat`}),e.calendarEnabled&&(0,D.jsx)(`span`,{className:`rounded bg-glm-orange/10 px-1.5 py-0.5 text-[10px] font-semibold text-glm-orange`,children:`Calendar`})]}),e.email&&(0,D.jsx)(`span`,{className:`mt-1 block truncate text-xs text-glm-blue`,children:e.email})]}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>i(e.id),className:`absolute right-0 top-2 rounded p-1 text-muted-foreground opacity-100 transition hover:bg-destructive/10 hover:text-destructive sm:opacity-0 sm:group-hover:opacity-100`,"aria-label":`Eliminar ${e.name}`,children:(0,D.jsx)(Ze,{})})]},e.id))})]},e.id)})})]})}function Se({countries:e,value:t,onChange:n}){let[r,i]=(0,l.useState)(!1),[a,o]=(0,l.useState)(``),s=e.find(e=>e.id===t),c=de(a),u=e.filter(e=>!c||de(e.name).includes(c));return(0,D.jsxs)(`div`,{className:`relative`,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:()=>i(e=>!e),className:`flex w-full items-center justify-between rounded-xl border border-border bg-card px-4 py-3 text-left text-sm shadow-sm transition hover:border-glm-blue/30`,children:[(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`span`,{className:`font-semibold text-glm-blue`,children:`País:`}),` `,(0,D.jsx)(`span`,{className:`text-foreground`,children:s?.name??`Todos`})]}),(0,D.jsx)(Ye,{})]}),r&&(0,D.jsxs)(`div`,{className:`absolute z-30 mt-2 w-full overflow-hidden rounded-xl border border-border bg-card shadow-xl`,children:[(0,D.jsx)(`div`,{className:`border-b border-border p-2`,children:(0,D.jsx)(we,{value:a,onChange:o,placeholder:`Buscar país...`,compact:!0})}),(0,D.jsxs)(`div`,{className:`app-scrollbar-hidden max-h-64 overflow-y-auto p-2`,children:[(0,D.jsx)(Ce,{label:`Todos`,selected:t===`all`,onClick:()=>{n(`all`),i(!1),o(``)}}),u.map(e=>(0,D.jsx)(Ce,{label:e.name,selected:t===e.id,onClick:()=>{n(e.id),i(!1),o(``)}},e.id))]})]})]})}function Ce({label:e,selected:t,onClick:n}){return(0,D.jsxs)(`button`,{type:`button`,onClick:n,className:`flex w-full items-center gap-3 rounded-lg px-3 py-2 text-left text-sm transition `+(t?`bg-glm-green/10 font-semibold text-glm-blue`:`text-foreground hover:bg-muted`),children:[(0,D.jsx)(`span`,{className:`w-4`,children:t?`✓`:``}),e]})}function we({value:e,onChange:t,placeholder:n,compact:r=!1}){return(0,D.jsxs)(`label`,{className:`relative block`,children:[(0,D.jsx)(`span`,{className:`pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground`,children:(0,D.jsx)(Qe,{})}),(0,D.jsx)(`input`,{value:e,onChange:e=>t(e.target.value),placeholder:n,className:`w-full rounded-xl border border-border bg-card pl-10 pr-3 text-sm shadow-sm outline-none transition placeholder:text-muted-foreground/75 focus:border-glm-green focus:ring-2 focus:ring-glm-green/20 ${r?`py-2`:`py-3`}`})]})}function Te({countries:e,defaultDate:t,busy:n,onClose:r,onSave:i}){let[a,o]=(0,l.useState)(t),[s,c]=(0,l.useState)(``),[u,d]=(0,l.useState)(`admin`),[f,p]=(0,l.useState)(``),m=a{e.preventDefault(),!(!s.trim()||!f||m)&&i({date:a,text:s.trim(),category:u,countryId:f})},className:`space-y-4`,children:[(0,D.jsx)(Fe,{label:`Fecha límite`,children:(0,D.jsx)(`input`,{type:`date`,value:a,min:He(),onChange:e=>o(e.target.value),className:A,required:!0})}),m&&(0,D.jsx)(`p`,{className:`rounded-lg border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs font-medium text-destructive`,children:`No puedes crear una obligación en una fecha que ya pasó.`}),(0,D.jsx)(Fe,{label:`Descripción`,children:(0,D.jsx)(`textarea`,{value:s,onChange:e=>c(e.target.value),rows:3,placeholder:`Ej.: ISV, Ret. 12.5 %, Ret. 1 %, ISR`,className:A,required:!0})}),(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,D.jsx)(Fe,{label:`Categoría`,children:(0,D.jsxs)(`select`,{value:u,onChange:e=>d(e.target.value),className:A,children:[(0,D.jsx)(`option`,{value:`nomina`,children:`Nómina`}),(0,D.jsx)(`option`,{value:`admin`,children:`Administración`})]})}),(0,D.jsx)(Fe,{label:`País`,children:(0,D.jsxs)(`select`,{value:f,onChange:e=>p(e.target.value),className:A,required:!0,children:[(0,D.jsx)(`option`,{value:``,disabled:!0,children:`Seleccionar país`}),e.map(e=>(0,D.jsx)(`option`,{value:e.id,children:e.name},e.id))]})})]}),(0,D.jsxs)(`div`,{className:`rounded-lg bg-glm-blue-soft/50 p-3`,children:[(0,D.jsx)(`p`,{className:`mb-1 text-[11px] font-semibold uppercase tracking-wide text-glm-blue`,children:`Se generarán estas alertas`}),(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1.5 text-xs`,children:h.map(e=>(0,D.jsxs)(`span`,{className:`rounded-md px-2 py-0.5 font-medium `+(e===a?`bg-glm-orange/15 text-glm-orange`:`bg-glm-green/20 text-glm-green`),children:[E(e),` · `,We(e)]},e))}),(0,D.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Regla: miércoles anterior y el mismo día, incluidos sábados y domingos.`})]}),(0,D.jsx)(Ie,{busy:n||m,onCancel:r,submitLabel:`Guardar`})]})})}function Ee({event:e,countries:t,busy:n,onClose:r,onSave:i,onDelete:a}){let[o,s]=(0,l.useState)(e.date),[c,u]=(0,l.useState)(e.text),[d,f]=(0,l.useState)(e.category),[p,m]=(0,l.useState)(e.countryId),h=ce(o),g=e.hasSentNotification,_=e.date(0,D.jsxs)(`span`,{className:`rounded-md px-2 py-0.5 font-medium `+(t===e.date?`bg-glm-orange/15 text-glm-orange`:`bg-glm-green/20 text-glm-green`),children:[E(t),` · `,We(t)]},t))})]}),(0,D.jsx)(`div`,{className:`flex justify-end pt-2`,children:(0,D.jsx)(`button`,{type:`button`,onClick:r,className:`rounded-md bg-glm-blue px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-glm-blue/90`,children:`Cerrar`})})]})}):(0,D.jsx)(Pe,{onClose:r,title:`Editar obligación tributaria`,children:(0,D.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),!(!c.trim()||!p||v)&&i({date:o,text:c.trim(),category:d,countryId:p})},className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`flex gap-3 rounded-xl border border-glm-blue/15 bg-glm-blue-soft/45 p-3`,children:[(0,D.jsx)(`span`,{className:`mt-0.5 shrink-0 text-glm-blue`,children:(0,D.jsx)(et,{})}),(0,D.jsx)(`p`,{className:`text-xs leading-relaxed text-muted-foreground`,children:`Todavía no se han enviado avisos de esta obligación. Puedes actualizarla o eliminarla.`})]}),(0,D.jsx)(Fe,{label:`Fecha límite`,children:(0,D.jsx)(`input`,{type:`date`,value:o,min:_?void 0:He(),disabled:_,onChange:e=>s(e.target.value),className:A,required:!0})}),_&&(0,D.jsx)(`p`,{className:`rounded-lg border border-glm-blue/15 bg-glm-blue-soft/35 px-3 py-2 text-xs text-muted-foreground`,children:`Esta es una obligación histórica. Su fecha pasada se conserva y no puede moverse a otra fecha vencida.`}),v&&(0,D.jsx)(`p`,{className:`rounded-lg border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs font-medium text-destructive`,children:`No puedes mover una obligación a una fecha que ya pasó.`}),(0,D.jsx)(Fe,{label:`Descripción`,children:(0,D.jsx)(`textarea`,{value:c,onChange:e=>u(e.target.value),rows:3,className:A,required:!0})}),(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,D.jsx)(Fe,{label:`Categoría`,children:(0,D.jsxs)(`select`,{value:d,onChange:e=>f(e.target.value),className:A,children:[(0,D.jsx)(`option`,{value:`nomina`,children:`Nómina`}),(0,D.jsx)(`option`,{value:`admin`,children:`Administración`})]})}),(0,D.jsx)(Fe,{label:`País`,children:(0,D.jsx)(`select`,{value:p,onChange:e=>m(e.target.value),className:A,required:!0,children:t.map(e=>(0,D.jsx)(`option`,{value:e.id,children:e.name},e.id))})})]}),(0,D.jsxs)(`div`,{className:`rounded-lg bg-glm-blue-soft/50 p-3`,children:[(0,D.jsx)(`p`,{className:`mb-1 text-[11px] font-semibold uppercase tracking-wide text-glm-blue`,children:`Se generarán estas alertas`}),(0,D.jsx)(`div`,{className:`flex flex-wrap gap-1.5 text-xs`,children:h.map(e=>(0,D.jsxs)(`span`,{className:`rounded-md px-2 py-0.5 font-medium `+(e===o?`bg-glm-orange/15 text-glm-orange`:`bg-glm-green/20 text-glm-green`),children:[E(e),` · `,We(e)]},e))}),(0,D.jsx)(`p`,{className:`mt-2 text-[11px] text-muted-foreground`,children:`Regla: miércoles anterior y el mismo día, incluidos sábados y domingos.`})]}),(0,D.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,D.jsxs)(`button`,{type:`button`,onClick:a,disabled:n,className:`inline-flex items-center justify-center gap-1.5 rounded-md border border-destructive/30 bg-destructive/5 px-4 py-2 text-sm font-semibold text-destructive hover:border-destructive hover:bg-destructive hover:text-white disabled:opacity-60`,children:[(0,D.jsx)(Ze,{}),` Eliminar`]}),(0,D.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:r,disabled:n,className:`rounded-md border border-border bg-card px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted disabled:opacity-60`,children:`Cancelar`}),(0,D.jsx)(`button`,{type:`submit`,disabled:n||v,className:`rounded-md bg-glm-green px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-glm-green/90 disabled:cursor-wait disabled:opacity-60`,children:n?`Guardando…`:`Guardar cambios`})]})]})]})})}function De({label:e,value:t,multiline:n=!1}){return(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`mb-1 text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e}),(0,D.jsx)(`div`,{className:`rounded-lg border border-border bg-muted/35 px-3 py-2 text-sm text-foreground `+(n?`min-h-20 whitespace-pre-wrap`:``),children:t})]})}function Oe({countries:e,busy:t,onClose:n,onSearch:r,onSave:i}){let[a,o]=(0,l.useState)(`bamboo`),[s,c]=(0,l.useState)(`search`),[u,d]=(0,l.useState)(``),[f,p]=(0,l.useState)([]),[m,h]=(0,l.useState)(!1),[g,_]=(0,l.useState)(``),[v,y]=(0,l.useState)(()=>je(e)),b=t=>{y(Me(t,e)),c(`form`)},x=async()=>{let e=u.trim();if(e.split(/\s+/).length<2){_(`Escribe el nombre y apellido de la persona.`);return}h(!0),_(``);try{let t=await r(e);p(t),t.length===1?b(t[0]):c(`results`)}catch(e){_(e instanceof Error?e.message:`No pudimos completar la búsqueda en BambooHR.`)}finally{h(!1)}},ee=t=>{o(t),_(``),t===`manual`?(y(je(e)),c(`form`)):c(`search`)};return(0,D.jsx)(Pe,{onClose:m?()=>void 0:n,title:`Agregar contacto`,children:(0,D.jsxs)(`div`,{className:`relative`,children:[(0,D.jsxs)(`div`,{className:`mb-5 grid grid-cols-2 gap-1 rounded-xl bg-muted p-1`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:()=>ee(`bamboo`),disabled:m||t,className:`rounded-lg px-3 py-2 text-sm font-semibold transition `+(a===`bamboo`?`bg-card text-glm-blue shadow-sm`:`text-muted-foreground hover:text-foreground`),children:`Buscar en BambooHR`}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>ee(`manual`),disabled:m||t,className:`rounded-lg px-3 py-2 text-sm font-semibold transition `+(a===`manual`?`bg-card text-glm-blue shadow-sm`:`text-muted-foreground hover:text-foreground`),children:`Agregar manualmente`})]}),a===`bamboo`&&s===`search`&&(0,D.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),x()},className:`space-y-4`,children:[(0,D.jsxs)(`div`,{className:`rounded-xl border border-glm-blue/15 bg-glm-blue-soft/35 p-4`,children:[(0,D.jsx)(`p`,{className:`text-sm font-semibold text-glm-blue`,children:`Búsqueda automática`}),(0,D.jsx)(`p`,{className:`mt-1 text-xs leading-relaxed text-muted-foreground`,children:`Escribe el nombre completo. La app consultará BambooHR y propondrá país, área, cargo y correo. Podrás modificar todo antes de guardar.`})]}),(0,D.jsx)(Fe,{label:`Nombre completo`,children:(0,D.jsx)(`input`,{value:u,onChange:e=>d(e.target.value),className:A,placeholder:`Ej.: Iveth Herrera`,autoFocus:!0,required:!0})}),g&&(0,D.jsx)(`p`,{className:`rounded-lg border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs font-medium text-destructive`,children:g}),(0,D.jsx)(Ie,{busy:m,onCancel:n,submitLabel:`Buscar empleado`})]}),a===`bamboo`&&s===`results`&&(0,D.jsxs)(`div`,{className:`space-y-4`,children:[(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`text-sm font-semibold text-glm-blue`,children:f.length===0?`No encontramos coincidencias`:`${f.length} coincidencia${f.length===1?``:`s`}`}),(0,D.jsx)(`p`,{className:`mt-1 text-xs text-muted-foreground`,children:f.length===0?`Revisa el nombre o continúa con el registro manual.`:`Revisa los detalles y selecciona a la persona correcta.`})]}),f.length>0&&(0,D.jsx)(`div`,{className:`app-scrollbar-hidden max-h-[52vh] space-y-2 overflow-y-auto pr-1`,children:f.map(e=>(0,D.jsxs)(`button`,{type:`button`,onClick:()=>b(e),className:`w-full rounded-xl border border-border bg-card p-4 text-left transition hover:border-glm-green hover:bg-glm-green/5`,children:[(0,D.jsxs)(`div`,{className:`flex items-start justify-between gap-3`,children:[(0,D.jsxs)(`div`,{className:`min-w-0`,children:[(0,D.jsx)(`p`,{className:`font-semibold text-foreground`,children:e.fullName}),(0,D.jsx)(`p`,{className:`mt-0.5 text-xs text-muted-foreground`,children:e.jobTitle||`Cargo no registrado`})]}),(0,D.jsxs)(`span`,{className:`shrink-0 rounded-full px-2 py-0.5 text-[10px] font-semibold uppercase tracking-wide `+(e.matchQuality===`exacta`?`bg-glm-green/15 text-glm-green`:e.matchQuality===`alta`?`bg-glm-blue-soft text-glm-blue`:`bg-muted text-muted-foreground`),children:[`Coincidencia `,e.matchQuality]})]}),(0,D.jsxs)(`div`,{className:`mt-3 grid gap-1.5 text-xs text-muted-foreground sm:grid-cols-2`,children:[(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`País:`}),` `,e.countryName||`Regional`]}),(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Área:`}),` `,Ve(e.area)]}),(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Correo:`}),` `,e.email||`No registrado`]}),(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Departamento:`}),` `,e.department||`No registrado`]}),(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Estado:`}),` `,e.status||`No registrado`]})]})]},`${e.id}-${e.employeeNumber}`))}),(0,D.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 sm:flex-row sm:justify-between`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:()=>c(`search`),className:`rounded-md border border-border bg-card px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted`,children:`Volver a buscar`}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>ee(`manual`),className:`rounded-md bg-glm-blue px-4 py-2 text-sm font-semibold text-white hover:bg-glm-blue/90`,children:`Agregar manualmente`})]})]}),s===`form`&&(0,D.jsx)(Ae,{countries:e,draft:v,setDraft:y,busy:t,onCancel:n,onSubmit:i,submitLabel:`Guardar contacto`,imported:v.source===`bamboohr`,onBack:a===`bamboo`?()=>c(`results`):void 0}),m&&(0,D.jsxs)(`div`,{className:`absolute -inset-5 z-20 flex flex-col items-center justify-center rounded-xl bg-card/95 px-6 text-center backdrop-blur-sm`,children:[(0,D.jsx)(`span`,{className:`h-10 w-10 animate-spin rounded-full border-4 border-glm-blue-soft border-t-glm-green`}),(0,D.jsx)(`p`,{className:`mt-4 text-sm font-semibold text-glm-blue`,children:`Buscando en BambooHR…`}),(0,D.jsx)(`p`,{className:`mt-1 max-w-xs text-xs leading-relaxed text-muted-foreground`,children:`Estamos revisando los empleados y comparando las coincidencias. No cierres esta ventana.`})]})]})})}function ke({contact:e,countries:t,busy:n,onClose:r,onSave:i,onDelete:a}){let[o,s]=(0,l.useState)(()=>Ne(e));return(0,D.jsx)(Pe,{onClose:r,title:`Editar contacto`,children:(0,D.jsx)(Ae,{countries:t,draft:o,setDraft:s,busy:n,onCancel:r,onSubmit:i,submitLabel:`Guardar cambios`,imported:e.source===`bamboohr`,onDelete:a})})}function Ae({countries:e,draft:t,setDraft:n,busy:r,onCancel:i,onSubmit:a,submitLabel:o,imported:s,onBack:c,onDelete:u}){let d=e.find(e=>e.id===t.countryId),f=(e,r)=>n({...t,[e]:r});(0,l.useEffect)(()=>{!d?.isRegional&&t.area===`regional`&&n({...t,area:`admin`})},[t,d,n]);let p=!t.name.trim()||!t.countryId||(t.emailEnabled||t.googleChatEnabled||t.calendarEnabled)&&!t.email.trim();return(0,D.jsxs)(`form`,{onSubmit:e=>{e.preventDefault(),!p&&a({...t,name:t.name.trim(),email:t.email.trim(),role:t.role.trim()})},className:`space-y-4`,children:[s&&(0,D.jsxs)(`div`,{className:`flex gap-3 rounded-xl border border-glm-green/25 bg-glm-green/10 p-3`,children:[(0,D.jsx)(`span`,{className:`mt-0.5 h-2.5 w-2.5 shrink-0 rounded-full bg-glm-green`}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`p`,{className:`text-xs font-semibold text-glm-blue`,children:`Datos encontrados en BambooHR`}),(0,D.jsx)(`p`,{className:`mt-1 text-[11px] leading-relaxed text-muted-foreground`,children:`Revisa la información antes de guardar. Todos los campos continúan siendo editables.`})]})]}),(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,D.jsx)(Fe,{label:`País`,children:(0,D.jsx)(`select`,{value:t.countryId,onChange:e=>f(`countryId`,e.target.value),className:A,required:!0,children:e.map(e=>(0,D.jsx)(`option`,{value:e.id,children:e.name},e.id))})}),(0,D.jsx)(Fe,{label:`Área`,children:(0,D.jsxs)(`select`,{value:t.area,onChange:e=>f(`area`,e.target.value),className:A,children:[d?.isRegional&&(0,D.jsx)(`option`,{value:`regional`,children:`Regional · todas las categorías`}),(0,D.jsx)(`option`,{value:`nomina`,children:d?.isRegional?`Nómina · todos los países`:`Nómina`}),(0,D.jsx)(`option`,{value:`admin`,children:d?.isRegional?`Administración · todos los países`:`Administración`}),(0,D.jsx)(`option`,{value:`other`,children:`Otra`})]})})]}),t.area===`other`&&(0,D.jsx)(`p`,{className:`rounded-lg border border-glm-orange/20 bg-glm-orange/5 px-3 py-2 text-[11px] leading-relaxed text-muted-foreground`,children:`El área “Otra” conserva la información del empleado, pero no recibe obligaciones hasta que se cambie a Nómina, Administración o Regional.`}),(0,D.jsx)(Fe,{label:`Nombre completo`,children:(0,D.jsx)(`input`,{value:t.name,onChange:e=>f(`name`,e.target.value),className:A,required:!0})}),(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,D.jsx)(Fe,{label:`Cargo`,children:(0,D.jsx)(`input`,{value:t.role,onChange:e=>f(`role`,e.target.value),className:A,placeholder:`Ej.: Coordinador Administrativo`})}),(0,D.jsx)(Fe,{label:`Departamento`,children:(0,D.jsx)(`input`,{value:t.department??``,onChange:e=>f(`department`,e.target.value),className:A})})]}),(0,D.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,D.jsx)(Fe,{label:`División`,children:(0,D.jsx)(`input`,{value:t.division??``,onChange:e=>f(`division`,e.target.value),className:A})}),(0,D.jsx)(Fe,{label:`Ubicación BambooHR`,children:(0,D.jsx)(`input`,{value:t.location??``,onChange:e=>f(`location`,e.target.value),className:A})})]}),(0,D.jsx)(Fe,{label:`Correo corporativo`,children:(0,D.jsx)(`input`,{type:`email`,value:t.email,onChange:e=>f(`email`,e.target.value),className:A,required:t.emailEnabled||t.googleChatEnabled||t.calendarEnabled,placeholder:`persona@gomezleemarketing.com`})}),(0,D.jsxs)(`div`,{className:`flex flex-wrap gap-x-5 gap-y-3 rounded-lg bg-muted/60 p-3 text-sm`,children:[(0,D.jsx)(Le,{checked:t.emailEnabled,onChange:e=>f(`emailEnabled`,e),label:`Enviar por correo`}),(0,D.jsx)(Le,{checked:t.googleChatEnabled,onChange:e=>f(`googleChatEnabled`,e),label:`Enviar por Google Chat`}),(0,D.jsx)(Le,{checked:t.calendarEnabled,onChange:e=>f(`calendarEnabled`,e),label:`Invitar en Google Calendar`})]}),s&&(t.bambooEmployeeNumber||t.bambooStatus)&&(0,D.jsxs)(`div`,{className:`grid gap-2 rounded-lg border border-border bg-muted/25 p-3 text-[11px] text-muted-foreground sm:grid-cols-2`,children:[(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Empleado:`}),` `,t.bambooEmployeeNumber||`No disponible`]}),(0,D.jsxs)(`span`,{children:[(0,D.jsx)(`strong`,{className:`text-foreground`,children:`Estado BambooHR:`}),` `,t.bambooStatus||`No disponible`]})]}),(0,D.jsxs)(`div`,{className:`flex flex-col-reverse gap-2 pt-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,D.jsxs)(`div`,{className:`flex gap-2`,children:[u&&(0,D.jsxs)(`button`,{type:`button`,onClick:u,disabled:r,className:`inline-flex items-center justify-center gap-1.5 rounded-md border border-destructive/30 bg-destructive/5 px-4 py-2 text-sm font-semibold text-destructive hover:border-destructive hover:bg-destructive hover:text-white disabled:opacity-60`,children:[(0,D.jsx)(Ze,{}),` Eliminar`]}),c&&(0,D.jsx)(`button`,{type:`button`,onClick:c,disabled:r,className:`rounded-md border border-border bg-card px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted disabled:opacity-60`,children:`Volver`})]}),(0,D.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:i,disabled:r,className:`rounded-md border border-border bg-card px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted disabled:opacity-60`,children:`Cancelar`}),(0,D.jsx)(`button`,{type:`submit`,disabled:r||p,className:`rounded-md bg-glm-green px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-glm-green/90 disabled:cursor-wait disabled:opacity-60`,children:r?`Guardando…`:o})]})]})]})}function je(e){let t=e.find(e=>e.isRegional)??e[0];return{countryId:t?.id??``,name:``,email:``,role:``,area:t?.isRegional?`regional`:`admin`,department:``,division:``,location:``,source:`manual`,bambooEmployeeId:``,bambooEmployeeNumber:``,bambooStatus:``,emailEnabled:!0,googleChatEnabled:!0,calendarEnabled:!0}}function Me(e,t){return{countryId:(t.find(t=>t.code===e.countryCode)??t.find(e=>e.isRegional)??t[0])?.id??``,name:e.fullName||e.displayName,email:e.email,role:e.jobTitle,area:e.area,department:e.department,division:e.division,location:e.location,source:`bamboohr`,bambooEmployeeId:e.id,bambooEmployeeNumber:e.employeeNumber,bambooStatus:e.status,emailEnabled:!!e.email,googleChatEnabled:!!e.email,calendarEnabled:!!e.email}}function Ne(e){return{countryId:e.countryId,name:e.name,email:e.email,role:e.role,area:e.area,department:e.department,division:e.division,location:e.location,source:e.source,bambooEmployeeId:e.bambooEmployeeId,bambooEmployeeNumber:e.bambooEmployeeNumber,bambooStatus:e.bambooStatus,emailEnabled:e.emailEnabled,googleChatEnabled:e.googleChatEnabled,calendarEnabled:e.calendarEnabled}}var A=`w-full rounded-md border border-input bg-background px-3 py-2 text-sm outline-none transition focus:border-glm-green focus:ring-2 focus:ring-glm-green/30 disabled:cursor-not-allowed disabled:opacity-60`;function Pe({onClose:e,title:t,children:n}){return(0,D.jsx)(`div`,{onClick:e,className:`fixed inset-0 z-50 flex items-end justify-center bg-foreground/40 p-0 backdrop-blur-sm sm:items-center sm:p-4`,children:(0,D.jsxs)(`div`,{onClick:e=>e.stopPropagation(),className:`app-scrollbar-hidden max-h-[94dvh] w-full max-w-xl overflow-y-auto rounded-t-2xl bg-card p-6 shadow-xl sm:rounded-2xl`,children:[(0,D.jsxs)(`div`,{className:`mb-4 flex items-center justify-between gap-4`,children:[(0,D.jsx)(`h3`,{className:`text-lg font-semibold text-glm-blue`,children:t}),(0,D.jsx)(`button`,{type:`button`,onClick:e,className:`rounded-md p-1 text-muted-foreground hover:bg-muted`,"aria-label":`Cerrar`,children:(0,D.jsx)(Xe,{})})]}),n]})})}function Fe({label:e,children:t}){return(0,D.jsxs)(`label`,{className:`block`,children:[(0,D.jsx)(`span`,{className:`mb-1 block text-xs font-semibold uppercase tracking-wide text-muted-foreground`,children:e}),t]})}function Ie({busy:e,onCancel:t,submitLabel:n}){return(0,D.jsxs)(`div`,{className:`flex justify-end gap-2 pt-2`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:t,disabled:e,className:`rounded-md border border-border bg-card px-4 py-2 text-sm font-medium text-muted-foreground hover:bg-muted disabled:opacity-60`,children:`Cancelar`}),(0,D.jsx)(`button`,{type:`submit`,disabled:e,className:`rounded-md bg-glm-green px-4 py-2 text-sm font-semibold text-white shadow-sm hover:bg-glm-green/90 disabled:cursor-wait disabled:opacity-60`,children:e?`Guardando…`:n})]})}function Le({checked:e,onChange:t,label:n}){return(0,D.jsxs)(`label`,{className:`inline-flex cursor-pointer items-center gap-2`,children:[(0,D.jsx)(`input`,{type:`checkbox`,checked:e,onChange:e=>t(e.target.checked),className:`h-4 w-4 accent-[var(--glm-green)]`}),(0,D.jsx)(`span`,{children:n})]})}function Re({toast:e}){return(0,D.jsx)(`div`,{className:`fixed bottom-5 right-5 z-[70] rounded-xl border px-4 py-3 text-sm font-medium shadow-xl `+(e.type===`success`?`border-glm-green/30 bg-card text-glm-green`:`border-destructive/30 bg-card text-destructive`),children:e.message})}function ze(){return(0,D.jsx)(`div`,{className:`flex min-h-80 items-center justify-center`,children:(0,D.jsxs)(`div`,{className:`text-center`,children:[(0,D.jsx)(`div`,{className:`mx-auto h-8 w-8 animate-spin rounded-full border-2 border-glm-blue/20 border-t-glm-green`}),(0,D.jsx)(`p`,{className:`mt-4 text-sm text-muted-foreground`,children:`Cargando calendario y contactos…`})]})})}function Be({message:e}){return(0,D.jsx)(`div`,{className:`rounded-xl border border-dashed border-border bg-card/50 p-10 text-center`,children:(0,D.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:e})})}function Ve(e){return e===`nomina`?`Nómina`:e===`regional`?`Regional`:e===`other`?`Otra`:`Administración`}function He(){let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`}function Ue(e){return new Intl.DateTimeFormat(`es-DO`,{dateStyle:`medium`,timeStyle:`short`,timeZone:`America/Santo_Domingo`}).format(new Date(e))}function We(e){let[t,n,r]=e.split(`-`).map(Number);return T[[6,0,1,2,3,4,5][new Date(Date.UTC(t,n-1,r)).getUTCDay()]]}function Ge(e,t){let n=new Date(Date.UTC(e,t,1)),r=(n.getUTCDay()+6)%7,i=new Date(n);i.setUTCDate(1-r);let a=[];for(let e=0;e<42;e+=1){let t=new Date(i);t.setUTCDate(i.getUTCDate()+e),a.push({day:t.getUTCDate(),month:t.getUTCMonth(),year:t.getUTCFullYear(),iso:`${t.getUTCFullYear()}-${String(t.getUTCMonth()+1).padStart(2,`0`)}-${String(t.getUTCDate()).padStart(2,`0`)}`,dow:(t.getUTCDay()+6)%7})}return a}function Ke(){return(0,D.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,strokeLinecap:`round`,children:(0,D.jsx)(`path`,{d:`M12 5v14M5 12h14`})})}function qe(){return(0,D.jsxs)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,D.jsx)(`path`,{d:`M10 17l5-5-5-5`}),(0,D.jsx)(`path`,{d:`M15 12H3`}),(0,D.jsx)(`path`,{d:`M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4`})]})}function Je({dir:e}){return(0,D.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2.5`,strokeLinecap:`round`,strokeLinejoin:`round`,children:e===`left`?(0,D.jsx)(`path`,{d:`M15 18l-6-6 6-6`}):(0,D.jsx)(`path`,{d:`M9 18l6-6-6-6`})})}function Ye(){return(0,D.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,D.jsx)(`path`,{d:`m6 9 6 6 6-6`})})}function Xe(){return(0,D.jsx)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,children:(0,D.jsx)(`path`,{d:`M18 6L6 18M6 6l12 12`})})}function Ze(){return(0,D.jsx)(`svg`,{width:`16`,height:`16`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,children:(0,D.jsx)(`path`,{d:`M3 6h18M8 6V4a2 2 0 012-2h4a2 2 0 012 2v2m3 0v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6h14z`})})}function Qe(){return(0,D.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,children:[(0,D.jsx)(`circle`,{cx:`11`,cy:`11`,r:`8`}),(0,D.jsx)(`path`,{d:`m21 21-4.35-4.35`})]})}function $e({size:e=14}){return(0,D.jsxs)(`svg`,{width:e,height:e,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,D.jsx)(`rect`,{x:`4`,y:`10`,width:`16`,height:`11`,rx:`2`}),(0,D.jsx)(`path`,{d:`M8 10V7a4 4 0 0 1 8 0v3`})]})}function et(){return(0,D.jsxs)(`svg`,{width:`18`,height:`18`,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,strokeWidth:`2`,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,children:[(0,D.jsx)(`path`,{d:`M12 20h9`}),(0,D.jsx)(`path`,{d:`M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z`})]})}var tt=`https://dbit.digitalcompass.agency`.replace(/\/+$/,``),nt=`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE`,rt=`glm-tax-auth-session-v1`,it=60,at=!!(tt&&nt);function ot(){if(at)return null;let e=[];return tt||e.push(`VITE_SUPABASE_URL`),nt||e.push(`VITE_SUPABASE_PUBLISHABLE_KEY o VITE_SUPABASE_ANON_KEY`),`Falta configurar ${e.join(` y `)} en el archivo .env.`}function st(){return new URL(`/calendario-impuestos/`,window.location.origin).toString()}function ct(){Ct();let e=new URLSearchParams({provider:`google`,redirect_to:st(),prompt:`select_account`});window.location.assign(`${tt}/auth/v1/authorize?${e.toString()}`)}async function lt(){Ct();let e=await ft();if(e)return e;let t=_t();if(!t)return null;try{return await pt(t)}catch{return yt(),null}}async function ut(e){let t=await pt(e),n=await fetch(`${tt}/rest/v1/rpc/has_tax_calendar_access`,{method:`POST`,headers:gt(t.accessToken),body:`{}`});if(!n.ok)throw Error(await St(n,`No se pudo verificar el acceso.`));return{allowed:await n.json()===!0,session:t}}async function dt(e){try{e?.accessToken&&at&&await fetch(`${tt}/auth/v1/logout`,{method:`POST`,headers:gt(e.accessToken)})}catch{}finally{yt()}}async function ft(){let e=new URLSearchParams(window.location.hash.replace(/^#/,``)),t=e.get(`error_description`)??e.get(`error`);if(t)throw bt(),Error(t.replace(/\+/g,` `));let n=e.get(`access_token`),r=e.get(`refresh_token`);if(!n||!r)return null;let i=xt(e.get(`expires_at`),e.get(`expires_in`));bt();let a={accessToken:n,refreshToken:r,expiresAt:i,user:await mt(n)};return vt(a),a}async function pt(e){let t=Math.floor(Date.now()/1e3);if(e.expiresAt>t+it)return e;let n=await fetch(`${tt}/auth/v1/token?grant_type=refresh_token`,{method:`POST`,headers:ht(),body:JSON.stringify({refresh_token:e.refreshToken})});if(!n.ok)throw Error(await St(n,`La sesión expiró.`));let r=await n.json(),i={accessToken:r.access_token,refreshToken:r.refresh_token,expiresAt:xt(r.expires_at,r.expires_in),user:r.user??await mt(r.access_token)};return vt(i),i}async function mt(e){let t=await fetch(`${tt}/auth/v1/user`,{headers:gt(e)});if(!t.ok)throw Error(await St(t,`No se pudo cargar el usuario.`));let n=await t.json();if(!n.id||!n.email)throw Error(`Supabase no devolvió un usuario válido.`);return n}function ht(){return{apikey:nt,"Content-Type":`application/json`}}function gt(e){return{...ht(),Authorization:`Bearer ${e}`}}function _t(){try{let e=localStorage.getItem(rt);if(!e)return null;let t=JSON.parse(e);return!t.accessToken||!t.refreshToken||!t.expiresAt||!t.user?.id||!t.user.email?(yt(),null):t}catch{return yt(),null}}function vt(e){localStorage.setItem(rt,JSON.stringify(e))}function yt(){localStorage.removeItem(rt)}function bt(){window.history.replaceState(null,document.title,`${window.location.pathname}${window.location.search}`)}function xt(e,t){let n=Number(e);if(Number.isFinite(n)&&n>0)return n;let r=Number(t);return Math.floor(Date.now()/1e3)+(Number.isFinite(r)?r:3600)}async function St(e,t){try{let n=await e.json();return n.message??n.msg??n.error_description??n.error??t}catch{return t}}function Ct(){let e=ot();if(e)throw Error(e)}function wt(){let[e,t]=(0,l.useState)({status:`loading`}),[n,r]=(0,l.useState)(!1);(0,l.useEffect)(()=>{let e=!1;return(async()=>{if(!at){e||t({status:`configuration`});return}try{let n=await lt();if(e)return;if(!n){t({status:`signed-out`});return}t({status:`checking`,session:n});let r=await ut(n);if(e)return;t(r.allowed?{status:`authorized`,session:r.session}:{status:`denied`,session:r.session})}catch(n){e||t({status:`signed-out`,error:Ot(n)})}})(),()=>{e=!0}},[]);let i=async e=>{r(!0),t({status:`checking`,session:e});try{let n=await ut(e);t(n.allowed?{status:`authorized`,session:n.session}:{status:`denied`,session:n.session})}catch(n){t({status:`denied`,session:e,error:Ot(n)})}finally{r(!1)}},a=()=>{r(!0);try{ct()}catch(e){r(!1),t({status:`signed-out`,error:Ot(e)})}},o=async e=>{r(!0),await dt(e),r(!1),t({status:`signed-out`})};if(e.status===`authorized`)return(0,D.jsx)(pe,{session:e.session,onSignOut:()=>o(e.session)});if(e.status===`loading`||e.status===`checking`)return(0,D.jsx)(Et,{checkingAccess:e.status===`checking`});if(e.status===`configuration`)return(0,D.jsx)(Tt,{children:(0,D.jsx)(j,{eyebrow:`Servicio no disponible`,title:`No pudimos abrir la aplicación`,description:`La aplicación no está disponible en este momento.`,detail:`Comunícate con el equipo de IT para recibir asistencia.`})});if(e.status===`denied`){let t=!!e.error;return(0,D.jsx)(Tt,{children:(0,D.jsxs)(j,{eyebrow:t?`No se pudo validar`:`Acceso restringido`,title:t?`No pudimos comprobar tu acceso`:`Este correo no tiene acceso`,description:t?e.error??`No pudimos completar la validación.`:`Tu cuenta no tiene acceso a esta aplicación.`,detail:t?`Inténtalo nuevamente en unos minutos o usa otra cuenta.`:`Comunícate con el equipo de IT si necesitas solicitar acceso.`,children:[(0,D.jsx)(`button`,{type:`button`,onClick:()=>i(e.session),disabled:n,className:`w-full rounded-lg bg-glm-green px-4 py-2.5 text-sm font-semibold text-white shadow-sm transition hover:bg-glm-green/90 disabled:cursor-wait disabled:opacity-60`,children:`Volver a comprobar`}),(0,D.jsx)(`button`,{type:`button`,onClick:()=>o(e.session),disabled:n,className:`w-full rounded-lg border border-border bg-card px-4 py-2.5 text-sm font-semibold text-glm-blue transition hover:bg-muted disabled:cursor-wait disabled:opacity-60`,children:`Usar otra cuenta`})]})})}return(0,D.jsx)(Tt,{children:(0,D.jsxs)(`div`,{className:`w-full max-w-md`,children:[(0,D.jsxs)(`div`,{className:`mb-8`,children:[(0,D.jsx)(`p`,{className:`mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-glm-green`,children:`Acceso interno`}),(0,D.jsx)(`h1`,{className:`text-3xl font-semibold tracking-tight text-glm-blue sm:text-4xl`,children:`Seguimiento de Impuestos GLM`}),(0,D.jsx)(`p`,{className:`mt-3 text-sm leading-6 text-muted-foreground`,children:`Consulta y administra el calendario tributario regional desde un solo lugar.`})]}),e.error&&(0,D.jsx)(`div`,{className:`mb-4 rounded-lg border border-destructive/25 bg-destructive/5 px-4 py-3 text-sm text-destructive`,children:e.error}),(0,D.jsxs)(`button`,{type:`button`,onClick:a,disabled:n,className:`flex w-full items-center justify-center gap-3 rounded-lg border border-border bg-card px-4 py-3 text-sm font-semibold text-foreground shadow-sm transition hover:-translate-y-px hover:border-glm-blue/35 hover:shadow-md disabled:cursor-wait disabled:opacity-60`,children:[(0,D.jsx)(Dt,{}),n?`Abriendo Google…`:`Continuar con Google`]})]})})}function Tt({children:e}){return(0,D.jsxs)(`main`,{className:`relative flex min-h-screen items-center justify-center overflow-hidden bg-background px-5 py-10`,children:[(0,D.jsx)(`div`,{className:`pointer-events-none absolute inset-0 auth-grid opacity-55`}),(0,D.jsx)(`div`,{className:`pointer-events-none absolute -left-28 top-1/4 h-72 w-72 rounded-full bg-glm-green/10 blur-3xl`}),(0,D.jsx)(`div`,{className:`pointer-events-none absolute -right-24 bottom-1/4 h-80 w-80 rounded-full bg-glm-blue/10 blur-3xl`}),(0,D.jsxs)(`section`,{className:`relative grid w-full max-w-5xl overflow-hidden rounded-3xl border border-border bg-card shadow-[0_28px_90px_rgba(79,117,139,0.16)] lg:grid-cols-[0.9fr_1.1fr]`,children:[(0,D.jsxs)(`div`,{className:`relative hidden min-h-[560px] border-r border-border bg-muted/35 p-10 lg:flex lg:flex-col lg:justify-between`,children:[(0,D.jsx)(`img`,{src:d,alt:`GomezLee Marketing`,className:`h-auto w-44`}),(0,D.jsxs)(`div`,{children:[(0,D.jsx)(`div`,{className:`mb-6 h-1 w-14 rounded-full bg-glm-green`}),(0,D.jsx)(`p`,{className:`max-w-xs text-2xl font-semibold leading-tight text-glm-blue`,children:`Obligaciones tributarias claras, organizadas y listas para dar seguimiento.`}),(0,D.jsx)(`p`,{className:`mt-4 max-w-sm text-sm leading-6 text-muted-foreground`,children:`Calendario regional de GomezLee Marketing con fechas históricas, contactos y alertas calculadas.`})]}),(0,D.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`GomezLee Marketing · Uso interno`})]}),(0,D.jsx)(`div`,{className:`flex min-h-[520px] items-center justify-center p-7 sm:p-12 lg:min-h-[560px] lg:p-16`,children:(0,D.jsxs)(`div`,{className:`w-full`,children:[(0,D.jsx)(`img`,{src:d,alt:`GomezLee Marketing`,className:`mb-10 h-auto w-36 lg:hidden`}),e]})})]})]})}function Et({checkingAccess:e}){return(0,D.jsx)(`main`,{className:`flex min-h-screen items-center justify-center bg-background px-4`,children:(0,D.jsxs)(`div`,{className:`text-center`,children:[(0,D.jsx)(`img`,{src:d,alt:`GomezLee Marketing`,className:`mx-auto h-auto w-40`}),(0,D.jsx)(`div`,{className:`mx-auto mt-8 h-8 w-8 animate-spin rounded-full border-2 border-glm-blue/20 border-t-glm-green`}),(0,D.jsx)(`p`,{className:`mt-4 text-sm text-muted-foreground`,children:e?`Verificando acceso…`:`Cargando aplicación…`})]})})}function j({eyebrow:e,title:t,description:n,detail:r,children:i}){return(0,D.jsxs)(`div`,{className:`w-full max-w-md`,children:[(0,D.jsx)(`p`,{className:`mb-2 text-xs font-semibold uppercase tracking-[0.18em] text-glm-green`,children:e}),(0,D.jsx)(`h1`,{className:`text-3xl font-semibold tracking-tight text-glm-blue`,children:t}),(0,D.jsx)(`p`,{className:`mt-4 text-sm leading-6 text-foreground`,children:n}),(0,D.jsx)(`p`,{className:`mt-2 text-xs leading-5 text-muted-foreground`,children:r}),i&&(0,D.jsx)(`div`,{className:`mt-7 space-y-3`,children:i})]})}function Dt(){return(0,D.jsxs)(`svg`,{width:`19`,height:`19`,viewBox:`0 0 24 24`,"aria-hidden":`true`,children:[(0,D.jsx)(`path`,{fill:`#4285F4`,d:`M21.6 12.23c0-.71-.06-1.23-.2-1.78H12v3.4h5.52a4.75 4.75 0 0 1-2.05 3.03l-.02.11 2.98 2.31.21.02c1.91-1.76 2.96-4.35 2.96-7.09Z`}),(0,D.jsx)(`path`,{fill:`#34A853`,d:`M12 22c2.72 0 5-.9 6.65-2.44l-3.17-2.45c-.85.59-1.99 1-3.48 1a6.04 6.04 0 0 1-5.72-4.17l-.1.01-3.1 2.4-.04.1A10.04 10.04 0 0 0 12 22Z`}),(0,D.jsx)(`path`,{fill:`#FBBC05`,d:`M6.28 13.94A6.2 6.2 0 0 1 5.94 12c0-.67.12-1.32.33-1.94l-.01-.13-3.14-2.44-.1.05A10.02 10.02 0 0 0 2 12c0 1.61.38 3.13 1.04 4.46l3.24-2.52Z`}),(0,D.jsx)(`path`,{fill:`#EA4335`,d:`M12 5.89c1.89 0 3.16.82 3.88 1.5l2.84-2.77C16.98 3 14.72 2 12 2a10.04 10.04 0 0 0-8.97 5.54l3.24 2.52A6.07 6.07 0 0 1 12 5.89Z`})]})}function Ot(e){return`No pudimos completar el proceso. Inténtalo nuevamente.`}function kt(){return(0,D.jsx)(wt,{})}var At=document.getElementById(`root`);if(!At)throw Error(`No se encontró el elemento raíz con id="root".`);(0,u.createRoot)(At).render((0,D.jsx)(kt,{})); \ No newline at end of file diff --git a/dist/assets/index-DrJGHNJG.css b/dist/assets/index-DrJGHNJG.css new file mode 100644 index 0000000..149f7ab --- /dev/null +++ b/dist/assets/index-DrJGHNJG.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:Arial, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-xl:36rem;--container-3xl:48rem;--container-5xl:64rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-3xl:1.5rem;--animate-spin:spin 1s linear infinite;--blur-sm:8px;--blur-3xl:64px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:Arial, sans-serif;--default-mono-font-family:var(--font-mono);--color-background:var(--background);--color-foreground:var(--foreground);--color-border:var(--border)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--color-border)}html,body{background-color:var(--color-background);color:var(--color-foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.-inset-5{inset:calc(var(--spacing) * -5)}.inset-0{inset:0}.top-0{top:0}.top-1\/2{top:50%}.top-1\/4{top:25%}.top-2{top:calc(var(--spacing) * 2)}.-right-24{right:calc(var(--spacing) * -24)}.right-0{right:0}.right-5{right:calc(var(--spacing) * 5)}.bottom-1\/4{bottom:25%}.bottom-5{bottom:calc(var(--spacing) * 5)}.-left-28{left:calc(var(--spacing) * -28)}.left-3{left:calc(var(--spacing) * 3)}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[70\]{z-index:70}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mb-1{margin-bottom:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.h-1{height:var(--spacing)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-72{height:calc(var(--spacing) * 72)}.h-80{height:calc(var(--spacing) * 80)}.h-auto{height:auto}.h-dvh{height:100dvh}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[52vh\]{max-height:52vh}.max-h-\[94dvh\]{max-height:94dvh}.min-h-0{min-height:0}.min-h-20{min-height:calc(var(--spacing) * 20)}.min-h-52{min-height:calc(var(--spacing) * 52)}.min-h-80{min-height:calc(var(--spacing) * 80)}.min-h-\[110px\]{min-height:110px}.min-h-\[520px\]{min-height:520px}.min-h-\[560px\]{min-height:560px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-4{width:calc(var(--spacing) * 4)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-14{width:calc(var(--spacing) * 14)}.w-36{width:calc(var(--spacing) * 36)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-72{width:calc(var(--spacing) * 72)}.w-80{width:calc(var(--spacing) * 80)}.w-auto{width:auto}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-6{min-width:calc(var(--spacing) * 6)}.min-w-\[110px\]{min-width:110px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-y-3{row-gap:calc(var(--spacing) * 3)}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:calc(var(--radius) + 8px)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-t-2xl{border-top-left-radius:calc(var(--radius) + 8px);border-top-right-radius:calc(var(--radius) + 8px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-border{border-color:var(--border)}.border-destructive\/20{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/20{border-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.border-destructive\/25{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/25{border-color:color-mix(in oklab, var(--destructive) 25%, transparent)}}.border-destructive\/30{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/30{border-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.border-glm-blue{border-color:var(--glm-blue)}.border-glm-blue-soft{border-color:var(--glm-blue-soft)}.border-glm-blue\/15{border-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.border-glm-blue\/15{border-color:color-mix(in oklab, var(--glm-blue) 15%, transparent)}}.border-glm-blue\/20{border-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.border-glm-blue\/20{border-color:color-mix(in oklab, var(--glm-blue) 20%, transparent)}}.border-glm-green\/25{border-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.border-glm-green\/25{border-color:color-mix(in oklab, var(--glm-green) 25%, transparent)}}.border-glm-green\/30{border-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.border-glm-green\/30{border-color:color-mix(in oklab, var(--glm-green) 30%, transparent)}}.border-glm-orange\/20{border-color:var(--glm-orange)}@supports (color:color-mix(in lab, red, red)){.border-glm-orange\/20{border-color:color-mix(in oklab, var(--glm-orange) 20%, transparent)}}.border-glm-orange\/30{border-color:var(--glm-orange)}@supports (color:color-mix(in lab, red, red)){.border-glm-orange\/30{border-color:color-mix(in oklab, var(--glm-orange) 30%, transparent)}}.border-input{border-color:var(--input)}.border-t-glm-green{border-top-color:var(--glm-green)}.bg-background{background-color:var(--background)}.bg-card,.bg-card\/50{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/50{background-color:color-mix(in oklab, var(--card) 50%, transparent)}}.bg-card\/90{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/90{background-color:color-mix(in oklab, var(--card) 90%, transparent)}}.bg-card\/95{background-color:var(--card)}@supports (color:color-mix(in lab, red, red)){.bg-card\/95{background-color:color-mix(in oklab, var(--card) 95%, transparent)}}.bg-destructive\/5{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/5{background-color:color-mix(in oklab, var(--destructive) 5%, transparent)}}.bg-foreground\/40{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.bg-foreground\/40{background-color:color-mix(in oklab, var(--foreground) 40%, transparent)}}.bg-glm-blue{background-color:var(--glm-blue)}.bg-glm-blue-soft,.bg-glm-blue-soft\/35{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.bg-glm-blue-soft\/35{background-color:color-mix(in oklab, var(--glm-blue-soft) 35%, transparent)}}.bg-glm-blue-soft\/40{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.bg-glm-blue-soft\/40{background-color:color-mix(in oklab, var(--glm-blue-soft) 40%, transparent)}}.bg-glm-blue-soft\/45{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.bg-glm-blue-soft\/45{background-color:color-mix(in oklab, var(--glm-blue-soft) 45%, transparent)}}.bg-glm-blue-soft\/50{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.bg-glm-blue-soft\/50{background-color:color-mix(in oklab, var(--glm-blue-soft) 50%, transparent)}}.bg-glm-blue\/10{background-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.bg-glm-blue\/10{background-color:color-mix(in oklab, var(--glm-blue) 10%, transparent)}}.bg-glm-green,.bg-glm-green\/10{background-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.bg-glm-green\/10{background-color:color-mix(in oklab, var(--glm-green) 10%, transparent)}}.bg-glm-green\/15{background-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.bg-glm-green\/15{background-color:color-mix(in oklab, var(--glm-green) 15%, transparent)}}.bg-glm-green\/20{background-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.bg-glm-green\/20{background-color:color-mix(in oklab, var(--glm-green) 20%, transparent)}}.bg-glm-orange,.bg-glm-orange\/5{background-color:var(--glm-orange)}@supports (color:color-mix(in lab, red, red)){.bg-glm-orange\/5{background-color:color-mix(in oklab, var(--glm-orange) 5%, transparent)}}.bg-glm-orange\/10{background-color:var(--glm-orange)}@supports (color:color-mix(in lab, red, red)){.bg-glm-orange\/10{background-color:color-mix(in oklab, var(--glm-orange) 10%, transparent)}}.bg-glm-orange\/15{background-color:var(--glm-orange)}@supports (color:color-mix(in lab, red, red)){.bg-glm-orange\/15{background-color:color-mix(in oklab, var(--glm-orange) 15%, transparent)}}.bg-muted,.bg-muted\/25{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/25{background-color:color-mix(in oklab, var(--muted) 25%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/35{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/35{background-color:color-mix(in oklab, var(--muted) 35%, transparent)}}.bg-muted\/60{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/60{background-color:color-mix(in oklab, var(--muted) 60%, transparent)}}.object-contain{object-fit:contain}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-7{padding:calc(var(--spacing) * 7)}.p-10{padding:calc(var(--spacing) * 10)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:var(--spacing)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pl-10{padding-left:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-pre-wrap{white-space:pre-wrap}.text-destructive{color:var(--destructive)}.text-foreground{color:var(--foreground)}.text-glm-blue{color:var(--glm-blue)}.text-glm-green{color:var(--glm-green)}.text-glm-orange{color:var(--glm-orange)}.text-muted-foreground,.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.accent-\[var\(--glm-green\)\]{accent-color:var(--glm-green)}.opacity-55{opacity:.55}.opacity-100{opacity:1}.shadow-\[0_28px_90px_rgba\(79\,117\,139\,0\.16\)\]{--tw-shadow:0 28px 90px var(--tw-shadow-color,#4f758b29);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.placeholder\:text-muted-foreground\/75::placeholder{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.placeholder\:text-muted-foreground\/75::placeholder{color:color-mix(in oklab, var(--muted-foreground) 75%, transparent)}}.first\:border-0:first-child{border-style:var(--tw-border-style);border-width:0}.first\:pt-0:first-child{padding-top:0}@media (hover:hover){.hover\:-translate-y-px:hover{--tw-translate-y:-1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\:border-destructive:hover{border-color:var(--destructive)}.hover\:border-glm-blue\/30:hover{border-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.hover\:border-glm-blue\/30:hover{border-color:color-mix(in oklab, var(--glm-blue) 30%, transparent)}}.hover\:border-glm-blue\/35:hover{border-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.hover\:border-glm-blue\/35:hover{border-color:color-mix(in oklab, var(--glm-blue) 35%, transparent)}}.hover\:border-glm-green:hover{border-color:var(--glm-green)}.hover\:bg-destructive:hover,.hover\:bg-destructive\/10:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/10:hover{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.hover\:bg-glm-blue-soft:hover,.hover\:bg-glm-blue-soft\/25:hover{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-glm-blue-soft\/25:hover{background-color:color-mix(in oklab, var(--glm-blue-soft) 25%, transparent)}}.hover\:bg-glm-blue-soft\/60:hover{background-color:var(--glm-blue-soft)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-glm-blue-soft\/60:hover{background-color:color-mix(in oklab, var(--glm-blue-soft) 60%, transparent)}}.hover\:bg-glm-blue\/90:hover{background-color:var(--glm-blue)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-glm-blue\/90:hover{background-color:color-mix(in oklab, var(--glm-blue) 90%, transparent)}}.hover\:bg-glm-green\/5:hover{background-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-glm-green\/5:hover{background-color:color-mix(in oklab, var(--glm-green) 5%, transparent)}}.hover\:bg-glm-green\/90:hover{background-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-glm-green\/90:hover{background-color:color-mix(in oklab, var(--glm-green) 90%, transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/45:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/45:hover{background-color:color-mix(in oklab, var(--muted) 45%, transparent)}}.hover\:text-destructive:hover{color:var(--destructive)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus\:border-glm-green:focus{border-color:var(--glm-green)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-glm-green\/20:focus{--tw-ring-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-glm-green\/20:focus{--tw-ring-color:color-mix(in oklab, var(--glm-green) 20%, transparent)}}.focus\:ring-glm-green\/25:focus{--tw-ring-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-glm-green\/25:focus{--tw-ring-color:color-mix(in oklab, var(--glm-green) 25%, transparent)}}.focus\:ring-glm-green\/30:focus{--tw-ring-color:var(--glm-green)}@supports (color:color-mix(in lab, red, red)){.focus\:ring-glm-green\/30:focus{--tw-ring-color:color-mix(in oklab, var(--glm-green) 30%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:h-9{height:calc(var(--spacing) * 9)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:self-center{align-self:center}.sm\:rounded-2xl{border-radius:calc(var(--radius) + 8px)}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-12{padding:calc(var(--spacing) * 12)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:opacity-0{opacity:0}@media (hover:hover){.sm\:group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}}@media (width>=48rem){.md\:flex{display:flex}.md\:hidden{display:none}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width>=64rem){.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:min-h-\[560px\]{min-height:560px}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[0\.9fr_1\.1fr\]{grid-template-columns:.9fr 1.1fr}.lg\:grid-cols-\[minmax\(0\,1fr\)_auto\]{grid-template-columns:minmax(0,1fr) auto}.lg\:flex-col{flex-direction:column}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:p-16{padding:calc(var(--spacing) * 16)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}:root{--radius:.75rem;--glm-blue:oklch(55% .045 235);--glm-blue-soft:oklch(94% .015 235);--glm-green:oklch(78% .18 138);--glm-green-light:oklch(85% .16 130);--glm-lime:oklch(88% .19 118);--glm-orange:oklch(68% .21 40);--glm-teal:oklch(48% .07 195);--background:oklch(99% .005 230);--foreground:oklch(22% .03 235);--card:oklch(100% 0 0);--card-foreground:oklch(22% .03 235);--popover:oklch(100% 0 0);--popover-foreground:oklch(22% .03 235);--primary:var(--glm-blue);--primary-foreground:oklch(99% 0 0);--secondary:oklch(96% .01 230);--secondary-foreground:var(--glm-blue);--muted:oklch(96% .008 230);--muted-foreground:oklch(50% .02 235);--accent:var(--glm-green);--accent-foreground:oklch(99% 0 0);--destructive:oklch(62% .22 25);--destructive-foreground:oklch(99% 0 0);--border:oklch(90% .012 230);--input:oklch(92% .01 230);--ring:var(--glm-green)}.auth-grid{background-image:linear-gradient(to right, var(--glm-blue) 1px, transparent 1px), linear-gradient(to bottom, var(--glm-blue) 1px, transparent 1px)}@supports (color:color-mix(in lab, red, red)){.auth-grid{background-image:linear-gradient(to right, color-mix(in oklch, var(--glm-blue) 7%, transparent) 1px, transparent 1px), linear-gradient(to bottom, color-mix(in oklch, var(--glm-blue) 7%, transparent) 1px, transparent 1px)}}.auth-grid{background-size:42px 42px;-webkit-mask-image:radial-gradient(circle,#000 15%,#0000 72%);mask-image:radial-gradient(circle,#000 15%,#0000 72%)}html,body,#root{width:100%;height:100%;min-height:0;overflow:hidden}.app-scrollbar-hidden{-ms-overflow-style:none;scrollbar-width:none}.app-scrollbar-hidden::-webkit-scrollbar{width:0;height:0;display:none}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/dist/favicon-192.png b/dist/favicon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b47d07131bb71d199dd1d04f6ffc86e310442b2a GIT binary patch literal 6062 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 L8ERIl+lBuhuTrpU literal 0 HcmV?d00001 diff --git a/dist/favicon-32.png b/dist/favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..1fcf4206bd3f096f5d103cfd63f26361a87a833e GIT binary patch literal 767 zcmVa zC@w^?P!}2eKt!x;@y?Ahlh8jX{wDec79Hprpg#&`^P3OE2ZB(bLitL0B|>n;>!Zr?!Eg{ zM5Z9P1Hl~acM^O-V^8BEnJy2Tm>Xq$d6K{NZc<)T# zfupOE>MNJpS@spk{S=p~Cl>@@A_k$ONDl;>db}g)IPZwiTPi1`PB{$$i%_f4+i(Ef zi&h5!AExAqSeTI6rfdzCVLB$hxMNScC5Yqe-n)m*dq3{3ta)ot09g>A-O6%ey~$g9 zb8fEFW@ZvcU`^|-&0&4`fQ4pNKwAecZn(=V7DQe%b540P|2caQQB2~o^!$l^Pj-!r zzZb^k@5;-2eie}=&HtWmY&05fcYR}pmFnJ4_XwS{`Cp)e&C{Dtwg%UkAx7Icukh@dP4t{@CdEwv+D*qG)-? xw)!r7{>g6u$U`1GYo`~xqe7ujC=~t|&jAw1K96_~Z7u)+002ovPDHLkV1oEmYI^_x literal 0 HcmV?d00001 diff --git a/dist/favicon.ico b/dist/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4de33db469cefca3074595491fb74efc2d4e5e68 GIT binary patch literal 18225 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 literal 0 HcmV?d00001 diff --git a/dist/glm-logo-completo.png b/dist/glm-logo-completo.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee2c1a89542a759f3a8d9304ce19705aa043cb GIT binary patch literal 17295 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 T)BXlLVS~Zb)z4*}Q$iB}^1s}X literal 0 HcmV?d00001 diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000..583c5d8 --- /dev/null +++ b/dist/index.html @@ -0,0 +1,30 @@ + + + + + + Seguimiento de Impuestos GLM + + + + + + + + + + + + + + + +
+ + diff --git a/n8n/CONFIGURACION.md b/n8n/CONFIGURACION.md index 2cbe335..783460d 100644 --- a/n8n/CONFIGURACION.md +++ b/n8n/CONFIGURACION.md @@ -1,37 +1,96 @@ -# Configuración del flujo n8n +# Configuración de n8n — Seguimiento de Impuestos GLM -Después de importar `Seguimiento-de-Impuestos-GLM.json`: +Este proyecto incluye tres workflows independientes para facilitar pruebas y mantenimiento. -1. En el nodo **Gmail - Enviar recordatorio**, selecciona la credencial de Gmail que enviará los correos. -2. Configura estas variables de entorno en n8n: +## 1. Recordatorios por Gmail y Google Chat -```env -SUPABASE_URL=https://dbit.digitalcompass.agency -SUPABASE_SERVICE_ROLE_KEY=REEMPLAZAR -WHATSAPP_BASE_URL=https://wsp.gomezleemarketing.com -WHATSAPP_INSTANCE=botsoporte -WHATSAPP_API_KEY=REEMPLAZAR_CON_LA_APIKEY -GLM_TAX_APP_URL=https://digitalcompass.agency/calendario-impuestos/ -GLM_LOGO_URL=https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png -``` +Archivo: -3. Activa el workflow. El Schedule Trigger está configurado para las 8:00 AM en `America/Santo_Domingo`. -4. Para una prueba manual, usa **Ejecutar manualmente**. Para ejecutar una fecha específica por webhook: +`Seguimiento-de-Impuestos-GLM-Recordatorios-Actualizado.json` + +- Se ejecuta diariamente a las 8:00 a. m. en `America/Santo_Domingo`. +- Consulta `tax_due_reminders` en Supabase. +- Envía correos HTML con identidad visual GLM. +- Envía mensajes por Google Chat. +- Registra cada envío para evitar duplicados. + +Después de importar: + +1. Seleccionar la credencial correcta en `Gmail - Enviar recordatorio`. +2. Confirmar la URL y API key del nodo de Google Chat. +3. Desactivar el workflow anterior antes de activar este, para evitar duplicados. +4. Ejecutar una prueba manual con una fecha controlada. + +## 2. Búsqueda de contactos en BambooHR + +Archivo: + +`Seguimiento-de-Impuestos-GLM-BambooHR-Contactos.json` + +Production URL esperada: + +`https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-bamboohr-contacto` + +Después de importar: + +1. Abrir `Generar reporte completo BambooHR`. +2. Confirmar la credencial `BambooHR GLM Full Access`. +3. Activar el workflow. +4. Probar con: ```json { - "action": "run_now", - "run_date": "2026-07-24" + "action": "search_contact", + "full_name": "Nombre Apellido" } ``` -Las notificaciones del frontend (`contact.created`, `obligation.created`, etc.) sólo confirman cambios y no disparan recordatorios. +El workflow normaliza nombres, tolera tildes y diferencias menores, prioriza coincidencias exactas y devuelve hasta ocho candidatos con país, teléfono, área, cargo, correo y estado. -## Enrutamiento regional por categoría +## 3. Sincronización con Google Calendar -El workflow no requiere cambios para los nuevos contactos de Nómina. La RPC `tax_due_reminders` devuelve automáticamente: +Archivo: -- contactos con área `regional`: todas las obligaciones; -- contactos del país Regional con área `nomina`: Nómina de todos los países; -- contactos del país Regional con área `admin`: Administración de todos los países; -- contactos de un país específico: únicamente la categoría de ese país. +`Seguimiento-de-Impuestos-GLM-Google-Calendar.json` + +Production URL esperada: + +`https://agenteit.digitalcompass.agency/webhook/seguimiento-impuestos-google-calendar` + +Antes de activarlo, ejecutar en Supabase: + +`../supabase/actualizacion_bamboohr_google_calendar.sql` + +Después de importar: + +1. Crear o seleccionar una credencial OAuth2 de Google Calendar. +2. Asignarla en estos nodos: + - `Google Calendar - Crear evento` + - `Google Calendar - Actualizar evento` + - `Google Calendar - Eliminar evento` +3. Verificar que la cuenta conectada sea la cuenta organizadora de los eventos. +4. Activar el workflow. + +Cada obligación crea un evento de 8:00 a. m. a 9:00 a. m., hora de República Dominicana, e invita a los contactos aplicables. Las modificaciones y eliminaciones realizadas antes del primer aviso también se sincronizan. + +## Orden recomendado de despliegue + +1. Ejecutar el parche SQL. +2. Importar y activar BambooHR. +3. Importar y activar Google Calendar. +4. Reemplazar el workflow de recordatorios. +5. Desplegar el frontend actualizado. +6. Probar un contacto y una obligación futura de prueba. + + +## Google Chat — mensajes directos + +El workflow de recordatorios usa una credencial **Google Chat OAuth2 API** con los scopes incluidos por n8n (`chat.spaces`, `chat.messages` y `chat.memberships`). Después de importar: + +1. Habilita Google Chat API en el proyecto de Google Cloud. +2. Crea o selecciona una credencial `Google Chat OAuth2 API` en n8n. +3. Asígnala a `Google Chat - Abrir DM` y `Google Chat - Enviar recordatorio`. +4. Autentica con la cuenta corporativa que enviará los mensajes. +5. Ejecuta una prueba manual antes de activar el Schedule Trigger. + +El flujo crea o reutiliza un mensaje directo con el correo corporativo del contacto, envía el aviso y registra el resultado en `tax_notification_log` con canal `google_chat`. diff --git a/n8n/Seguimiento-de-Impuestos-GLM-BambooHR-Contactos.json b/n8n/Seguimiento-de-Impuestos-GLM-BambooHR-Contactos.json new file mode 100644 index 0000000..81cdf1f --- /dev/null +++ b/n8n/Seguimiento-de-Impuestos-GLM-BambooHR-Contactos.json @@ -0,0 +1,281 @@ +{ + "name": "Seguimiento de Impuestos GLM - Buscar contacto en BambooHR", + "nodes": [ + { + "parameters": { + "httpMethod": "POST", + "path": "seguimiento-impuestos-bamboohr-contacto", + "responseMode": "responseNode", + "options": {} + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2.1, + "position": [ + 320, + 320 + ], + "id": "bd732e00-d574-41f7-a13c-bea5a2fbd589", + "name": "Webhook - Buscar contacto BambooHR", + "webhookId": "seguimiento-impuestos-bamboohr-contacto" + }, + { + "parameters": { + "jsCode": "let body = $json.body ?? $json;\nif (typeof body === 'string') {\n try { body = JSON.parse(body); }\n catch { body = {}; }\n}\nconst fullName = String(body.full_name ?? body.name ?? '').trim().replace(/\\s+/g, ' ');\nconst valid = fullName.split(' ').filter(Boolean).length >= 2 && fullName.length >= 5;\nreturn [{\n json: {\n valid,\n full_name: fullName,\n requested_by: String(body.requested_by ?? '').trim(),\n message: valid ? '' : 'Escribe el nombre y apellido de la persona.',\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 560, + 320 + ], + "id": "ec0dfdd1-8163-427b-af60-560a00011b9d", + "name": "Validar solicitud" + }, + { + "parameters": { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "id": "ac176ddc-1e99-4d7b-b9f9-bea5a4182baa", + "leftValue": "={{ $json.valid }}", + "rightValue": true, + "operator": { + "type": "boolean", + "operation": "true", + "singleValue": true + } + } + ], + "combinator": "and" + }, + "options": {} + }, + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [ + 800, + 320 + ], + "id": "967fe0fe-9857-44c6-a61f-76960961bbab", + "name": "Solicitud válida" + }, + { + "parameters": { + "method": "POST", + "url": "https://glm.bamboohr.com/api/v1/reports/custom?format=JSON&onlyCurrent=false", + "authentication": "genericCredentialType", + "genericAuthType": "httpBasicAuth", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Accept", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": { + "title": "Información completa de empleados BambooHR - Seguimiento de Impuestos", + "fields": [ + "firstName", + "middleName", + "lastName", + "displayName", + "department", + "division", + "location", + "customPosicion-Cliente", + "hireDate", + "originalHireDate", + "status", + "employeeNumber", + "workEmail", + "terminationDate", + "supervisor", + "startDate", + "jobTitle", + "employmentStatus", + "email", + "country", + "city", + "address1" + ] + }, + "options": { + "response": { + "response": { + "responseFormat": "json" + } + }, + "timeout": 300000 + } + }, + "id": "e6a5c8a8-25b4-48dd-96e7-02e68912ca6a", + "name": "Generar reporte completo BambooHR", + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1056, + 240 + ], + "retryOnFail": true, + "maxTries": 3, + "waitBetweenTries": 2000, + "credentials": { + "httpBasicAuth": { + "id": "7VrpNZ2jBLmiJ35q", + "name": "BambooHR GLM Full Access" + } + } + }, + { + "parameters": { + "jsCode": "const query = String($('Validar solicitud').item.json.full_name ?? '').trim();\nconst response = $json ?? {};\nconst employees = Array.isArray(response.employees)\n ? response.employees\n : Array.isArray(response.data)\n ? response.data\n : Array.isArray(response)\n ? response\n : [];\n\nconst normalize = (value) => String(value ?? '')\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\nconst tokens = (value) => normalize(value).split(' ').filter((token) => token.length > 1);\n\nconst levenshtein = (a, b) => {\n if (!a) return b.length;\n if (!b) return a.length;\n const previous = Array.from({ length: b.length + 1 }, (_, index) => index);\n for (let i = 1; i <= a.length; i += 1) {\n let diagonal = previous[0];\n previous[0] = i;\n for (let j = 1; j <= b.length; j += 1) {\n const old = previous[j];\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n previous[j] = Math.min(previous[j] + 1, previous[j - 1] + 1, diagonal + cost);\n diagonal = old;\n }\n }\n return previous[b.length];\n};\n\nconst similarity = (a, b) => {\n const longest = Math.max(a.length, b.length, 1);\n return 1 - levenshtein(a, b) / longest;\n};\n\nconst tokenF1 = (aTokens, bTokens) => {\n if (!aTokens.length || !bTokens.length) return 0;\n const a = new Set(aTokens);\n const b = new Set(bTokens);\n const common = [...a].filter((token) => b.has(token)).length;\n if (!common) return 0;\n const precision = common / b.size;\n const recall = common / a.size;\n return (2 * precision * recall) / (precision + recall);\n};\n\nconst countryAliases = [\n { code: 'DO', name: 'República Dominicana', aliases: ['dominican republic', 'republica dominicana', 'santo domingo', 'dominicana', 'rep dom'] },\n { code: 'PR', name: 'Puerto Rico', aliases: ['puerto rico'] },\n { code: 'JM', name: 'Jamaica', aliases: ['jamaica'] },\n { code: 'TT', name: 'Trinidad y Tobago', aliases: ['trinidad and tobago', 'trinidad & tobago', 'trinidad y tobago', 'trinidad', 'tobago'] },\n { code: 'SV', name: 'El Salvador', aliases: ['el salvador', 'salvador'] },\n { code: 'GT', name: 'Guatemala', aliases: ['guatemala'] },\n { code: 'HN', name: 'Honduras', aliases: ['honduras'] },\n { code: 'CR', name: 'Costa Rica', aliases: ['costa rica'] },\n { code: 'CO', name: 'Colombia', aliases: ['colombia'] },\n { code: 'MX', name: 'México', aliases: ['mexico', 'méxico'] },\n { code: 'NI', name: 'Nicaragua', aliases: ['nicaragua'] },\n { code: 'PA', name: 'Panamá', aliases: ['panama', 'panamá'] },\n];\n\nconst resolveCountry = (employee) => {\n const haystack = normalize([\n employee.country,\n employee.location,\n employee.city,\n employee.division,\n employee.department,\n employee.address1,\n ].filter(Boolean).join(' '));\n\n if (/\\bregional\\b|\\bregion\\b/.test(haystack)) {\n return { code: 'REG', name: 'Regional' };\n }\n\n for (const country of countryAliases) {\n if (country.aliases.some((alias) => haystack.includes(normalize(alias)))) {\n return { code: country.code, name: country.name };\n }\n }\n\n return { code: 'REG', name: 'Regional' };\n};\n\nconst resolveArea = (employee) => {\n const text = normalize([\n employee.department,\n employee.division,\n employee.jobTitle,\n employee['customPosicion-Cliente'],\n ].filter(Boolean).join(' '));\n\n if (/nomina|payroll|compensacion|compensation|beneficios|benefits/.test(text)) return 'nomina';\n if (/administracion|administrativo|administrative|finance|finanzas|contabilidad|accounting|impuesto|tax|tesoreria|treasury|conciliacion|compras|procurement/.test(text)) return 'admin';\n return 'other';\n};\n\n\nconst queryNormalized = normalize(query);\nconst queryTokens = tokens(query);\nconst candidates = [];\n\nfor (const employee of employees) {\n const constructedName = [employee.firstName, employee.middleName, employee.lastName]\n .filter(Boolean)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const displayName = String(employee.displayName ?? '').trim();\n const fullName = displayName || constructedName;\n if (!fullName) continue;\n\n const nameVariants = [...new Set([fullName, constructedName, displayName].filter(Boolean))];\n let score = 0;\n for (const variant of nameVariants) {\n const normalizedVariant = normalize(variant);\n const variantTokens = tokens(variant);\n let current = 0;\n if (normalizedVariant === queryNormalized) current = 100;\n else if (normalizedVariant.startsWith(queryNormalized)) current = 91;\n else if (normalizedVariant.includes(queryNormalized)) current = 85;\n else if (queryNormalized.includes(normalizedVariant)) current = 78;\n\n const f1 = tokenF1(queryTokens, variantTokens);\n const editSimilarity = similarity(queryNormalized, normalizedVariant);\n current = Math.max(current, f1 * 82, editSimilarity * 76);\n if (queryTokens.every((token) => variantTokens.includes(token))) current += 8;\n score = Math.max(score, current);\n }\n\n const status = String(employee.status ?? employee.employmentStatus ?? '').trim();\n if (/active|activo/i.test(status)) score += 3;\n if (score < 45) continue;\n\n const country = resolveCountry(employee);\n const email = String(employee.workEmail || employee.email || '').trim().toLowerCase();\n\n candidates.push({\n id: String(employee.id ?? employee.employeeId ?? employee.employeeNumber ?? fullName),\n employeeNumber: String(employee.employeeNumber ?? ''),\n fullName,\n displayName: displayName || fullName,\n email,\n jobTitle: String(employee.jobTitle ?? employee['customPosicion-Cliente'] ?? '').trim(),\n department: String(employee.department ?? '').trim(),\n division: String(employee.division ?? '').trim(),\n location: String(employee.location ?? employee.city ?? '').trim(),\n countryCode: country.code,\n countryName: country.name,\n area: resolveArea(employee),\n status,\n score: Math.min(100, Math.round(score)),\n matchQuality: score >= 95 ? 'exacta' : score >= 72 ? 'alta' : 'media',\n });\n}\n\nconst unique = new Map();\nfor (const candidate of candidates.sort((a, b) => {\n const activeA = /active|activo/i.test(a.status) ? 1 : 0;\n const activeB = /active|activo/i.test(b.status) ? 1 : 0;\n return b.score - a.score || activeB - activeA || a.fullName.localeCompare(b.fullName);\n})) {\n const key = candidate.id || candidate.email || normalize(candidate.fullName);\n if (!unique.has(key)) unique.set(key, candidate);\n}\n\nreturn [{\n json: {\n ok: true,\n query,\n count: Math.min(unique.size, 8),\n candidates: [...unique.values()].slice(0, 8),\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1312, + 240 + ], + "id": "3edf99bc-ae3c-4473-a6cb-dd83e494f6cc", + "name": "Buscar coincidencias robustas" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ $json }}", + "options": { + "responseCode": 200, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "no-store" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 1568, + 240 + ], + "id": "9fd0868d-5c2c-44db-afcd-9233aaba7c68", + "name": "Responder coincidencias" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: false, message: $json.message, candidates: [] } }}", + "options": { + "responseCode": 400, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 1056, + 432 + ], + "id": "989420f5-bee2-492e-8710-a5bf97280ab8", + "name": "Responder solicitud inválida" + } + ], + "pinData": {}, + "connections": { + "Webhook - Buscar contacto BambooHR": { + "main": [ + [ + { + "node": "Validar solicitud", + "type": "main", + "index": 0 + } + ] + ] + }, + "Validar solicitud": { + "main": [ + [ + { + "node": "Solicitud válida", + "type": "main", + "index": 0 + } + ] + ] + }, + "Solicitud válida": { + "main": [ + [ + { + "node": "Generar reporte completo BambooHR", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "Responder solicitud inválida", + "type": "main", + "index": 0 + } + ] + ] + }, + "Generar reporte completo BambooHR": { + "main": [ + [ + { + "node": "Buscar coincidencias robustas", + "type": "main", + "index": 0 + } + ] + ] + }, + "Buscar coincidencias robustas": { + "main": [ + [ + { + "node": "Responder coincidencias", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "timezone": "America/Santo_Domingo", + "callerPolicy": "workflowsFromSameOwner" + }, + "meta": { + "templateCredsSetupCompleted": true + } +} \ No newline at end of file diff --git a/n8n/Seguimiento-de-Impuestos-GLM-Google-Calendar.json b/n8n/Seguimiento-de-Impuestos-GLM-Google-Calendar.json new file mode 100644 index 0000000..f4711c2 --- /dev/null +++ b/n8n/Seguimiento-de-Impuestos-GLM-Google-Calendar.json @@ -0,0 +1,775 @@ +{ + "name": "Seguimiento de Impuestos GLM - Google Calendar", + "nodes": [ + { + "parameters": { + "httpMethod": "POST", + "path": "seguimiento-impuestos-google-calendar", + "responseMode": "responseNode", + "options": {} + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2.1, + "position": [ + 320, + 480 + ], + "id": "1969add0-835c-459f-906e-ecb0bc43b175", + "name": "Webhook - Google Calendar", + "webhookId": "seguimiento-impuestos-google-calendar" + }, + { + "parameters": { + "jsCode": "let body = $json.body ?? $json;\nif (typeof body === 'string') {\n try { body = JSON.parse(body); }\n catch { body = {}; }\n}\nconst action = String(body.action ?? '').trim().toLowerCase();\nconst payload = body.payload ?? {};\nconst obligationId = String(payload.obligation_id ?? body.obligation_id ?? '').trim();\nconst allowed = ['obligation.created', 'obligation.updated', 'obligation.deleted'];\nreturn [{\n json: {\n valid: allowed.includes(action) && Boolean(obligationId),\n action,\n obligation_id: obligationId,\n message: allowed.includes(action)\n ? (obligationId ? '' : 'Falta obligation_id.')\n : 'Acción no soportada.',\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 560, + 480 + ], + "id": "4257a973-d67c-4972-a140-0acdeaa0367e", + "name": "Preparar solicitud" + }, + { + "parameters": { + "conditions": { + "options": { + "caseSensitive": true, + "leftValue": "", + "typeValidation": "strict", + "version": 2 + }, + "conditions": [ + { + "id": "771f008a-734d-436d-9122-448758a2263a", + "leftValue": "={{ $json.valid }}", + "rightValue": true, + "operator": { + "type": "boolean", + "operation": "true", + "singleValue": true + } + } + ], + "combinator": "and" + }, + "options": {} + }, + "type": "n8n-nodes-base.if", + "typeVersion": 2.2, + "position": [ + 800, + 480 + ], + "id": "7714ac21-6eed-4eaa-aa57-1f145ace0b13", + "name": "Solicitud válida" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_google_calendar_payload", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $json.obligation_id } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1056, + 384 + ], + "id": "60720896-3eef-4a6f-9c8f-406bc777137b", + "name": "Supabase - Obtener obligación y asistentes" + }, + { + "parameters": { + "jsCode": "const source = $('Preparar solicitud').item.json;\nconst value = $json;\nconst row = Array.isArray(value) ? value[0] : Array.isArray(value?.data) ? value.data[0] : value;\nif (!row?.obligation_id) {\n return [{ json: { ...source, operation: 'noop', reason: 'No se encontró la obligación.' } }];\n}\n\nconst attendees = Array.isArray(row.attendees)\n ? [...new Set(row.attendees.map((email) => String(email ?? '').trim().toLowerCase()).filter(Boolean))]\n : [];\nconst start = `${row.due_date}T08:00:00-04:00`;\nconst end = `${row.due_date}T09:00:00-04:00`;\nconst categoryLabel = row.category === 'nomina' ? 'Nómina' : 'Administración';\nconst summary = `Impuestos · ${row.country_name} · ${row.description}`;\nconst description = [\n 'Seguimiento de Impuestos GLM',\n '',\n `País: ${row.country_name}`,\n `Categoría: ${categoryLabel}`,\n `Fecha límite: ${row.due_date}`,\n `Obligación: ${row.description}`,\n '',\n 'Abrir aplicación: https://home.digitalcompass.agency/',\n].join('\\n');\nconst calendarBody = {\n summary,\n description,\n start: { dateTime: start, timeZone: 'America/Santo_Domingo' },\n end: { dateTime: end, timeZone: 'America/Santo_Domingo' },\n attendees: attendees.map((email) => ({ email })),\n reminders: {\n useDefault: false,\n overrides: [\n { method: 'email', minutes: 0 },\n { method: 'popup', minutes: 0 },\n ],\n },\n extendedProperties: {\n private: {\n glmTaxObligationId: row.obligation_id,\n glmTaxCountryCode: row.country_code,\n glmTaxCategory: row.category,\n },\n },\n};\n\nlet operation = 'create';\nif (source.action === 'obligation.deleted' || row.active === false) {\n operation = row.google_event_id ? 'delete' : 'noop';\n} else if (row.google_event_id) {\n operation = 'update';\n}\n\nreturn [{\n json: {\n ...source,\n ...row,\n attendees,\n start,\n end,\n summary,\n calendar_description: description,\n calendar_body: calendarBody,\n calendar_id: row.calendar_id || 'primary',\n operation,\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1312, + 384 + ], + "id": "437c0861-d237-43a9-acb6-a3cecad1c748", + "name": "Preparar payload Calendar" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.operation === 'create');" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1568, + 256 + ], + "id": "21075755-7ae2-4f5a-ae0e-63e5e62b9e78", + "name": "Preparar crear" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.operation === 'update');" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1568, + 416 + ], + "id": "b20f873b-1b6d-4fde-8832-1dae87674f60", + "name": "Preparar actualizar" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.operation === 'delete');" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1568, + 576 + ], + "id": "21a0f3e2-c6e6-40e8-b013-30ba4c739a44", + "name": "Preparar eliminar" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.operation === 'noop');" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1568, + 736 + ], + "id": "9efc968a-6ba7-41bd-8bdb-f391a6b482f2", + "name": "Preparar sin acción" + }, + { + "parameters": { + "method": "POST", + "url": "https://www.googleapis.com/calendar/v3/calendars/primary/events?sendUpdates=all", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleCalendarOAuth2Api", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json.calendar_body }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1824, + 256 + ], + "id": "b4a40589-9002-4479-8576-7c01d746fb65", + "name": "Google Calendar - Crear evento", + "credentials": { + "googleCalendarOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CALENDAR", + "name": "Google Calendar GLM" + } + } + }, + { + "parameters": { + "method": "PATCH", + "url": "={{ 'https://www.googleapis.com/calendar/v3/calendars/primary/events/' + encodeURIComponent($json.google_event_id) + '?sendUpdates=all' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleCalendarOAuth2Api", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ $json.calendar_body }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1824, + 416 + ], + "id": "443971f0-bb68-4051-adbc-81f46e7cf785", + "name": "Google Calendar - Actualizar evento", + "credentials": { + "googleCalendarOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CALENDAR", + "name": "Google Calendar GLM" + } + } + }, + { + "parameters": { + "method": "DELETE", + "url": "={{ 'https://www.googleapis.com/calendar/v3/calendars/primary/events/' + encodeURIComponent($json.google_event_id) + '?sendUpdates=all' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleCalendarOAuth2Api", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1824, + 576 + ], + "id": "9658c53c-ebeb-4c28-94cd-e56011a6175e", + "name": "Google Calendar - Eliminar evento", + "credentials": { + "googleCalendarOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CALENDAR", + "name": "Google Calendar GLM" + } + } + }, + { + "parameters": { + "jsCode": "const source = $('Preparar crear').item.json; return [{ json: { ...source, google_event_id: String($json.id ?? ''), google_response: $json, sync_action: 'create', sync_status: 'active' } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2080, + 256 + ], + "id": "a807b37a-f61c-46de-87f8-74a436a92e00", + "name": "Preparar registro creado" + }, + { + "parameters": { + "jsCode": "const source = $('Preparar actualizar').item.json; return [{ json: { ...source, google_event_id: source.google_event_id, google_response: $json, sync_action: 'update', sync_status: 'active' } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2080, + 416 + ], + "id": "497396c0-d40e-4613-aeb4-baf52ce8f447", + "name": "Preparar registro actualizado" + }, + { + "parameters": { + "jsCode": "const source = $('Preparar eliminar').item.json; return [{ json: { ...source, google_event_id: source.google_event_id, google_response: $json ?? {}, sync_action: 'delete', sync_status: 'deleted' } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2080, + 576 + ], + "id": "034ad2a5-526e-4d4c-9a56-db9e83bde071", + "name": "Preparar registro eliminado" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_google_calendar_sync", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $('Preparar registro creado').item.json.obligation_id, p_google_event_id: $('Preparar registro creado').item.json.google_event_id, p_calendar_id: 'primary', p_attendees: $('Preparar registro creado').item.json.attendees, p_status: $('Preparar registro creado').item.json.sync_status, p_last_action: $('Preparar registro creado').item.json.sync_action, p_provider_response: $('Preparar registro creado').item.json.google_response } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2336, + 256 + ], + "id": "5072ebec-03ee-49e7-b050-6cc93b538f7b", + "name": "Supabase - Registrar creación Calendar" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_google_calendar_sync", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $('Preparar registro actualizado').item.json.obligation_id, p_google_event_id: $('Preparar registro actualizado').item.json.google_event_id, p_calendar_id: 'primary', p_attendees: $('Preparar registro actualizado').item.json.attendees, p_status: $('Preparar registro actualizado').item.json.sync_status, p_last_action: $('Preparar registro actualizado').item.json.sync_action, p_provider_response: $('Preparar registro actualizado').item.json.google_response } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2336, + 416 + ], + "id": "774d2dab-bb85-44e5-aeaf-e4dfe6954931", + "name": "Supabase - Registrar actualización Calendar" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_google_calendar_sync", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $('Preparar registro eliminado').item.json.obligation_id, p_google_event_id: $('Preparar registro eliminado').item.json.google_event_id, p_calendar_id: 'primary', p_attendees: $('Preparar registro eliminado').item.json.attendees, p_status: $('Preparar registro eliminado').item.json.sync_status, p_last_action: $('Preparar registro eliminado').item.json.sync_action, p_provider_response: $('Preparar registro eliminado').item.json.google_response } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2336, + 576 + ], + "id": "67986a91-dbb4-4ab2-b33e-e003ac8895df", + "name": "Supabase - Registrar eliminación Calendar" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: true, message: 'Evento creado en Google Calendar.' } }}", + "options": { + "responseCode": 200, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "no-store" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 2592, + 256 + ], + "id": "932c9da0-2a24-4eb3-ac40-3ccaf5b1895a", + "name": "Responder creación" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: true, message: 'Evento actualizado en Google Calendar.' } }}", + "options": { + "responseCode": 200, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "no-store" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 2592, + 416 + ], + "id": "bbeb54b6-30c9-43f8-9c54-7564a1684d3b", + "name": "Responder actualización" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: true, message: 'Evento eliminado de Google Calendar.' } }}", + "options": { + "responseCode": 200, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "name": "Cache-Control", + "value": "no-store" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 2592, + 576 + ], + "id": "51bee51d-e61a-473a-a200-a447b295a59e", + "name": "Responder eliminación" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: true, message: $json.reason || 'No había cambios que sincronizar.' } }}", + "options": { + "responseCode": 200, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 1824, + 736 + ], + "id": "f3b38547-3de2-4499-94c8-7a331cae5c9a", + "name": "Responder sin acción" + }, + { + "parameters": { + "respondWith": "json", + "responseBody": "={{ { ok: false, message: $json.message } }}", + "options": { + "responseCode": 400, + "responseHeaders": { + "entries": [ + { + "name": "Access-Control-Allow-Origin", + "value": "*" + } + ] + } + } + }, + "type": "n8n-nodes-base.respondToWebhook", + "typeVersion": 1.4, + "position": [ + 1056, + 656 + ], + "id": "558b4170-3ae9-471d-a506-5d404ccde75e", + "name": "Responder solicitud inválida" + } + ], + "pinData": {}, + "connections": { + "Webhook - Google Calendar": { + "main": [ + [ + { + "node": "Preparar solicitud", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar solicitud": { + "main": [ + [ + { + "node": "Solicitud válida", + "type": "main", + "index": 0 + } + ] + ] + }, + "Solicitud válida": { + "main": [ + [ + { + "node": "Supabase - Obtener obligación y asistentes", + "type": "main", + "index": 0 + } + ], + [ + { + "node": "Responder solicitud inválida", + "type": "main", + "index": 0 + } + ] + ] + }, + "Supabase - Obtener obligación y asistentes": { + "main": [ + [ + { + "node": "Preparar payload Calendar", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar payload Calendar": { + "main": [ + [ + { + "node": "Preparar crear", + "type": "main", + "index": 0 + }, + { + "node": "Preparar actualizar", + "type": "main", + "index": 0 + }, + { + "node": "Preparar eliminar", + "type": "main", + "index": 0 + }, + { + "node": "Preparar sin acción", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar crear": { + "main": [ + [ + { + "node": "Google Calendar - Crear evento", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Calendar - Crear evento": { + "main": [ + [ + { + "node": "Preparar registro creado", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar registro creado": { + "main": [ + [ + { + "node": "Supabase - Registrar creación Calendar", + "type": "main", + "index": 0 + } + ] + ] + }, + "Supabase - Registrar creación Calendar": { + "main": [ + [ + { + "node": "Responder creación", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar actualizar": { + "main": [ + [ + { + "node": "Google Calendar - Actualizar evento", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Calendar - Actualizar evento": { + "main": [ + [ + { + "node": "Preparar registro actualizado", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar registro actualizado": { + "main": [ + [ + { + "node": "Supabase - Registrar actualización Calendar", + "type": "main", + "index": 0 + } + ] + ] + }, + "Supabase - Registrar actualización Calendar": { + "main": [ + [ + { + "node": "Responder actualización", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar eliminar": { + "main": [ + [ + { + "node": "Google Calendar - Eliminar evento", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Calendar - Eliminar evento": { + "main": [ + [ + { + "node": "Preparar registro eliminado", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar registro eliminado": { + "main": [ + [ + { + "node": "Supabase - Registrar eliminación Calendar", + "type": "main", + "index": 0 + } + ] + ] + }, + "Supabase - Registrar eliminación Calendar": { + "main": [ + [ + { + "node": "Responder eliminación", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar sin acción": { + "main": [ + [ + { + "node": "Responder sin acción", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "timezone": "America/Santo_Domingo", + "callerPolicy": "workflowsFromSameOwner" + }, + "meta": { + "templateCredsSetupCompleted": true + } +} diff --git a/n8n/Seguimiento-de-Impuestos-GLM-Recordatorios-Actualizado.json b/n8n/Seguimiento-de-Impuestos-GLM-Recordatorios-Actualizado.json new file mode 100644 index 0000000..1fbcf91 --- /dev/null +++ b/n8n/Seguimiento-de-Impuestos-GLM-Recordatorios-Actualizado.json @@ -0,0 +1,586 @@ +{ + "name": "Seguimiento de Impuestos GLM - Recordatorios Gmail y Google Chat", + "nodes": [ + { + "parameters": { + "rule": { + "interval": [ + { + "field": "cronExpression", + "expression": "0 8 * * *" + } + ] + } + }, + "type": "n8n-nodes-base.scheduleTrigger", + "typeVersion": 1.2, + "position": [ + 1008, + 1472 + ], + "id": "28b8d854-b043-4a35-b047-4db8f919fb6f", + "name": "Diario 8:00 AM" + }, + { + "parameters": {}, + "type": "n8n-nodes-base.manualTrigger", + "typeVersion": 1, + "position": [ + 1008, + 1632 + ], + "id": "be168026-4130-4486-8e9a-1766b3e219d4", + "name": "Ejecutar manualmente" + }, + { + "parameters": { + "httpMethod": "POST", + "path": "seguimiento-impuestos", + "options": {} + }, + "type": "n8n-nodes-base.webhook", + "typeVersion": 2.1, + "position": [ + 1008, + 1824 + ], + "id": "07d8b63b-e322-492a-8241-ef9ccb273a31", + "name": "Webhook seguimiento-impuestos", + "webhookId": "seguimiento-impuestos-glm" + }, + { + "parameters": { + "jsCode": "function dateInTimeZone(timeZone) {\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n }).formatToParts(new Date());\n const values = Object.fromEntries(parts.map((part) => [part.type, part.value]));\n return `${values.year}-${values.month}-${values.day}`;\n}\n\nconst input = $json ?? {};\nconst runDate = input.run_date || dateInTimeZone('America/Santo_Domingo');\n\nreturn [{\n json: {\n run_date: runDate,\n source: input.source || 'schedule',\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1248, + 1552 + ], + "id": "43f9136f-ecb0-4145-978a-a212a532f271", + "name": "Preparar ejecución" + }, + { + "parameters": { + "jsCode": "const body = $json.body ?? $json;\nconst action = String(body.action ?? '').trim().toLowerCase();\n\nif (!['run_now', 'run_reminders', 'ejecutar_recordatorios'].includes(action)) {\n return [];\n}\n\nreturn [{\n json: {\n run_date: body.run_date || body.date || '',\n source: 'webhook',\n },\n}];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1248, + 1824 + ], + "id": "c640bba7-a14c-4d8f-a204-d73dbb43f77e", + "name": "Validar ejecución por Webhook" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_due_reminders", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_run_date: $json.run_date } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 1504, + 1632 + ], + "id": "ff4bb447-340e-405a-8db7-a6ef0e7f8fe3", + "name": "Supabase - Recordatorios pendientes" + }, + { + "parameters": { + "jsCode": "const htmlEscape = (value) => String(value ?? '')\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst rows = [];\nfor (const item of $input.all()) {\n const value = item.json;\n if (Array.isArray(value)) rows.push(...value);\n else if (Array.isArray(value?.data)) rows.push(...value.data);\n else if (Array.isArray(value?.body)) rows.push(...value.body);\n else if (value?.obligation_id) rows.push(value);\n}\n\nconst logoUrl = 'https://home.digitalcompass.agency/glm-logo-completo.png';\nconst appUrl = 'https://home.digitalcompass.agency/';\n\nconst formatDate = (iso) => {\n const [year, month, day] = String(iso).split('-').map(Number);\n return new Intl.DateTimeFormat('es-DO', {\n timeZone: 'UTC',\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(new Date(Date.UTC(year, month - 1, day)));\n};\n\nreturn rows.map((row) => {\n const dueDate = formatDate(row.due_date);\n const isSameDay = row.alert_type === 'same_day';\n const reminderLabel = isSameDay ? 'Vence hoy' : 'Recordatorio previo';\n const categoryLabel = row.category === 'nomina' ? 'Nómina' : 'Administración';\n const firstName = String(row.contact_name ?? '').trim().split(/\\s+/)[0] || 'equipo';\n const subject = `${isSameDay ? 'Vence hoy' : 'Recordatorio'} · ${row.country_name} · ${row.description}`;\n\n const emailHtml = `\n\n\n \n \n \n
\n \n \n \n \n \n
\"GomezLee
 
\n
${htmlEscape(reminderLabel)}
\n

Seguimiento de Impuestos GLM

\n

Hola ${htmlEscape(firstName)}, este es el recordatorio correspondiente a la siguiente obligación tributaria:

\n \n \n \n \n \n
País${htmlEscape(row.country_name)}
Categoría${htmlEscape(categoryLabel)}
Fecha límite${htmlEscape(dueDate)}
Obligación${htmlEscape(row.description)}
\n

Este aviso forma parte del seguimiento automático: miércoles anterior y fecha límite, incluidos sábados y domingos.

\n \n
GOMEZLEE MARKETING  |  Seguimiento de Impuestos GLM  |  Uso interno
\n
\n \n`.trim();\n\n const googleChatText = [\n `*${reminderLabel.toUpperCase()} · SEGUIMIENTO DE IMPUESTOS GLM*`,\n '',\n `Hola ${firstName},`,\n '',\n `*País:* ${row.country_name}`,\n `*Categoría:* ${categoryLabel}`,\n `*Fecha límite:* ${dueDate}`,\n `*Obligación:* ${row.description}`,\n '',\n 'Seguimiento automático: miércoles anterior y fecha límite, incluidos sábados y domingos.',\n '',\n `Abrir calendario: ${appUrl}`,\n ].join('\\n');\n\n return {\n json: {\n ...row,\n email_subject: subject,\n email_html: emailHtml,\n google_chat_text: googleChatText,\n },\n };\n});" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 1760, + 1632 + ], + "id": "22e34460-2700-4d7d-ba0a-c4d735120f19", + "name": "Construir mensajes GLM" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.email_enabled === true && String(item.json.contact_email ?? '').trim());" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2032, + 1488 + ], + "id": "3841ce9e-3957-43e9-b280-34414e0b9bd9", + "name": "Preparar correos" + }, + { + "parameters": { + "sendTo": "={{ $json.contact_email }}", + "subject": "={{ $json.email_subject }}", + "message": "={{ $json.email_html }}", + "options": { + "appendAttribution": false + }, + "emailType": "html" + }, + "type": "n8n-nodes-base.gmail", + "typeVersion": 2.1, + "position": [ + 2288, + 1488 + ], + "id": "a4e97d3e-7181-48b6-815a-8c2e97bdff85", + "name": "Gmail - Enviar recordatorio", + "webhookId": "16bfebbd-f4e3-4b1e-aba2-028fecf98da1", + "credentials": { + "gmailOAuth2": { + "id": "UDcO1FLJqA453V2D", + "name": "Gmail account 3" + } + } + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_notification", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $('Preparar correos').item.json.obligation_id, p_contact_id: $('Preparar correos').item.json.contact_id, p_alert_date: $('Preparar correos').item.json.alert_date, p_channel: 'email', p_status: 'sent', p_provider_response: $json } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2544, + 1488 + ], + "id": "5059ca4d-7766-415f-8f38-ed217ed382e8", + "name": "Supabase - Registrar correo" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.google_chat_enabled === true && String(item.json.contact_email ?? '').trim());" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2032, + 1760 + ], + "id": "37385e9d-9d97-4622-99a0-c10fe09a73d0", + "name": "Preparar Google Chat" + }, + { + "parameters": { + "method": "POST", + "url": "https://chat.googleapis.com/v1/spaces:setup", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleChatOAuth2Api", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { space: { spaceType: 'DIRECT_MESSAGE', singleUserBotDm: false }, memberships: [ { member: { name: 'users/' + $json.contact_email, type: 'HUMAN' } } ] } }}", + "options": { + "timeout": 30000 + } + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 2288, + 1760 + ], + "id": "588061f1-c2b8-4747-82ff-7532ca60bf48", + "name": "Google Chat - Abrir DM", + "retryOnFail": true, + "maxTries": 3, + "waitBetweenTries": 1500, + "onError": "continueRegularOutput", + "credentials": { + "googleChatOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CHAT", + "name": "Google Chat GLM" + } + } + }, + { + "parameters": { + "jsCode": "const source = $('Preparar Google Chat').item.json;\nconst spaceName = String($json.name ?? '').trim();\nreturn [{ json: { ...source, chat_space_name: spaceName, chat_setup_ok: Boolean(spaceName), google_chat_status: spaceName ? 'pending' : 'failed', google_chat_provider_response: $json } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2544, + 1760 + ], + "id": "8c8a7a41-b131-4b27-b936-aa6a0896f70c", + "name": "Evaluar DM Google Chat" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.chat_setup_ok === true);" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2800, + 1680 + ], + "id": "dd09b31d-435e-404f-823d-5e9cf1de9dc9", + "name": "Preparar envío Google Chat" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.chat_setup_ok !== true);" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2800, + 1904 + ], + "id": "31bcae02-e1d8-4c66-b2c3-cf1b16f46d2d", + "name": "Preparar fallo DM Google Chat" + }, + { + "parameters": { + "method": "POST", + "url": "={{ 'https://chat.googleapis.com/v1/' + $json.chat_space_name + '/messages' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleChatOAuth2Api", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { text: $json.google_chat_text, createMessageNotificationOptions: { notificationType: 'NOTIFICATION_TYPE_FORCE_NOTIFY' } } }}", + "options": { + "timeout": 30000 + } + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 3056, + 1680 + ], + "id": "ef1c2ada-440a-4f30-a66f-dc12ca9eb1e6", + "name": "Google Chat - Enviar recordatorio", + "retryOnFail": true, + "maxTries": 3, + "waitBetweenTries": 1500, + "onError": "continueRegularOutput", + "credentials": { + "googleChatOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CHAT", + "name": "Google Chat GLM" + } + } + }, + { + "parameters": { + "jsCode": "const source = $('Preparar envío Google Chat').item.json;\nconst sent = Boolean($json.name) && !$json.error;\nreturn [{ json: { ...source, google_chat_status: sent ? 'sent' : 'failed', google_chat_provider_response: $json } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 3312, + 1680 + ], + "id": "130517e7-25f6-42c0-90ba-e1a319626a54", + "name": "Evaluar envío Google Chat" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_notification", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "apikey", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Authorization", + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" + }, + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { p_obligation_id: $json.obligation_id, p_contact_id: $json.contact_id, p_alert_date: $json.alert_date, p_channel: 'google_chat', p_status: $json.google_chat_status, p_provider_response: $json.google_chat_provider_response } }}", + "options": {} + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 3568, + 1760 + ], + "id": "8bc5e6dd-3c21-41e8-bfdc-d44155618460", + "name": "Supabase - Registrar Google Chat" + } + ], + "pinData": {}, + "connections": { + "Diario 8:00 AM": { + "main": [ + [ + { + "node": "Preparar ejecución", + "type": "main", + "index": 0 + } + ] + ] + }, + "Ejecutar manualmente": { + "main": [ + [ + { + "node": "Preparar ejecución", + "type": "main", + "index": 0 + } + ] + ] + }, + "Webhook seguimiento-impuestos": { + "main": [ + [ + { + "node": "Validar ejecución por Webhook", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar ejecución": { + "main": [ + [ + { + "node": "Supabase - Recordatorios pendientes", + "type": "main", + "index": 0 + } + ] + ] + }, + "Validar ejecución por Webhook": { + "main": [ + [ + { + "node": "Preparar ejecución", + "type": "main", + "index": 0 + } + ] + ] + }, + "Supabase - Recordatorios pendientes": { + "main": [ + [ + { + "node": "Construir mensajes GLM", + "type": "main", + "index": 0 + } + ] + ] + }, + "Construir mensajes GLM": { + "main": [ + [ + { + "node": "Preparar correos", + "type": "main", + "index": 0 + }, + { + "node": "Preparar Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar correos": { + "main": [ + [ + { + "node": "Gmail - Enviar recordatorio", + "type": "main", + "index": 0 + } + ] + ] + }, + "Gmail - Enviar recordatorio": { + "main": [ + [ + { + "node": "Supabase - Registrar correo", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar Google Chat": { + "main": [ + [ + { + "node": "Google Chat - Abrir DM", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Chat - Abrir DM": { + "main": [ + [ + { + "node": "Evaluar DM Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Evaluar DM Google Chat": { + "main": [ + [ + { + "node": "Preparar envío Google Chat", + "type": "main", + "index": 0 + }, + { + "node": "Preparar fallo DM Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar envío Google Chat": { + "main": [ + [ + { + "node": "Google Chat - Enviar recordatorio", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Chat - Enviar recordatorio": { + "main": [ + [ + { + "node": "Evaluar envío Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Evaluar envío Google Chat": { + "main": [ + [ + { + "node": "Supabase - Registrar Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar fallo DM Google Chat": { + "main": [ + [ + { + "node": "Supabase - Registrar Google Chat", + "type": "main", + "index": 0 + } + ] + ] + } + }, + "active": false, + "settings": { + "executionOrder": "v1", + "binaryMode": "separate", + "availableInMCP": true, + "timeSavedMode": "fixed", + "errorWorkflow": "puF4LUczoSz3hcek", + "timezone": "America/Santo_Domingo", + "callerPolicy": "workflowsFromSameOwner" + }, + "meta": { + "templateCredsSetupCompleted": true, + "instanceId": "b4b77b17af092830e794eef639ce2f6d7daccf7eddc075060b03b3b6545aac70" + }, + "tags": [] +} \ No newline at end of file diff --git a/n8n/Seguimiento-de-Impuestos-GLM.json b/n8n/Seguimiento-de-Impuestos-GLM.json index fa8409e..1fbcf91 100644 --- a/n8n/Seguimiento-de-Impuestos-GLM.json +++ b/n8n/Seguimiento-de-Impuestos-GLM.json @@ -1,5 +1,5 @@ { - "name": "Seguimiento de Impuestos GLM - Recordatorios", + "name": "Seguimiento de Impuestos GLM - Recordatorios Gmail y Google Chat", "nodes": [ { "parameters": { @@ -15,10 +15,10 @@ "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.2, "position": [ - -1180, - -120 + 1008, + 1472 ], - "id": "7beab0d6-ad06-4cb3-bcbe-e362296ed74e", + "id": "28b8d854-b043-4a35-b047-4db8f919fb6f", "name": "Diario 8:00 AM" }, { @@ -26,26 +26,25 @@ "type": "n8n-nodes-base.manualTrigger", "typeVersion": 1, "position": [ - -1180, - 40 + 1008, + 1632 ], - "id": "2d00fd7e-10ad-4b79-9b53-25d998e6dda0", + "id": "be168026-4130-4486-8e9a-1766b3e219d4", "name": "Ejecutar manualmente" }, { "parameters": { "httpMethod": "POST", "path": "seguimiento-impuestos", - "responseMode": "onReceived", "options": {} }, "type": "n8n-nodes-base.webhook", "typeVersion": 2.1, "position": [ - -1180, - 240 + 1008, + 1824 ], - "id": "48598cee-8800-4d4f-9bb4-5b10cb93b9f4", + "id": "07d8b63b-e322-492a-8241-ef9ccb273a31", "name": "Webhook seguimiento-impuestos", "webhookId": "seguimiento-impuestos-glm" }, @@ -56,10 +55,10 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - -940, - -40 + 1248, + 1552 ], - "id": "386d5276-17fa-410e-9750-887ebab51e67", + "id": "43f9136f-ecb0-4145-978a-a212a532f271", "name": "Preparar ejecución" }, { @@ -69,26 +68,26 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - -940, - 240 + 1248, + 1824 ], - "id": "d1c460af-3103-4a11-ae9f-508525b34f6e", + "id": "c640bba7-a14c-4d8f-a204-d73dbb43f77e", "name": "Validar ejecución por Webhook" }, { "parameters": { "method": "POST", - "url": "={{ ($env.SUPABASE_URL || 'https://dbit.digitalcompass.agency').replace(/\\/$/, '') + '/rest/v1/rpc/tax_due_reminders' }}", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_due_reminders", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "apikey", - "value": "={{ $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Authorization", - "value": "={{ 'Bearer ' + $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Content-Type", @@ -104,23 +103,23 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - -680, - 40 + 1504, + 1632 ], - "id": "d8682d72-3681-43f1-83aa-521b54572a95", + "id": "ff4bb447-340e-405a-8db7-a6ef0e7f8fe3", "name": "Supabase - Recordatorios pendientes" }, { "parameters": { - "jsCode": "const htmlEscape = (value) => String(value ?? '')\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst rows = [];\nfor (const item of $input.all()) {\n const value = item.json;\n if (Array.isArray(value)) rows.push(...value);\n else if (Array.isArray(value?.data)) rows.push(...value.data);\n else if (Array.isArray(value?.body)) rows.push(...value.body);\n else if (value?.obligation_id) rows.push(value);\n}\n\nconst logoUrl = $env.GLM_LOGO_URL || 'https://dbit.digitalcompass.agency/storage/v1/object/public/public-assets/GLM.png';\nconst appUrl = $env.GLM_TAX_APP_URL || 'https://digitalcompass.agency/calendario-impuestos/';\n\nconst formatDate = (iso) => {\n const [year, month, day] = String(iso).split('-').map(Number);\n return new Intl.DateTimeFormat('es-DO', {\n timeZone: 'UTC',\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(new Date(Date.UTC(year, month - 1, day)));\n};\n\nconst normalizeWhatsApp = (value) => {\n let raw = String(value ?? '').trim();\n if (!raw) return '';\n raw = raw.replace('@c.us', '@s.whatsapp.net');\n if (raw.includes('@g.us')) return raw;\n if (raw.includes('@s.whatsapp.net')) {\n const number = raw.replace('@s.whatsapp.net', '').replace(/\\D/g, '');\n return number.startsWith('120363') ? `${number}@g.us` : `${number}@s.whatsapp.net`;\n }\n const number = raw.replace(/\\D/g, '');\n return number.startsWith('120363') ? `${number}@g.us` : `${number}@s.whatsapp.net`;\n};\n\nreturn rows.map((row) => {\n const dueDate = formatDate(row.due_date);\n const isSameDay = row.alert_type === 'same_day';\n const reminderLabel = isSameDay ? 'Vence hoy' : 'Recordatorio previo';\n const categoryLabel = row.category === 'nomina' ? 'Nómina' : 'Administración';\n const firstName = String(row.contact_name ?? '').trim().split(/\\s+/)[0] || 'equipo';\n const subject = `${isSameDay ? 'Vence hoy' : 'Recordatorio'} · ${row.country_name} · ${row.description}`;\n\n const emailHtml = `\n\n\n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n
\n \"GomezLee\n
 
\n
${htmlEscape(reminderLabel)}
\n

Seguimiento de Impuestos

\n

Hola ${htmlEscape(firstName)}, este es el recordatorio correspondiente a la siguiente obligación tributaria:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
País${htmlEscape(row.country_name)}
Categoría${htmlEscape(categoryLabel)}
Fecha límite${htmlEscape(dueDate)}
Obligación${htmlEscape(row.description)}
\n\n

Regla de seguimiento: miércoles anterior y fecha límite, incluidos sábados y domingos.

\n \n
\n GOMEZLEE MARKETING  |  Seguimiento de Impuestos\n
\n
\n \n`.trim();\n\n const whatsappText = [\n `*${reminderLabel.toUpperCase()} · SEGUIMIENTO DE IMPUESTOS*`,\n '',\n `Hola ${firstName},`,\n '',\n `*País:* ${row.country_name}`,\n `*Categoría:* ${categoryLabel}`,\n `*Fecha límite:* ${dueDate}`,\n `*Obligación:* ${row.description}`,\n '',\n 'Regla: miércoles anterior y fecha límite, incluidos sábados y domingos.',\n '',\n `Calendario: ${appUrl}`,\n ].join('\\n');\n\n return {\n json: {\n ...row,\n email_subject: subject,\n email_html: emailHtml,\n whatsapp_to: normalizeWhatsApp(row.contact_whatsapp),\n whatsapp_text: whatsappText,\n },\n };\n});" + "jsCode": "const htmlEscape = (value) => String(value ?? '')\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n\nconst rows = [];\nfor (const item of $input.all()) {\n const value = item.json;\n if (Array.isArray(value)) rows.push(...value);\n else if (Array.isArray(value?.data)) rows.push(...value.data);\n else if (Array.isArray(value?.body)) rows.push(...value.body);\n else if (value?.obligation_id) rows.push(value);\n}\n\nconst logoUrl = 'https://home.digitalcompass.agency/glm-logo-completo.png';\nconst appUrl = 'https://home.digitalcompass.agency/';\n\nconst formatDate = (iso) => {\n const [year, month, day] = String(iso).split('-').map(Number);\n return new Intl.DateTimeFormat('es-DO', {\n timeZone: 'UTC',\n day: '2-digit',\n month: 'long',\n year: 'numeric',\n }).format(new Date(Date.UTC(year, month - 1, day)));\n};\n\nreturn rows.map((row) => {\n const dueDate = formatDate(row.due_date);\n const isSameDay = row.alert_type === 'same_day';\n const reminderLabel = isSameDay ? 'Vence hoy' : 'Recordatorio previo';\n const categoryLabel = row.category === 'nomina' ? 'Nómina' : 'Administración';\n const firstName = String(row.contact_name ?? '').trim().split(/\\s+/)[0] || 'equipo';\n const subject = `${isSameDay ? 'Vence hoy' : 'Recordatorio'} · ${row.country_name} · ${row.description}`;\n\n const emailHtml = `\n\n\n \n \n \n
\n \n \n \n \n \n
\"GomezLee
 
\n
${htmlEscape(reminderLabel)}
\n

Seguimiento de Impuestos GLM

\n

Hola ${htmlEscape(firstName)}, este es el recordatorio correspondiente a la siguiente obligación tributaria:

\n \n \n \n \n \n
País${htmlEscape(row.country_name)}
Categoría${htmlEscape(categoryLabel)}
Fecha límite${htmlEscape(dueDate)}
Obligación${htmlEscape(row.description)}
\n

Este aviso forma parte del seguimiento automático: miércoles anterior y fecha límite, incluidos sábados y domingos.

\n \n
GOMEZLEE MARKETING  |  Seguimiento de Impuestos GLM  |  Uso interno
\n
\n \n`.trim();\n\n const googleChatText = [\n `*${reminderLabel.toUpperCase()} · SEGUIMIENTO DE IMPUESTOS GLM*`,\n '',\n `Hola ${firstName},`,\n '',\n `*País:* ${row.country_name}`,\n `*Categoría:* ${categoryLabel}`,\n `*Fecha límite:* ${dueDate}`,\n `*Obligación:* ${row.description}`,\n '',\n 'Seguimiento automático: miércoles anterior y fecha límite, incluidos sábados y domingos.',\n '',\n `Abrir calendario: ${appUrl}`,\n ].join('\\n');\n\n return {\n json: {\n ...row,\n email_subject: subject,\n email_html: emailHtml,\n google_chat_text: googleChatText,\n },\n };\n});" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - -420, - 40 + 1760, + 1632 ], - "id": "2c3419a7-55f0-4a5d-ac1d-cc22f5c18143", + "id": "22e34460-2700-4d7d-ba0a-c4d735120f19", "name": "Construir mensajes GLM" }, { @@ -130,45 +129,52 @@ "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - -150, - -100 + 2032, + 1488 ], - "id": "96b06567-a67f-49cd-af02-917c04d28c34", + "id": "3841ce9e-3957-43e9-b280-34414e0b9bd9", "name": "Preparar correos" }, { "parameters": { "sendTo": "={{ $json.contact_email }}", "subject": "={{ $json.email_subject }}", - "emailType": "html", "message": "={{ $json.email_html }}", "options": { "appendAttribution": false - } + }, + "emailType": "html" }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ - 100, - -100 + 2288, + 1488 ], - "id": "502b8c7c-1cf6-4072-a62e-698e08506667", - "name": "Gmail - Enviar recordatorio" + "id": "a4e97d3e-7181-48b6-815a-8c2e97bdff85", + "name": "Gmail - Enviar recordatorio", + "webhookId": "16bfebbd-f4e3-4b1e-aba2-028fecf98da1", + "credentials": { + "gmailOAuth2": { + "id": "UDcO1FLJqA453V2D", + "name": "Gmail account 3" + } + } }, { "parameters": { "method": "POST", - "url": "={{ ($env.SUPABASE_URL || 'https://dbit.digitalcompass.agency').replace(/\\/$/, '') + '/rest/v1/rpc/tax_record_notification' }}", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_notification", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "apikey", - "value": "={{ $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Authorization", - "value": "={{ 'Bearer ' + $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Content-Type", @@ -184,80 +190,173 @@ "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - 350, - -100 + 2544, + 1488 ], - "id": "054a395c-1a8a-4313-b17a-8571dd693707", + "id": "5059ca4d-7766-415f-8f38-ed217ed382e8", "name": "Supabase - Registrar correo" }, { "parameters": { - "jsCode": "return $input.all().filter((item) => item.json.whatsapp_enabled === true && String(item.json.whatsapp_to ?? '').trim());" + "jsCode": "return $input.all().filter((item) => item.json.google_chat_enabled === true && String(item.json.contact_email ?? '').trim());" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ - -150, - 180 + 2032, + 1760 ], - "id": "bb7ad7d3-67a2-4bec-a31d-b723af8b7ed0", - "name": "Preparar WhatsApp" + "id": "37385e9d-9d97-4622-99a0-c10fe09a73d0", + "name": "Preparar Google Chat" }, { "parameters": { "method": "POST", - "url": "={{ ($env.WHATSAPP_BASE_URL || 'https://wsp.gomezleemarketing.com').replace(/\\/$/, '') + '/message/sendText/' + ($env.WHATSAPP_INSTANCE || 'botsoporte') }}", + "url": "https://chat.googleapis.com/v1/spaces:setup", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleChatOAuth2Api", "sendHeaders": true, "headerParameters": { "parameters": [ { - "name": "apikey", - "value": "={{ $env.WHATSAPP_API_KEY }}" + "name": "Content-Type", + "value": "application/json" } ] }, "sendBody": true, - "bodyParameters": { - "parameters": [ - { - "name": "number", - "value": "={{ $json.whatsapp_to }}" - }, - { - "name": "delay", - "value": "={{ 1000 }}" - }, - { - "name": "text", - "value": "={{ $json.whatsapp_text }}" - } - ] - }, - "options": {} + "specifyBody": "json", + "jsonBody": "={{ { space: { spaceType: 'DIRECT_MESSAGE', singleUserBotDm: false }, memberships: [ { member: { name: 'users/' + $json.contact_email, type: 'HUMAN' } } ] } }}", + "options": { + "timeout": 30000 + } }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - 100, - 180 + 2288, + 1760 ], - "id": "34bae65c-ae17-4bde-9caa-21218c5cc2d0", - "name": "WhatsApp - Enviar recordatorio" + "id": "588061f1-c2b8-4747-82ff-7532ca60bf48", + "name": "Google Chat - Abrir DM", + "retryOnFail": true, + "maxTries": 3, + "waitBetweenTries": 1500, + "onError": "continueRegularOutput", + "credentials": { + "googleChatOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CHAT", + "name": "Google Chat GLM" + } + } + }, + { + "parameters": { + "jsCode": "const source = $('Preparar Google Chat').item.json;\nconst spaceName = String($json.name ?? '').trim();\nreturn [{ json: { ...source, chat_space_name: spaceName, chat_setup_ok: Boolean(spaceName), google_chat_status: spaceName ? 'pending' : 'failed', google_chat_provider_response: $json } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2544, + 1760 + ], + "id": "8c8a7a41-b131-4b27-b936-aa6a0896f70c", + "name": "Evaluar DM Google Chat" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.chat_setup_ok === true);" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2800, + 1680 + ], + "id": "dd09b31d-435e-404f-823d-5e9cf1de9dc9", + "name": "Preparar envío Google Chat" + }, + { + "parameters": { + "jsCode": "return $input.all().filter((item) => item.json.chat_setup_ok !== true);" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 2800, + 1904 + ], + "id": "31bcae02-e1d8-4c66-b2c3-cf1b16f46d2d", + "name": "Preparar fallo DM Google Chat" }, { "parameters": { "method": "POST", - "url": "={{ ($env.SUPABASE_URL || 'https://dbit.digitalcompass.agency').replace(/\\/$/, '') + '/rest/v1/rpc/tax_record_notification' }}", + "url": "={{ 'https://chat.googleapis.com/v1/' + $json.chat_space_name + '/messages' }}", + "authentication": "predefinedCredentialType", + "nodeCredentialType": "googleChatOAuth2Api", + "sendHeaders": true, + "headerParameters": { + "parameters": [ + { + "name": "Content-Type", + "value": "application/json" + } + ] + }, + "sendBody": true, + "specifyBody": "json", + "jsonBody": "={{ { text: $json.google_chat_text, createMessageNotificationOptions: { notificationType: 'NOTIFICATION_TYPE_FORCE_NOTIFY' } } }}", + "options": { + "timeout": 30000 + } + }, + "type": "n8n-nodes-base.httpRequest", + "typeVersion": 4.4, + "position": [ + 3056, + 1680 + ], + "id": "ef1c2ada-440a-4f30-a66f-dc12ca9eb1e6", + "name": "Google Chat - Enviar recordatorio", + "retryOnFail": true, + "maxTries": 3, + "waitBetweenTries": 1500, + "onError": "continueRegularOutput", + "credentials": { + "googleChatOAuth2Api": { + "id": "REEMPLAZAR_CREDENCIAL_GOOGLE_CHAT", + "name": "Google Chat GLM" + } + } + }, + { + "parameters": { + "jsCode": "const source = $('Preparar envío Google Chat').item.json;\nconst sent = Boolean($json.name) && !$json.error;\nreturn [{ json: { ...source, google_chat_status: sent ? 'sent' : 'failed', google_chat_provider_response: $json } }];" + }, + "type": "n8n-nodes-base.code", + "typeVersion": 2, + "position": [ + 3312, + 1680 + ], + "id": "130517e7-25f6-42c0-90ba-e1a319626a54", + "name": "Evaluar envío Google Chat" + }, + { + "parameters": { + "method": "POST", + "url": "https://dbit.digitalcompass.agency/rest/v1/rpc/tax_record_notification", "sendHeaders": true, "headerParameters": { "parameters": [ { "name": "apikey", - "value": "={{ $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Authorization", - "value": "={{ 'Bearer ' + $env.SUPABASE_SERVICE_ROLE_KEY }}" + "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJzZXJ2aWNlX3JvbGUiLAogICAgImlzcyI6ICJzdXBhYmFzZS1kZW1vIiwKICAgICJpYXQiOiAxNjQxNzY5MjAwLAogICAgImV4cCI6IDE3OTk1MzU2MDAKfQ.DaYlNEoUrrEn2Ig7tqibS-PHK5vgusbcbo7X36XVt4Q" }, { "name": "Content-Type", @@ -267,62 +366,17 @@ }, "sendBody": true, "specifyBody": "json", - "jsonBody": "={{ { p_obligation_id: $('Preparar WhatsApp').item.json.obligation_id, p_contact_id: $('Preparar WhatsApp').item.json.contact_id, p_alert_date: $('Preparar WhatsApp').item.json.alert_date, p_channel: 'whatsapp', p_status: 'sent', p_provider_response: $json } }}", + "jsonBody": "={{ { p_obligation_id: $json.obligation_id, p_contact_id: $json.contact_id, p_alert_date: $json.alert_date, p_channel: 'google_chat', p_status: $json.google_chat_status, p_provider_response: $json.google_chat_provider_response } }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.4, "position": [ - 350, - 180 + 3568, + 1760 ], - "id": "c26d3b1b-e257-47c2-a865-055ba889f536", - "name": "Supabase - Registrar WhatsApp" - }, - { - "parameters": { - "content": "## CONFIGURACIÓN ANTES DE ACTIVAR\n\n1. Selecciona la credencial de **Gmail** en el nodo de envío.\n2. Crea estas variables en n8n:\n- `SUPABASE_URL`\n- `SUPABASE_SERVICE_ROLE_KEY`\n- `WHATSAPP_API_KEY`\n- `WHATSAPP_BASE_URL` (opcional)\n- `WHATSAPP_INSTANCE` (opcional)\n- `GLM_TAX_APP_URL` (opcional)\n- `GLM_LOGO_URL` (opcional)\n\nLa `service_role` sólo va en n8n, nunca en el frontend.", - "height": 360, - "width": 420 - }, - "type": "n8n-nodes-base.stickyNote", - "typeVersion": 1, - "position": [ - -1220, - -620 - ], - "id": "51a235ae-93c1-4554-b13f-9d6b142d9cef", - "name": "Configuración" - }, - { - "parameters": { - "content": "## REGLA DE ALERTAS\n\nEl flujo corre diariamente a las **8:00 AM** (America/Santo_Domingo).\n\nCada obligación se avisa:\n- el miércoles estrictamente anterior;\n- y el mismo día de vencimiento.\n\nTambién aplica si vence sábado o domingo. La base de datos evita duplicados por obligación, contacto, fecha y canal.", - "height": 260, - "width": 400 - }, - "type": "n8n-nodes-base.stickyNote", - "typeVersion": 1, - "position": [ - -720, - -470 - ], - "id": "f2c36c91-3d35-4684-9d68-da5bede36cfd", - "name": "Regla de alertas" - }, - { - "parameters": { - "content": "## ENRUTAMIENTO\n\n- Contactos **Regional**: reciben todas las obligaciones.\n- Contactos de **Nómina**: sólo obligaciones de Nómina de su país.\n- Contactos de **Administración**: sólo obligaciones de Administración de su país.\n\nLos contactos se administran desde la app y el flujo los consulta en Supabase en cada ejecución. No hay que editar el workflow para agregar destinatarios.", - "height": 300, - "width": 420 - }, - "type": "n8n-nodes-base.stickyNote", - "typeVersion": 1, - "position": [ - -180, - -470 - ], - "id": "c19ded8a-93b9-46df-b747-fa19ee271f72", - "name": "Enrutamiento" + "id": "8bc5e6dd-3c21-41e8-bfdc-d44155618460", + "name": "Supabase - Registrar Google Chat" } ], "pinData": {}, @@ -402,7 +456,7 @@ "index": 0 }, { - "node": "Preparar WhatsApp", + "node": "Preparar Google Chat", "type": "main", "index": 0 } @@ -431,22 +485,82 @@ ] ] }, - "Preparar WhatsApp": { + "Preparar Google Chat": { "main": [ [ { - "node": "WhatsApp - Enviar recordatorio", + "node": "Google Chat - Abrir DM", "type": "main", "index": 0 } ] ] }, - "WhatsApp - Enviar recordatorio": { + "Google Chat - Abrir DM": { "main": [ [ { - "node": "Supabase - Registrar WhatsApp", + "node": "Evaluar DM Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Evaluar DM Google Chat": { + "main": [ + [ + { + "node": "Preparar envío Google Chat", + "type": "main", + "index": 0 + }, + { + "node": "Preparar fallo DM Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar envío Google Chat": { + "main": [ + [ + { + "node": "Google Chat - Enviar recordatorio", + "type": "main", + "index": 0 + } + ] + ] + }, + "Google Chat - Enviar recordatorio": { + "main": [ + [ + { + "node": "Evaluar envío Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Evaluar envío Google Chat": { + "main": [ + [ + { + "node": "Supabase - Registrar Google Chat", + "type": "main", + "index": 0 + } + ] + ] + }, + "Preparar fallo DM Google Chat": { + "main": [ + [ + { + "node": "Supabase - Registrar Google Chat", "type": "main", "index": 0 } @@ -457,12 +571,16 @@ "active": false, "settings": { "executionOrder": "v1", + "binaryMode": "separate", + "availableInMCP": true, + "timeSavedMode": "fixed", + "errorWorkflow": "puF4LUczoSz3hcek", "timezone": "America/Santo_Domingo", - "saveManualExecutions": true + "callerPolicy": "workflowsFromSameOwner" }, - "versionId": "87be43e3-7709-4f42-bfa6-03fd337cbfcd", "meta": { - "templateCredsSetupCompleted": false + "templateCredsSetupCompleted": true, + "instanceId": "b4b77b17af092830e794eef639ce2f6d7daccf7eddc075060b03b3b6545aac70" }, "tags": [] } \ No newline at end of file diff --git a/public/glm-logo-completo.png b/public/glm-logo-completo.png new file mode 100644 index 0000000000000000000000000000000000000000..75ee2c1a89542a759f3a8d9304ce19705aa043cb GIT binary patch literal 17295 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 T)BXlLVS~Zb)z4*}Q$iB}^1s}X literal 0 HcmV?d00001 diff --git a/src/TaxApp.tsx b/src/TaxApp.tsx index 13df98c..eae52b6 100644 --- a/src/TaxApp.tsx +++ b/src/TaxApp.tsx @@ -9,6 +9,8 @@ import { loadTaxData, removeContact, removeObligation, + searchBambooContacts, + updateContact, updateObligation, type NewContact, type NewObligation, @@ -19,6 +21,7 @@ import { formatDate, getAlertDates, normalizeSearch, + type BambooContactCandidate, type Contact, type ContactArea, type Country, @@ -49,7 +52,8 @@ export default function TaxApp({ const [showAddEvent, setShowAddEvent] = useState(false); const [selectedDay, setSelectedDay] = useState(null); const [selectedEvent, setSelectedEvent] = useState(null); - const [contactCountry, setContactCountry] = useState(null); + const [showContactManager, setShowContactManager] = useState(false); + const [selectedContact, setSelectedContact] = useState(null); useEffect(() => { let cancelled = false; @@ -156,8 +160,11 @@ export default function TaxApp({ setEvents((current) => [...current, created]); setShowAddEvent(false); setToast({ type: "success", message: "Obligación guardada." }); - } catch { - setToast({ type: "error", message: "No pudimos guardar la obligación." }); + } catch (error) { + setToast({ + type: "error", + message: error instanceof Error ? error.message : "No pudimos guardar la obligación.", + }); } finally { setBusy(false); } @@ -170,10 +177,10 @@ export default function TaxApp({ setEvents((current) => current.map((event) => (event.id === id ? updated : event))); setSelectedEvent(null); setToast({ type: "success", message: "Obligación actualizada." }); - } catch { + } catch (error) { setToast({ type: "error", - message: "No pudimos actualizar la obligación.", + message: error instanceof Error ? error.message : "No pudimos actualizar la obligación.", }); } finally { setBusy(false); @@ -200,21 +207,44 @@ export default function TaxApp({ try { const created = await createContact(session, input); setContacts((current) => [...current, created]); - setContactCountry(null); + setShowContactManager(false); setToast({ type: "success", message: "Contacto guardado." }); - } catch { - setToast({ type: "error", message: "No pudimos guardar el contacto." }); + } catch (error) { + setToast({ + type: "error", + message: error instanceof Error ? error.message : "No pudimos guardar el contacto.", + }); } finally { setBusy(false); } }; + const handleUpdateContact = async (id: string, input: NewContact) => { + setBusy(true); + try { + const updated = await updateContact(session, id, input); + setContacts((current) => current.map((contact) => (contact.id === id ? updated : contact))); + setSelectedContact(null); + setToast({ type: "success", message: "Contacto actualizado." }); + } catch (error) { + setToast({ + type: "error", + message: error instanceof Error ? error.message : "No pudimos actualizar el contacto.", + }); + } finally { + setBusy(false); + } + }; + + const handleBambooSearch = async (fullName: string) => searchBambooContacts(session, fullName); + const handleDeleteContact = async (id: string) => { if (!window.confirm("¿Eliminar este contacto?")) return; setBusy(true); try { await removeContact(session, id); setContacts((current) => current.filter((contact) => contact.id !== id)); + setSelectedContact(null); setToast({ type: "success", message: "Contacto eliminado." }); } catch { setToast({ type: "error", message: "No pudimos eliminar el contacto." }); @@ -250,6 +280,13 @@ export default function TaxApp({ setMonth(today.getMonth()); }} onDayClick={(iso) => { + if (iso < isoToday()) { + setToast({ + type: "error", + message: "No puedes crear una obligación en una fecha que ya pasó.", + }); + return; + } setSelectedDay(iso); setShowAddEvent(true); }} @@ -268,7 +305,8 @@ export default function TaxApp({ setShowContactManager(true)} + onOpen={setSelectedContact} onDelete={handleDeleteContact} /> )} @@ -295,16 +333,27 @@ export default function TaxApp({ /> )} - {contactCountry && ( - setContactCountry(null)} + onClose={() => setShowContactManager(false)} + onSearch={handleBambooSearch} onSave={handleCreateContact} /> )} + {selectedContact && ( + setSelectedContact(null)} + onSave={(input) => handleUpdateContact(selectedContact.id, input)} + onDelete={() => handleDeleteContact(selectedContact.id)} + /> + )} + {toast && } ); @@ -810,11 +859,13 @@ function ContactsView({ countries, contacts, onAdd, + onOpen, onDelete, }: { countries: Country[]; contacts: Contact[]; - onAdd: (country: Country) => void; + onAdd: () => void; + onOpen: (contact: Contact) => void; onDelete: (id: string) => void; }) { const [selectedCountry, setSelectedCountry] = useState("all"); @@ -834,12 +885,23 @@ function ContactsView({ return (
-
-

Contactos por país

-

- En Regional, el área Regional recibe todo; Nómina y Administración reciben esa categoría - de todos los países. Cada país recibe únicamente su categoría local. -

+
+
+

+ Contactos por país +

+

+ Busca empleados en BambooHR o agrégalos manualmente. Los datos importados siempre se + pueden revisar y modificar antes o después de guardar. +

+
+
@@ -860,9 +922,9 @@ function ContactsView({ const countryContacts = (contactsByCountry.get(country.id) ?? []).filter( (contact) => !searchValue || - normalizeSearch(`${contact.name} ${contact.email} ${contact.role}`).includes( - searchValue, - ), + normalizeSearch( + `${contact.name} ${contact.email} ${contact.role} ${contact.department} ${contact.location}`, + ).includes(searchValue), ); return (
+ -

{contact.name}

-

- {contact.role || areaLabel(contact.area)} -

-
- - {areaLabel(contact.area)} - - {contact.emailEnabled && ( - - Correo - - )} - {contact.whatsappEnabled && ( - - WhatsApp - - )} -
- {contact.email && ( - - {contact.email} - - )} - {contact.phone && ( -

- +{contact.phone.replace(/^\+/, "")} -

- )} ))} )} - -
); })} @@ -1085,6 +1150,7 @@ function AddEventModal({ const [text, setText] = useState(""); const [category, setCategory] = useState("admin"); const [countryId, setCountryId] = useState(""); + const dateIsPast = date < isoToday(); const alerts = getAlertDates(date); return ( @@ -1092,7 +1158,7 @@ function AddEventModal({
{ event.preventDefault(); - if (!text.trim() || !countryId) return; + if (!text.trim() || !countryId || dateIsPast) return; onSave({ date, text: text.trim(), category, countryId }); }} className="space-y-4" @@ -1101,11 +1167,17 @@ function AddEventModal({ setDate(event.target.value)} className={inputClass} required /> + {dateIsPast && ( +

+ No puedes crear una obligación en una fecha que ya pasó. +

+ )}