@airporting/integrations-app 0.4.171 → 0.4.173

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/mf/5464.js CHANGED
@@ -1 +1 @@
1
- "use strict";(globalThis["chunk_integrations_app"]=globalThis["chunk_integrations_app"]||[]).push([["5464"],{800:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{F:()=>InlineLoader});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(4848);var _mantine_core__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(2773);function InlineLoader({label}){return/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Center,{flex:1,h:"100%",children:/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Stack,{align:"center",gap:"md",children:[/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Loader,{size:"md",color:"teal"}),label&&/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Text,{fz:"sm",c:"dimmed",children:label})]})})}},3755:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{d:()=>SingleConnectorApp});var jsx_runtime=__webpack_require__(4848);var index_mjs_=__webpack_require__(2773);var index_js_=__webpack_require__(8556);var dist_index_js_=__webpack_require__(4259);var InlineLoader=__webpack_require__(800);async function fetchConnectorAuthSecrets(params){const baseUrl=params.api.replace(/\/$/,"");const res=await fetch(`${baseUrl}/v1/connectors/${params.company}/${params.connector}/auth-secrets`,{headers:{Authorization:params.token?`Bearer ${params.token}`:"",From:params.owner,"X-Reveal-Token":params.revealToken}});if(!res.ok)throw Object.assign(new Error(`${res.status}`),{status:res.status});const data=await res.json();return data.secrets??{}}var modern_index_js_=__webpack_require__(7714);var useAppConfigConnectorSingle=__webpack_require__(4613);var IntegrationsApi=__webpack_require__(6699);function useApiConnectorSingle(){const config=(0,useAppConfigConnectorSingle.C)();const client=new IntegrationsApi.Qq({baseUrl:config.api.replace(/\/$/,""),baseApiParams:{headers:{Authorization:config.token?`Bearer ${config.token}`:"",From:config.owner}}});return new IntegrationsApi.qx(client)}function useConnectorConfigQuery({enabled=true}={}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const query=(0,modern_index_js_.useQuery)({queryKey:["connector","config","form",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorConfigV1({cid:config.company,connector:+config.connector}).then(x=>x.data),enabled,refetchIntervalInBackground:false,refetchOnWindowFocus:true,refetchOnReconnect:true});return query}var esm_index_mjs_=__webpack_require__(4931);const GENERIQUE="Nous rencontrons un soucis technique. Veuillez r\xe9essayer plus tard.";const IDENTITE_REFUSEE="Votre v\xe9rification de s\xe9curit\xe9 n'est plus valable. Enregistrez \xe0 nouveau pour ressaisir votre mot de passe.";function messageDuCorps(corps){if("string"==typeof corps&&""!==corps.trim())return corps;if("object"!=typeof corps||null===corps)return null;const brut=corps.message;if("string"==typeof brut&&""!==brut.trim())return brut;if(Array.isArray(brut)){const lignes=brut.filter(l=>"string"==typeof l&&""!==l.trim());if(lignes.length>0)return lignes.join(" ")}return null}function saveErrorMessage(erreur){if("object"!=typeof erreur||null===erreur)return GENERIQUE;const{status,error}=erreur;if("number"!=typeof status||status<400||status>=500)return GENERIQUE;if(401===status||403===status)return IDENTITE_REFUSEE;return messageDuCorps(error)??GENERIQUE}function useConnectorSaveQuery(getRevealToken){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();const query=(0,modern_index_js_.useMutation)({mutationFn:async values=>{const revealToken=getRevealToken?.()??null;return await api.connectors.putConnectorDataV1({cid:config.company,connector:+config.connector},{data:values},revealToken?{headers:{"X-Reveal-Token":revealToken}}:{}).then(x=>x.data)},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["connector","config","single",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connector","config","form",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connectors","list",config.company]});queryClient.invalidateQueries({queryKey:["connectors","list","ill",config.company]});esm_index_mjs_.notifications.show({title:"Connecteur sauvegard\xe9",message:"Vos donn\xe9es sont enregistr\xe9es !"})},onError:(error,variables,context)=>{console.error(error,variables,context);esm_index_mjs_.notifications.show({color:"red",title:"Erreur !",message:saveErrorMessage(error)})}});return query}const GRACE_MS=24e4;function estRefusDIdentite(erreur){return"object"==typeof erreur&&null!==erreur&&401===erreur.status}function useConnectorSaveWithStepUp(){const{token,setToken}=(0,dist_index_js_.useRevealToken)();const fenetre=(0,index_js_.useRef)(null);if(token&&fenetre.current?.token!==token)fenetre.current={token,expireA:Date.now()+GRACE_MS};const jetonValide=()=>{const courant=fenetre.current;if(!courant)return null;if(Date.now()>=courant.expireA){fenetre.current=null;return null}return courant.token};const mutation=useConnectorSaveQuery(()=>jetonValide());const[attente,setAttente]=(0,index_js_.useState)(null);const demanderUnCode=(values,rejouable)=>new Promise((resolve,reject)=>{setAttente({values,resolve:resolve,reject,rejouable})});const lancer=(values,rejouable)=>mutation.mutateAsync(values).catch(erreur=>{if(!rejouable||!estRefusDIdentite(erreur))throw erreur;fenetre.current=null;return demanderUnCode(values,false)});const mutate=values=>{lancer(values,true).catch(()=>void 0)};const mutateAsync=values=>lancer(values,true);const save={...mutation,mutate,mutateAsync,isPending:mutation.isPending||null!==attente};const reauthModal=/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.OtpReauthModal,{opened:null!==attente,onClose:()=>{attente?.reject(new Error("R\xe9-authentification annul\xe9e"));setAttente(null)},onSuccess:nouveauJeton=>{fenetre.current={token:nouveauJeton,expireA:Date.now()+GRACE_MS};setToken(nouveauJeton);const enAttente=attente;setAttente(null);if(enAttente)lancer(enAttente.values,enAttente.rejouable).then(enAttente.resolve,enAttente.reject)}});return{save,reauthModal}}function useConnectorSingleQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const query=(0,modern_index_js_.useQuery)({queryKey:["connector","config","single",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorSingleV1({cid:config.company,connector:+config.connector}).then(x=>x.data),refetchIntervalInBackground:false,refetchOnWindowFocus:true,refetchOnReconnect:true});return query}var connector_bubble=__webpack_require__(4184);function useConnectorRenameMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async name=>{const res=await api.http.request({path:`/v1/connectors/${config.company}/${config.connector}`,method:"PATCH",body:{name},type:"application/json",format:"json"});return res.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["connector","config","single",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connectors","list",config.company]});queryClient.invalidateQueries({queryKey:["connectors","list","ill",config.company]});queryClient.invalidateQueries({queryKey:["connectors","ok",config.company]});queryClient.invalidateQueries({queryKey:["connectors","ill",config.company]});esm_index_mjs_.notifications.show({color:"green",title:"Connecteur renomm\xe9",message:"Le nom a \xe9t\xe9 mis \xe0 jour avec succ\xe8s."})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:"Renommage \xe9chou\xe9",message:"R\xe9essayez dans un instant."})}})}function useConnectorRefreshAccountsMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async()=>{const res=await api.http.request({path:`/v1/connectors/${config.company}/${config.connector}/refresh-accounts`,method:"POST",secure:true,format:"json"});return res.data},onSuccess:data=>{if("unsupported"===data.status)return void esm_index_mjs_.notifications.show({color:"blue",title:"Rien \xe0 rafra\xeechir",message:"Ce connecteur n'a pas de comptes \xe0 d\xe9couvrir."});esm_index_mjs_.notifications.show({color:"green",title:"Rafra\xeechissement lanc\xe9",message:"Les comptes seront \xe0 jour dans quelques minutes, le temps que la t\xe2che passe."})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:"Rafra\xeechissement \xe9chou\xe9",message:"R\xe9essayez dans un instant."})}})}var tabler_icons_react_mjs_=__webpack_require__(5200);function useMicrosoftTenantQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["microsoft","tenant",config.company],queryFn:async()=>{try{const response=await api.microsoft.getTenantV1({cid:config.company});return response.data}catch(err){const status=err&&"object"==typeof err&&"status"in err?err.status:void 0;if(404===status)return null;throw err}},refetchOnWindowFocus:true,refetchOnReconnect:true,retry:false})}function useStartAdminConsentMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({returnTo})=>{const response=await api.microsoft.startAdminConsentV1({cid:config.company,returnTo});return response.data}})}function useAddExcelFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async({url})=>{const response=await api.microsoft.addExcelFileV1({cid:config.company},{url});return response.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["microsoft","excel-files",config.company]})}})}function useDeleteExcelFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async({fileId})=>{await api.microsoft.deleteExcelFileV1({cid:config.company,fileId})},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["microsoft","excel-files",config.company]})}})}function useExcelFilesQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["microsoft","excel-files",config.company],queryFn:async()=>{const response=await api.microsoft.listExcelFilesV1({cid:config.company});return response.data.list},enabled,refetchOnWindowFocus:true})}function useResolveFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({url})=>{const response=await api.microsoft.resolveFileV1({cid:config.company},{url});return response.data}})}function ExcelFilesSection({enabled}){const filesQuery=useExcelFilesQuery({enabled});const resolveMutation=useResolveFileMutation();const addMutation=useAddExcelFileMutation();const deleteMutation=useDeleteExcelFileMutation();const[urlInput,setUrlInput]=(0,index_js_.useState)("");const[preview,setPreview]=(0,index_js_.useState)(null);const[error,setError]=(0,index_js_.useState)(null);const handleResolve=(0,index_js_.useCallback)(async()=>{setError(null);setPreview(null);if(!urlInput.trim())return void setError("Renseigne une URL SharePoint d’un fichier Excel");try{const result=await resolveMutation.mutateAsync({url:urlInput.trim()});setPreview(result)}catch(err){setError(err instanceof Error?err.message:"Impossible de r\xe9soudre cette URL c\xf4t\xe9 Microsoft")}},[urlInput,resolveMutation]);const handleConfirm=(0,index_js_.useCallback)(async()=>{if(!preview)return;setError(null);try{await addMutation.mutateAsync({url:urlInput.trim()});setUrlInput("");setPreview(null)}catch(err){setError(err instanceof Error?err.message:String(err))}},[preview,urlInput,addMutation]);const handleCancel=(0,index_js_.useCallback)(()=>{setPreview(null);setError(null)},[]);const handleDelete=(0,index_js_.useCallback)(fileId=>{deleteMutation.mutate({fileId})},[deleteMutation]);if(!enabled)return null;return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"Fichiers Excel \xe0 synchroniser"}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:["Ajoute les fichiers Excel qu’Airporting doit alimenter. Colle l’URL de partage d’un fichier ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:".xlsx"})," — on r\xe9cup\xe8re automatiquement son nom et son identifiant."]})]}),filesQuery.isPending?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement des fichiers..."}):filesQuery.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:"Impossible de charger la liste des fichiers Excel."}):filesQuery.data&&filesQuery.data.length>0?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Stack,{gap:"xs",children:filesQuery.data.map(file=>/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"sm",radius:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:2,style:{minWidth:0,flex:1},children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:500,truncate:true,children:file.spreadsheet_name??file.spreadsheet_id}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:6,children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:["ajout\xe9 le"," ",new Date(file.created).toLocaleString("fr-FR",{timeZone:"Europe/Paris"})]}),file.webUrl?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{href:file.webUrl,target:"_blank",rel:"noreferrer",fz:"xs",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconExternalLink,{size:12}),"ouvrir sur SharePoint"]})}):null]})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.ActionIcon,{color:"red",variant:"subtle","aria-label":"Supprimer ce fichier",onClick:()=>handleDelete(file.id),loading:deleteMutation.isPending&&deleteMutation.variables?.fileId===file.id,children:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconTrash,{size:16})})]})},file.id))}):/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"Aucun fichier Excel ajout\xe9 pour le moment."}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{label:"URL SharePoint du fichier Excel",placeholder:"https://votreorg.sharepoint.com/:x:/r/sites/.../fichier.xlsx",value:urlInput,onChange:e=>setUrlInput(e.currentTarget.value),disabled:resolveMutation.isPending||addMutation.isPending}),preview?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"green",title:"Fichier trouv\xe9",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Nom\xa0:"})," ",preview.name]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Identifiant\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.itemId})]}),"site"===preview.kind?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Site SharePoint\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.siteId})]}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Drive\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.driveId})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleConfirm,loading:addMutation.isPending,children:"Confirmer l’ajout"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"subtle",onClick:handleCancel,disabled:addMutation.isPending,children:"Annuler"})]})]})}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleResolve,loading:resolveMutation.isPending,disabled:!urlInput.trim(),children:"Valider l’URL"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:"On interroge Microsoft Graph pour r\xe9cup\xe9rer le nom du fichier avant de l’enregistrer."})]}),error?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:error}):null]})]})})}function isConsentMessage(value){if("object"!=typeof value||null===value)return false;const v=value;return"airporting-microsoft-consent"===v.type}const POPUP_NAME="airporting-microsoft-consent";const POPUP_FEATURES="width=600,height=720,resizable,scrollbars";function useMicrosoftConsentPopup({onResult}){const[isOpen,setIsOpen]=(0,index_js_.useState)(false);const popupRef=(0,index_js_.useRef)(null);const pollRef=(0,index_js_.useRef)(null);const stopPolling=(0,index_js_.useCallback)(()=>{if(null!==pollRef.current){window.clearInterval(pollRef.current);pollRef.current=null}},[]);const closePopup=(0,index_js_.useCallback)(()=>{if(popupRef.current&&!popupRef.current.closed)popupRef.current.close();popupRef.current=null;setIsOpen(false);stopPolling()},[stopPolling]);(0,index_js_.useEffect)(()=>{const handler=event=>{if(!isConsentMessage(event.data))return;onResult(event.data);closePopup()};window.addEventListener("message",handler);return()=>{window.removeEventListener("message",handler)}},[onResult,closePopup]);(0,index_js_.useEffect)(()=>()=>{closePopup()},[closePopup]);const openPopup=(0,index_js_.useCallback)(url=>{const popup=window.open(url,POPUP_NAME,POPUP_FEATURES);if(!popup)throw new Error("Impossible d’ouvrir la fen\xeatre Microsoft (popup bloqu\xe9 par le navigateur ?)");popupRef.current=popup;setIsOpen(true);stopPolling();pollRef.current=window.setInterval(()=>{if(popupRef.current?.closed)closePopup()},500)},[closePopup,stopPolling]);return{openPopup,closePopup,isOpen}}function MicrosoftConsentPanel(){const tenantQuery=useMicrosoftTenantQuery();if(tenantQuery.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement du tenant Microsoft..."});if(tenantQuery.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur de chargement",children:"Impossible de r\xe9cup\xe9rer le statut Microsoft pour cette entreprise."});const tenant=tenantQuery.data;if(tenant)return/*#__PURE__*/(0,jsx_runtime.jsx)(ClientHostedView,{tenant:tenant});return/*#__PURE__*/(0,jsx_runtime.jsx)(AirportingHostedView,{})}function AirportingHostedView(){const[advancedOpen,setAdvancedOpen]=(0,index_js_.useState)(false);return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"teal",variant:"light",radius:"md",icon:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconRocket,{size:20}),title:"Vos fichiers sont h\xe9berg\xe9s chez Airporting",children:"On cr\xe9e et alimente les fichiers Excel directement sur le SharePoint Airporting. Rien \xe0 configurer c\xf4t\xe9 Microsoft, et tu peux y acc\xe9der via le lien de partage qu’on te fournit."}),/*#__PURE__*/(0,jsx_runtime.jsx)(ExcelFilesSection,{enabled:true}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"md",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{component:"button",type:"button",onClick:()=>setAdvancedOpen(s=>!s),underline:"never",c:"dimmed",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[advancedOpen?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronUp,{size:14}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:14}),"Pr\xe9f\xe9rer h\xe9berger sur votre propre SharePoint d’entreprise\xa0?"]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:advancedOpen,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",pt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:["Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un"," ",/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"administrateur Microsoft 365"})," (r\xf4le"," ",/*#__PURE__*/(0,jsx_runtime.jsx)("i",{children:"Global Administrator"})," ou \xe9quivalent)."]}),/*#__PURE__*/(0,jsx_runtime.jsx)(AdminConsentBlock,{})]})})]})})]})}function ClientHostedView({tenant}){return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"SharePoint d’entreprise connect\xe9"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"Airporting \xe9crit dans les fichiers Excel h\xe9berg\xe9s sur votre propre tenant Microsoft 365."})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"green",size:"lg",children:"Connect\xe9"})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Tenant\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:tenant.tenant_id})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Mode\xa0:"})," ","app_only"===tenant.auth_mode?"app-only (recommand\xe9)":"delegated"]}),tenant.admin_consented_at?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Consentement donn\xe9 le\xa0:"})," ",new Date(tenant.admin_consented_at).toLocaleString("fr-FR",{timeZone:"Europe/Paris"})]}):null,/*#__PURE__*/(0,jsx_runtime.jsx)(AdminConsentBlock,{variant:"reconnect"})]})]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(ExcelFilesSection,{enabled:true})]})}function AdminConsentBlock({variant="connect"}){const config=(0,useAppConfigConnectorSingle.C)();const startMutation=useStartAdminConsentMutation();const queryClient=(0,modern_index_js_.useQueryClient)();const[lastError,setLastError]=(0,index_js_.useState)(null);const handleResult=(0,index_js_.useCallback)(message=>{if(message.success){setLastError(null);queryClient.invalidateQueries({queryKey:["microsoft","tenant",config.company]})}else setLastError(message.errorDescription??message.error??"\xc9chec du consentement Microsoft")},[queryClient,config.company]);const{openPopup,isOpen}=useMicrosoftConsentPopup({onResult:handleResult});const handleConnect=(0,index_js_.useCallback)(async()=>{setLastError(null);try{const returnTo=window.location.href;const{url}=await startMutation.mutateAsync({returnTo});openPopup(url)}catch(err){setLastError(err instanceof Error?err.message:String(err))}},[startMutation,openPopup]);const isConnecting=startMutation.isPending||isOpen;const label="reconnect"===variant?"Reconnecter Microsoft":"Connecter Microsoft";return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"reconnect"===variant?"light":"filled",onClick:handleConnect,loading:isConnecting,children:label}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:["Une fen\xeatre Microsoft va s’ouvrir : connecte-toi avec un compte"," ",/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"administrateur"}),' Microsoft 365, puis clique sur "Accepter".']})]}),lastError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:lastError}):null]})}function useGsheetFilesQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["google","gsheet-files",config.company],queryFn:async()=>{const response=await api.http.request({path:`/v1/google/${config.company}/gsheet/files`,method:"GET",format:"json"});return response.data.list},enabled,refetchOnWindowFocus:true})}function useGsheetFileDeleteMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async fileId=>{const res=await api.http.request({path:`/v1/google/${config.company}/gsheet/files/${fileId}`,method:"DELETE",secure:true,format:"json"});return res.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["google","gsheet-files",config.company]});esm_index_mjs_.notifications.show({title:"Fichier supprim\xe9",message:"Le fichier ne sera plus propos\xe9 pour cette soci\xe9t\xe9."})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:"Erreur !",message:"La suppression a \xe9chou\xe9. Veuillez r\xe9essayer plus tard."})}})}const SPREADSHEET_URL_PATTERN=/\/spreadsheets\/d\/([a-zA-Z0-9_-]+)/;function normalizeSpreadsheetId(raw){const trimmed=raw.trim();const match=trimmed.match(SPREADSHEET_URL_PATTERN);if(match)return match[1];return trimmed}function readGsheetConnectorValues(initialData){const data=initialData??{};const mainRaw=data.Spreadsheet_Id;const mainId="string"==typeof mainRaw?mainRaw.trim():"";const secondaryRaw=data.secondarySheets;let secondarySheets=[];if("string"==typeof secondaryRaw&&""!==secondaryRaw.trim())secondarySheets=[secondaryRaw.trim()];if(Array.isArray(secondaryRaw))secondarySheets=secondaryRaw.filter(item=>"string"==typeof item).map(item=>item.trim());return{mainId,secondarySheets}}function cleanSecondarySheets(secondarySheets,mainId){const seen=new Set([mainId]);const cleaned=[];for(const rawItem of secondarySheets){const id=normalizeSpreadsheetId(rawItem);if(!(""===id||seen.has(id))){seen.add(id);cleaned.push(id)}}return cleaned}function GsheetFilesManager({config,save}){const filesQuery=useGsheetFilesQuery({enabled:true});const deleteFile=useGsheetFileDeleteMutation();const[values,setValues]=(0,index_js_.useState)({mainId:"",secondarySheets:[]});const[confirmDeleteId,setConfirmDeleteId]=(0,index_js_.useState)(null);const[confirmRemoveIndex,setConfirmRemoveIndex]=(0,index_js_.useState)(null);const initializedRef=(0,index_js_.useRef)(false);(0,index_js_.useEffect)(()=>{if(config.data&&!initializedRef.current){setValues(readGsheetConnectorValues(config.data.initialData));initializedRef.current=true}},[config.data]);const nameById=(0,index_js_.useMemo)(()=>{const map=new Map;for(const file of filesQuery.data??[])if(file.spreadsheet_name)map.set(file.spreadsheet_id,file.spreadsheet_name);return map},[filesQuery.data]);const knownUnreferenced=(0,index_js_.useMemo)(()=>{const referenced=new Set([values.mainId,...values.secondarySheets]);return(filesQuery.data??[]).filter(file=>!referenced.has(file.spreadsheet_id))},[filesQuery.data,values]);const updateMain=raw=>{setValues(prev=>({...prev,mainId:normalizeSpreadsheetId(raw)}))};const updateSecondary=(index,raw)=>{setValues(prev=>{const next=[...prev.secondarySheets];next[index]=normalizeSpreadsheetId(raw);return{...prev,secondarySheets:next}})};const addSecondary=id=>{setValues(prev=>({...prev,secondarySheets:[...prev.secondarySheets,id]}))};const buildPayload=secondarySheets=>{const mainId=normalizeSpreadsheetId(values.mainId);return{...config.data?.initialData??{},share:true,Spreadsheet_Id:mainId,secondarySheets:cleanSecondarySheets(secondarySheets,mainId)}};const removeSecondaryFully=index=>{const removedId=normalizeSpreadsheetId(values.secondarySheets[index]);const next=values.secondarySheets.filter((_,i)=>i!==index);setValues(prev=>({...prev,secondarySheets:next}));save.mutate(buildPayload(next));const known=(filesQuery.data??[]).find(file=>file.spreadsheet_id===removedId);if(known)deleteFile.mutate(known.id)};const handleSave=()=>{save.mutate(buildPayload(values.secondarySheets))};if(config.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement du connecteur..."});if(config.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:"Impossible de charger la configuration du connecteur."});const nameCell=id=>{const name=nameById.get(id);if(name)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:500,children:name});if(""===id)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fs:"italic",children:"Nouvelle feuille"});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fs:"italic",children:filesQuery.isPending?"...":"Nom inconnu"})};const openCell=id=>{if(""===id)return null;return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{href:`https://docs.google.com/spreadsheets/d/${id}/edit`,target:"_blank",rel:"noreferrer",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconExternalLink,{size:14}),"ouvrir"]})})};return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"Fichiers Google Sheets synchronis\xe9s"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"L'identifiant d'un tableur se trouve dans l'URL du fichier, juste apr\xe8s \xab https://docs.google.com/spreadsheets/d/ \xbb. Vous pouvez coller l'URL compl\xe8te : elle est convertie automatiquement. En cas de doute, nous nous chargeons de la cr\xe9ation du fichier Google Sheets et du param\xe9trage."})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table,{verticalSpacing:"sm",highlightOnHover:true,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Thead,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:"30%",children:"Fichier"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Identifiant"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:90,children:"Lien"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:210})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tbody,{children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(values.mainId)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{value:values.mainId,onChange:e=>updateMain(e.currentTarget.value),placeholder:"Id du tableur principal",required:true,autoComplete:"off"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(values.mainId)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{variant:"light",children:"Principal"})})]}),values.secondarySheets.map((id,index)=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{value:id,onChange:e=>updateSecondary(index,e.currentTarget.value),placeholder:"Id ou URL du tableur",autoComplete:"off"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",color:"red",variant:confirmRemoveIndex===index?"filled":"light",onClick:()=>{if(confirmRemoveIndex===index){setConfirmRemoveIndex(null);removeSecondaryFully(index)}else setConfirmRemoveIndex(index)},onBlur:()=>setConfirmRemoveIndex(null),children:confirmRemoveIndex===index?"Confirmer ?":"Supprimer"})})]},`secondary-${index}`)),knownUnreferenced.map(file=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(file.spreadsheet_id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",style:{wordBreak:"break-all"},children:file.spreadsheet_id})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(file.spreadsheet_id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:"xs",wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlus,{size:14}),onClick:()=>addSecondary(file.spreadsheet_id),children:"Ajouter"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",color:"red",variant:confirmDeleteId===file.id?"filled":"subtle",loading:deleteFile.isPending&&deleteFile.variables===file.id,onClick:()=>{if(confirmDeleteId===file.id){setConfirmDeleteId(null);deleteFile.mutate(file.id)}else setConfirmDeleteId(file.id)},onBlur:()=>setConfirmDeleteId(null),children:confirmDeleteId===file.id?"Confirmer ?":"Supprimer"})]})})]},`known-${file.spreadsheet_id}`))]})]}),filesQuery.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"yellow",title:"Noms indisponibles",children:"Impossible de charger les noms des fichiers ; les identifiants restent modifiables."}):null,/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"default",size:"xs",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlus,{size:14}),onClick:()=>addSecondary(""),children:"Ajouter une feuille"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleSave,loading:save.isPending,disabled:""===normalizeSpreadsheetId(values.mainId),children:"Sauvegarder"})})]})})}function pennylaneOauthStatusQueryKey(company){return["pennylane","oauth-status",company]}function usePennylaneOauthStatusQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:pennylaneOauthStatusQueryKey(config.company),queryFn:async()=>{const response=await api.pennylane.getStatusV1({cid:config.company});return response.data},refetchOnWindowFocus:true,refetchOnReconnect:true,retry:false})}function usePennylaneOauthDisconnectMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async()=>{const response=await api.pennylane.disconnectV1({cid:config.company});return response.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:pennylaneOauthStatusQueryKey(config.company)})}})}function usePennylaneOauthStartMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({returnTo})=>{const response=await api.pennylane.startOauthV1({cid:config.company,returnTo});return response.data}})}function isOauthMessage(value){if("object"!=typeof value||null===value)return false;const v=value;return"airporting-pennylane-oauth"===v.type}const usePennylaneOauthPopup_POPUP_NAME="airporting-pennylane-oauth";const usePennylaneOauthPopup_POPUP_FEATURES="width=600,height=720,resizable,scrollbars";function usePennylaneOauthPopup({onResult}){const[isOpen,setIsOpen]=(0,index_js_.useState)(false);const popupRef=(0,index_js_.useRef)(null);const pollRef=(0,index_js_.useRef)(null);const stopPolling=(0,index_js_.useCallback)(()=>{if(null!==pollRef.current){window.clearInterval(pollRef.current);pollRef.current=null}},[]);const closePopup=(0,index_js_.useCallback)(()=>{if(popupRef.current&&!popupRef.current.closed)popupRef.current.close();popupRef.current=null;setIsOpen(false);stopPolling()},[stopPolling]);(0,index_js_.useEffect)(()=>{const handler=event=>{if(!isOauthMessage(event.data))return;onResult(event.data);closePopup()};window.addEventListener("message",handler);return()=>{window.removeEventListener("message",handler)}},[onResult,closePopup]);(0,index_js_.useEffect)(()=>()=>{closePopup()},[closePopup]);const openPopup=(0,index_js_.useCallback)(url=>{const popup=window.open(url,usePennylaneOauthPopup_POPUP_NAME,usePennylaneOauthPopup_POPUP_FEATURES);if(!popup)throw new Error("Impossible d’ouvrir la fen\xeatre Pennylane (popup bloqu\xe9 par le navigateur ?)");popupRef.current=popup;setIsOpen(true);stopPolling();pollRef.current=window.setInterval(()=>{if(popupRef.current?.closed)closePopup()},500)},[closePopup,stopPolling]);return{openPopup,closePopup,isOpen}}function PennylaneOauthPanel(){const statusQuery=usePennylaneOauthStatusQuery();if(statusQuery.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement de la connexion Pennylane..."});if(statusQuery.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur de chargement",children:"Impossible de r\xe9cup\xe9rer le statut de connexion Pennylane pour cette entreprise."});if(statusQuery.data.connected)return/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectedView,{status:statusQuery.data});return/*#__PURE__*/(0,jsx_runtime.jsx)(DisconnectedView,{})}function ConnectButton({variant}){const config=(0,useAppConfigConnectorSingle.C)();const startMutation=usePennylaneOauthStartMutation();const queryClient=(0,modern_index_js_.useQueryClient)();const[lastError,setLastError]=(0,index_js_.useState)(null);const handleResult=(0,index_js_.useCallback)(message=>{if(message.success){setLastError(null);queryClient.invalidateQueries({queryKey:pennylaneOauthStatusQueryKey(config.company)})}else setLastError(message.errorDescription??message.error??"\xc9chec de la connexion Pennylane")},[queryClient,config.company]);const{openPopup,isOpen}=usePennylaneOauthPopup({onResult:handleResult});const handleConnect=(0,index_js_.useCallback)(async()=>{setLastError(null);try{const returnTo=window.location.href;const{url}=await startMutation.mutateAsync({returnTo});openPopup(url)}catch(err){setLastError(err instanceof Error?err.message:String(err))}},[startMutation,openPopup]);const isConnecting=startMutation.isPending||isOpen;const label="reconnect"===variant?"Reconnecter Pennylane":"Connecter Pennylane";return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"reconnect"===variant?"light":"filled",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlugConnected,{size:18}),onClick:handleConnect,loading:isConnecting,children:label}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:"Une fen\xeatre Pennylane va s’ouvrir : connecte-toi et autorise Airporting, puis reviens sur cette page."})]}),lastError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:lastError}):null]})}function DisconnectedView(){return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"Connexion Pennylane"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"Connecte ton compte Pennylane en un clic via OAuth. Airporting acc\xe8de \xe0 ta comptabilit\xe9 sans que tu aies \xe0 copier une cl\xe9 API."})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"gray",size:"lg",children:"Non connect\xe9"})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectButton,{variant:"connect"})]})})}function ConnectedView({status}){const disconnectMutation=usePennylaneOauthDisconnectMutation();return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"Pennylane connect\xe9"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"Airporting acc\xe8de \xe0 ta comptabilit\xe9 Pennylane via OAuth."})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"green",size:"lg",children:"Connect\xe9"})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[status.pennylaneCompanyId?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Dossier Pennylane\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:status.pennylaneCompanyId})]}):null,status.accessTokenExpiresAt?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Jeton valide jusqu’au\xa0:"})," ",new Date(status.accessTokenExpiresAt).toLocaleString("fr-FR",{timeZone:"Europe/Paris"})]}):null,status.scopes&&status.scopes.length>0?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Autorisations\xa0:"})," ",status.scopes.length," accord\xe9es"]}):null]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectButton,{variant:"reconnect"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"subtle",color:"red",loading:disconnectMutation.isPending,onClick:()=>disconnectMutation.mutate(),children:"D\xe9connecter"})]})]})})}function PennylaneConfigPanel({apiKeyForm}){const[advancedOpen,setAdvancedOpen]=(0,index_js_.useState)(false);return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(PennylaneOauthPanel,{}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"md",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{component:"button",type:"button",onClick:()=>setAdvancedOpen(s=>!s),underline:"never",c:"dimmed",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[advancedOpen?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronUp,{size:14}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:14}),"M\xe9thode cl\xe9 API (avanc\xe9)"]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:advancedOpen,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",pt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:"Si tu pr\xe9f\xe8res connecter Pennylane avec une cl\xe9 API plut\xf4t que par OAuth, saisis-la ici. La connexion OAuth ci-dessus reste la m\xe9thode recommand\xe9e."}),apiKeyForm]})})]})})]})}function useConnectorHistoryQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["connector","history",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorHistoryV1({cid:config.company,connector:+config.connector}).then(x=>x.data),enabled,refetchOnWindowFocus:false})}const LIBELLE_ACTION={created:"Cr\xe9ation",data_updated:"Modification",renamed:"Renommage",deleted:"Suppression",secrets_revealed:"Consultation des identifiants"};function libelleAction(action){return LIBELLE_ACTION[action]??action}function formatDate(iso){const d=new Date(iso);if(Number.isNaN(d.getTime()))return iso;return d.toLocaleString("fr-FR",{day:"2-digit",month:"2-digit",year:"2-digit",hour:"2-digit",minute:"2-digit"})}function PastilleIdentite({source}){if("reveal_token"===source)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{multiline:true,w:280,label:"Identit\xe9 v\xe9rifi\xe9e : cette action a demand\xe9 une r\xe9-authentification par mot de passe.",withArrow:true,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"teal",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconShieldCheck,{size:12}),children:"V\xe9rifi\xe9e"})});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{multiline:true,w:280,label:"Identit\xe9 d\xe9clar\xe9e : le nom vient de l'application appelante et n'a pas \xe9t\xe9 prouv\xe9. \xc0 lire comme une indication, pas comme une preuve.",withArrow:true,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"gray",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconShieldQuestion,{size:12}),children:"D\xe9clar\xe9e"})})}function Champs({champs}){if(0===champs.length)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"xs",c:"dimmed",children:"aucun changement"});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{gap:4,children:champs.map(champ=>/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Code,{fz:"xs",children:champ},champ))})}function Lignes({entries}){return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.ScrollContainer,{minWidth:640,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table,{striped:true,highlightOnHover:true,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Thead,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Date"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Action"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Par"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Identit\xe9"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Champs"})]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Tbody,{children:entries.map((entry,index)=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:formatDate(entry.date)})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:libelleAction(entry.action)})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:entry.userEmail??"utilisateur inconnu"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(PastilleIdentite,{source:entry.identitySource})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(Champs,{champs:entry.changedFields})})]},`${entry.date}-${entry.action}-${index}`))})]})})}function ConnectorHistory(){const[ouvert,setOuvert]=(0,index_js_.useState)(false);const historique=useConnectorHistoryQuery({enabled:ouvert});const entries=historique.data?.entries??[];return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:0,mt:"xl",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.UnstyledButton,{onClick:()=>setOuvert(o=>!o),style:{width:"100%",padding:"8px 0"},children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:"xs",children:[ouvert?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:16}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronRight,{size:16}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,children:"Historique des acc\xe8s et des modifications"}),ouvert&&historique.isSuccess?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",children:["(",entries.length,")"]}):null]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:ouvert,children:historique.isLoading?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement de l'historique..."}):historique.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Historique indisponible",children:"Nous n'avons pas pu charger l'historique de ce connecteur."}):0===entries.length?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"blue",title:"Aucune action enregistr\xe9e",children:"L'historique ne remonte pas avant la mise en place de la journalisation. Les prochaines modifications et consultations des identifiants appara\xeetront ici."}):/*#__PURE__*/(0,jsx_runtime.jsx)(Lignes,{entries:entries})})]})}function SingleConnectorApp(){const config=(0,useAppConfigConnectorSingle.C)();const itemRes=useConnectorSingleQuery();const item=itemRes.data;const configRes=useConnectorConfigQuery({enabled:!!item?.hasForm});const{save:saveFn,reauthModal}=useConnectorSaveWithStepUp();const revealContext={fetchSecrets:revealToken=>fetchConnectorAuthSecrets({api:config.api,token:config.token,owner:config.owner,company:config.company,connector:config.connector,revealToken})};const[editing,setEditing]=(0,index_js_.useState)(false);const[draft,setDraft]=(0,index_js_.useState)("");const renameMutation=useConnectorRenameMutation();const refreshAccountsMutation=useConnectorRefreshAccountsMutation();(0,index_js_.useEffect)(()=>{if(item?.name)setDraft(item.name)},[item?.name]);const handleSave=()=>{renameMutation.mutate(draft,{onSuccess:()=>setEditing(false)})};const handleCancel=()=>{if(item?.name)setDraft(item.name);setEditing(false)};const backLink={text:"Liste des connecteurs",tab:""};switch(item?.status){case"active":backLink.tab="?tab=active";backLink.text="Connecteurs actifs";break;case"ill":backLink.tab="?tab=ill";backLink.text="Connecteurs \xe0 configurer";break}const isFormLoading=!item||item.hasForm&&!configRes.data;return/*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[reauthModal,/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{py:10,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:0,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Title,{w:"fit-content",mb:0,order:1,children:"Nos connecteurs"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{w:"fit-content",mb:0,c:"dimmed",fz:"h5",children:"Synchronisez vos comptes bancaires et outils comptables facilement."}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{py:10,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{underline:"never",href:`/company/${config.company}/integrations/connectors${backLink.tab}`,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.Circle,{bg:"dark.4",size:24,ml:"auto",c:"white",children:/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.IconArrowUp,{rotate:270})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Title,{w:"fit-content",c:"white",mb:0,order:3,children:backLink.text})]})})})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Grid,{w:"100%",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Grid.Col,{span:{base:12,lg:3},children:item?/*#__PURE__*/(0,jsx_runtime.jsx)(connector_bubble.q,{connector:item,rename:{editing,draft,isPending:renameMutation.isPending,onDraftChange:setDraft,onSave:handleSave,onCancel:handleCancel,onStartEditing:()=>setEditing(true)}}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:64,width:64,radius:"md"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:28,width:"60%"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:16,width:"80%"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:16,width:"70%"})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Grid.Col,{span:{base:12,lg:9},children:[!isFormLoading&&item.supportsAccountDiscovery?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{justify:"flex-end",mb:10,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{label:"Red\xe9couvre les comptes de ce connecteur pour alimenter les s\xe9lecteurs de compte des synchronisations. L'enregistrement du formulaire le fait d\xe9j\xe0 tout seul.",children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"light",size:"xs",loading:refreshAccountsMutation.isPending,onClick:()=>refreshAccountsMutation.mutate(),children:"Rafra\xeechir les comptes"})})}):null,isFormLoading?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:"Chargement du connecteur..."}):item.requiresMicrosoftConsent?/*#__PURE__*/(0,jsx_runtime.jsx)(MicrosoftConsentPanel,{}):item.hasForm?/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.IdentityGate,{description:"Ce formulaire porte les identifiants de connexion \xe0 ce connecteur.",children:"google_sheet"===item.main_connectorlist.codename?/*#__PURE__*/(0,jsx_runtime.jsx)(GsheetFilesManager,{config:configRes,save:saveFn}):"pennylane"===item.main_connectorlist.codename?/*#__PURE__*/(0,jsx_runtime.jsx)(PennylaneConfigPanel,{apiKeyForm:/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.DynamicForm,{config:()=>configRes,save:saveFn,revealContext:revealContext})}):/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.DynamicForm,{config:()=>configRes,save:saveFn,revealContext:revealContext})}):/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"blue",title:"Aucune configuration n\xe9cessaire",children:item.isBridge?"Ce connecteur est g\xe9r\xe9 via Bridge. Il n’y a rien \xe0 configurer ici.":"Ce connecteur ne n\xe9cessite aucune configuration."}),item?/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectorHistory,{}):null]})]})]})}}}]);
1
+ "use strict";(globalThis["chunk_integrations_app"]=globalThis["chunk_integrations_app"]||[]).push([["5464"],{800:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{F:()=>InlineLoader});var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(4848);var _mantine_core__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(2773);function InlineLoader({label}){return/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Center,{flex:1,h:"100%",children:/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxs)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Stack,{align:"center",gap:"md",children:[/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Loader,{size:"md",color:"teal"}),label&&/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_0__.jsx)(_mantine_core__WEBPACK_IMPORTED_MODULE_1__.Text,{fz:"sm",c:"dimmed",children:label})]})})}},3755:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{d:()=>SingleConnectorApp});var jsx_runtime=__webpack_require__(4848);var index_mjs_=__webpack_require__(2773);var index_js_=__webpack_require__(8556);var dist_index_js_=__webpack_require__(4259);var InlineLoader=__webpack_require__(800);async function fetchConnectorAuthSecrets(params){const baseUrl=params.api.replace(/\/$/,"");const res=await fetch(`${baseUrl}/v1/connectors/${params.company}/${params.connector}/auth-secrets`,{headers:{Authorization:params.token?`Bearer ${params.token}`:"",From:params.owner,"X-Reveal-Token":params.revealToken}});if(!res.ok)throw Object.assign(new Error(`${res.status}`),{status:res.status});const data=await res.json();return data.secrets??{}}var modern_index_js_=__webpack_require__(7714);var useAppConfigConnectorSingle=__webpack_require__(4613);var IntegrationsApi=__webpack_require__(6699);function useApiConnectorSingle(){const config=(0,useAppConfigConnectorSingle.C)();const client=new IntegrationsApi.Qq({baseUrl:config.api.replace(/\/$/,""),baseApiParams:{headers:{Authorization:config.token?`Bearer ${config.token}`:"",From:config.owner}}});return new IntegrationsApi.qx(client)}function useConnectorConfigQuery({enabled=true}={}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const query=(0,modern_index_js_.useQuery)({queryKey:["connector","config","form",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorConfigV1({cid:config.company,connector:+config.connector}).then(x=>x.data),enabled,refetchIntervalInBackground:false,refetchOnWindowFocus:true,refetchOnReconnect:true});return query}var esm_index_mjs_=__webpack_require__(4931);var locales=__webpack_require__(108);const GENERIQUE=()=>(0,locales.tr)("Nous rencontrons un soucis technique. Veuillez r\xe9essayer plus tard.");const IDENTITE_REFUSEE=()=>(0,locales.tr)("Votre v\xe9rification de s\xe9curit\xe9 n'est plus valable. Enregistrez \xe0 nouveau pour ressaisir votre mot de passe.");function messageDuCorps(corps){if("string"==typeof corps&&""!==corps.trim())return corps;if("object"!=typeof corps||null===corps)return null;const brut=corps.message;if("string"==typeof brut&&""!==brut.trim())return brut;if(Array.isArray(brut)){const lignes=brut.filter(l=>"string"==typeof l&&""!==l.trim());if(lignes.length>0)return lignes.join(" ")}return null}function saveErrorMessage(erreur){if("object"!=typeof erreur||null===erreur)return GENERIQUE();const{status,error}=erreur;if("number"!=typeof status||status<400||status>=500)return GENERIQUE();if(401===status||403===status)return IDENTITE_REFUSEE();return messageDuCorps(error)??GENERIQUE()}var es_index_js_=__webpack_require__(6155);function useConnectorSaveQuery(getRevealToken){const{t}=(0,es_index_js_.useTranslation)();const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();const query=(0,modern_index_js_.useMutation)({mutationFn:async values=>{const revealToken=getRevealToken?.()??null;return await api.connectors.putConnectorDataV1({cid:config.company,connector:+config.connector},{data:values},revealToken?{headers:{"X-Reveal-Token":revealToken}}:{}).then(x=>x.data)},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["connector","config","single",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connector","config","form",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connectors","list",config.company]});queryClient.invalidateQueries({queryKey:["connectors","list","ill",config.company]});esm_index_mjs_.notifications.show({title:t("Connecteur sauvegard\xe9"),message:t("Vos donn\xe9es sont enregistr\xe9es !")})},onError:(error,variables,context)=>{console.error(error,variables,context);esm_index_mjs_.notifications.show({color:"red",title:"Erreur !",message:saveErrorMessage(error)})}});return query}const GRACE_MS=24e4;function estRefusDIdentite(erreur){return"object"==typeof erreur&&null!==erreur&&401===erreur.status}function useConnectorSaveWithStepUp(){const{t}=(0,es_index_js_.useTranslation)();const{token,setToken}=(0,dist_index_js_.useRevealToken)();const fenetre=(0,index_js_.useRef)(null);if(token&&fenetre.current?.token!==token)fenetre.current={token,expireA:Date.now()+GRACE_MS};const jetonValide=()=>{const courant=fenetre.current;if(!courant)return null;if(Date.now()>=courant.expireA){fenetre.current=null;return null}return courant.token};const mutation=useConnectorSaveQuery(()=>jetonValide());const[attente,setAttente]=(0,index_js_.useState)(null);const demanderUnCode=(values,rejouable)=>new Promise((resolve,reject)=>{setAttente({values,resolve:resolve,reject,rejouable})});const lancer=(values,rejouable)=>mutation.mutateAsync(values).catch(erreur=>{if(!rejouable||!estRefusDIdentite(erreur))throw erreur;fenetre.current=null;return demanderUnCode(values,false)});const mutate=values=>{lancer(values,true).catch(()=>void 0)};const mutateAsync=values=>lancer(values,true);const save={...mutation,mutate,mutateAsync,isPending:mutation.isPending||null!==attente};const reauthModal=/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.OtpReauthModal,{opened:null!==attente,onClose:()=>{attente?.reject(new Error(t("R\xe9-authentification annul\xe9e")));setAttente(null)},onSuccess:nouveauJeton=>{fenetre.current={token:nouveauJeton,expireA:Date.now()+GRACE_MS};setToken(nouveauJeton);const enAttente=attente;setAttente(null);if(enAttente)lancer(enAttente.values,enAttente.rejouable).then(enAttente.resolve,enAttente.reject)}});return{save,reauthModal}}function useConnectorSingleQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const query=(0,modern_index_js_.useQuery)({queryKey:["connector","config","single",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorSingleV1({cid:config.company,connector:+config.connector}).then(x=>x.data),refetchIntervalInBackground:false,refetchOnWindowFocus:true,refetchOnReconnect:true});return query}var connector_bubble=__webpack_require__(4184);function useConnectorRenameMutation(){const{t}=(0,es_index_js_.useTranslation)();const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async name=>{const res=await api.http.request({path:`/v1/connectors/${config.company}/${config.connector}`,method:"PATCH",body:{name},type:"application/json",format:"json"});return res.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["connector","config","single",config.company,config.connector]});queryClient.invalidateQueries({queryKey:["connectors","list",config.company]});queryClient.invalidateQueries({queryKey:["connectors","list","ill",config.company]});queryClient.invalidateQueries({queryKey:["connectors","ok",config.company]});queryClient.invalidateQueries({queryKey:["connectors","ill",config.company]});esm_index_mjs_.notifications.show({color:"green",title:t("Connecteur renomm\xe9"),message:t("Le nom a \xe9t\xe9 mis \xe0 jour avec succ\xe8s.")})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:t("Renommage \xe9chou\xe9"),message:t("R\xe9essayez dans un instant.")})}})}function useConnectorRefreshAccountsMutation(){const{t}=(0,es_index_js_.useTranslation)();const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async()=>{const res=await api.http.request({path:`/v1/connectors/${config.company}/${config.connector}/refresh-accounts`,method:"POST",secure:true,format:"json"});return res.data},onSuccess:data=>{if("unsupported"===data.status)return void esm_index_mjs_.notifications.show({color:"blue",title:t("Rien \xe0 rafra\xeechir"),message:t("Ce connecteur n'a pas de comptes \xe0 d\xe9couvrir.")});esm_index_mjs_.notifications.show({color:"green",title:t("Rafra\xeechissement lanc\xe9"),message:t("Les comptes seront \xe0 jour dans quelques minutes, le temps que la t\xe2che passe.")})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:t("Rafra\xeechissement \xe9chou\xe9"),message:t("R\xe9essayez dans un instant.")})}})}var tabler_icons_react_mjs_=__webpack_require__(5200);function useMicrosoftTenantQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["microsoft","tenant",config.company],queryFn:async()=>{try{const response=await api.microsoft.getTenantV1({cid:config.company});return response.data}catch(err){const status=err&&"object"==typeof err&&"status"in err?err.status:void 0;if(404===status)return null;throw err}},refetchOnWindowFocus:true,refetchOnReconnect:true,retry:false})}function useStartAdminConsentMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({returnTo})=>{const response=await api.microsoft.startAdminConsentV1({cid:config.company,returnTo});return response.data}})}function useAddExcelFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async({url})=>{const response=await api.microsoft.addExcelFileV1({cid:config.company},{url});return response.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["microsoft","excel-files",config.company]})}})}function useDeleteExcelFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async({fileId})=>{await api.microsoft.deleteExcelFileV1({cid:config.company,fileId})},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["microsoft","excel-files",config.company]})}})}function useExcelFilesQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["microsoft","excel-files",config.company],queryFn:async()=>{const response=await api.microsoft.listExcelFilesV1({cid:config.company});return response.data.list},enabled,refetchOnWindowFocus:true})}function useResolveFileMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({url})=>{const response=await api.microsoft.resolveFileV1({cid:config.company},{url});return response.data}})}function ExcelFilesSection({enabled}){const{t}=(0,es_index_js_.useTranslation)();const filesQuery=useExcelFilesQuery({enabled});const resolveMutation=useResolveFileMutation();const addMutation=useAddExcelFileMutation();const deleteMutation=useDeleteExcelFileMutation();const[urlInput,setUrlInput]=(0,index_js_.useState)("");const[preview,setPreview]=(0,index_js_.useState)(null);const[error,setError]=(0,index_js_.useState)(null);const handleResolve=(0,index_js_.useCallback)(async()=>{setError(null);setPreview(null);if(!urlInput.trim())return void setError(t("Renseigne une URL SharePoint d’un fichier Excel"));try{const result=await resolveMutation.mutateAsync({url:urlInput.trim()});setPreview(result)}catch(err){setError(err instanceof Error?err.message:t("Impossible de r\xe9soudre cette URL c\xf4t\xe9 Microsoft"))}},[urlInput,resolveMutation]);const handleConfirm=(0,index_js_.useCallback)(async()=>{if(!preview)return;setError(null);try{await addMutation.mutateAsync({url:urlInput.trim()});setUrlInput("");setPreview(null)}catch(err){setError(err instanceof Error?err.message:String(err))}},[preview,urlInput,addMutation]);const handleCancel=(0,index_js_.useCallback)(()=>{setPreview(null);setError(null)},[]);const handleDelete=(0,index_js_.useCallback)(fileId=>{deleteMutation.mutate({fileId})},[deleteMutation]);if(!enabled)return null;return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:t("Fichiers Excel \xe0 synchroniser")}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:[t("Ajoute les fichiers Excel qu’Airporting doit alimenter. Colle l’URL de partage d’un fichier")," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:".xlsx"})," ",t(", on r\xe9cup\xe8re automatiquement son nom et son identifiant.")]})]}),filesQuery.isPending?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement des fichiers...")}):filesQuery.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:t("Impossible de charger la liste des fichiers Excel.")}):filesQuery.data&&filesQuery.data.length>0?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Stack,{gap:"xs",children:filesQuery.data.map(file=>/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"sm",radius:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:2,style:{minWidth:0,flex:1},children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:500,truncate:true,children:file.spreadsheet_name??file.spreadsheet_id}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:6,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:t("ajout\xe9 le {{date}}",{date:new Date(file.created).toLocaleString((0,locales.O)(),{timeZone:"Europe/Paris"})})}),file.webUrl?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{href:file.webUrl,target:"_blank",rel:"noreferrer",fz:"xs",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconExternalLink,{size:12}),t("ouvrir sur SharePoint")]})}):null]})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.ActionIcon,{color:"red",variant:"subtle","aria-label":t("Supprimer ce fichier"),onClick:()=>handleDelete(file.id),loading:deleteMutation.isPending&&deleteMutation.variables?.fileId===file.id,children:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconTrash,{size:16})})]})},file.id))}):/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("Aucun fichier Excel ajout\xe9 pour le moment.")}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{label:t("URL SharePoint du fichier Excel"),placeholder:"https://votreorg.sharepoint.com/:x:/r/sites/.../fichier.xlsx",value:urlInput,onChange:e=>setUrlInput(e.currentTarget.value),disabled:resolveMutation.isPending||addMutation.isPending}),preview?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"green",title:t("Fichier trouv\xe9"),children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Nom\xa0:"})," ",preview.name]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Identifiant\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.itemId})]}),"site"===preview.kind?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Site SharePoint\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.siteId})]}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Drive\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:preview.driveId})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleConfirm,loading:addMutation.isPending,children:"Confirmer l’ajout"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"subtle",onClick:handleCancel,disabled:addMutation.isPending,children:t("Annuler")})]})]})}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleResolve,loading:resolveMutation.isPending,disabled:!urlInput.trim(),children:"Valider l’URL"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:t("On interroge Microsoft Graph pour r\xe9cup\xe9rer le nom du fichier avant de l’enregistrer.")})]}),error?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:error}):null]})]})})}function isConsentMessage(value){if("object"!=typeof value||null===value)return false;const v=value;return"airporting-microsoft-consent"===v.type}const POPUP_NAME="airporting-microsoft-consent";const POPUP_FEATURES="width=600,height=720,resizable,scrollbars";function useMicrosoftConsentPopup({onResult}){const{t}=(0,es_index_js_.useTranslation)();const[isOpen,setIsOpen]=(0,index_js_.useState)(false);const popupRef=(0,index_js_.useRef)(null);const pollRef=(0,index_js_.useRef)(null);const stopPolling=(0,index_js_.useCallback)(()=>{if(null!==pollRef.current){window.clearInterval(pollRef.current);pollRef.current=null}},[]);const closePopup=(0,index_js_.useCallback)(()=>{if(popupRef.current&&!popupRef.current.closed)popupRef.current.close();popupRef.current=null;setIsOpen(false);stopPolling()},[stopPolling]);(0,index_js_.useEffect)(()=>{const handler=event=>{if(!isConsentMessage(event.data))return;onResult(event.data);closePopup()};window.addEventListener("message",handler);return()=>{window.removeEventListener("message",handler)}},[onResult,closePopup]);(0,index_js_.useEffect)(()=>()=>{closePopup()},[closePopup]);const openPopup=(0,index_js_.useCallback)(url=>{const popup=window.open(url,POPUP_NAME,POPUP_FEATURES);if(!popup)throw new Error(t("Impossible d’ouvrir la fen\xeatre Microsoft (popup bloqu\xe9 par le navigateur ?)"));popupRef.current=popup;setIsOpen(true);stopPolling();pollRef.current=window.setInterval(()=>{if(popupRef.current?.closed)closePopup()},500)},[closePopup,stopPolling]);return{openPopup,closePopup,isOpen}}function MicrosoftConsentPanel(){const{t}=(0,es_index_js_.useTranslation)();const tenantQuery=useMicrosoftTenantQuery();if(tenantQuery.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement du tenant Microsoft...")});if(tenantQuery.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:t("Erreur de chargement"),children:t("Impossible de r\xe9cup\xe9rer le statut Microsoft pour cette entreprise.")});const tenant=tenantQuery.data;if(tenant)return/*#__PURE__*/(0,jsx_runtime.jsx)(ClientHostedView,{tenant:tenant});return/*#__PURE__*/(0,jsx_runtime.jsx)(AirportingHostedView,{})}function AirportingHostedView(){const{t}=(0,es_index_js_.useTranslation)();const[advancedOpen,setAdvancedOpen]=(0,index_js_.useState)(false);return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"teal",variant:"light",radius:"md",icon:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconRocket,{size:20}),title:t("Vos fichiers sont h\xe9berg\xe9s chez Airporting"),children:t("On cr\xe9e et alimente les fichiers Excel directement sur le SharePoint Airporting. Rien \xe0 configurer c\xf4t\xe9 Microsoft, et tu peux y acc\xe9der via le lien de partage qu’on te fournit.")}),/*#__PURE__*/(0,jsx_runtime.jsx)(ExcelFilesSection,{enabled:true}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"md",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{component:"button",type:"button",onClick:()=>setAdvancedOpen(s=>!s),underline:"never",c:"dimmed",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[advancedOpen?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronUp,{size:14}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:14}),t("Pr\xe9f\xe9rer h\xe9berger sur votre propre SharePoint d’entreprise ?")]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:advancedOpen,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",pt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsx)(es_index_js_.Trans,{i18nKey:"Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un <1>administrateur Microsoft 365</1> (r\xf4le <3>Global Administrator</3> ou \xe9quivalent).",components:{1:/*#__PURE__*/(0,jsx_runtime.jsx)("b",{}),3:/*#__PURE__*/(0,jsx_runtime.jsx)("i",{})}})}),/*#__PURE__*/(0,jsx_runtime.jsx)(AdminConsentBlock,{})]})})]})})]})}function ClientHostedView({tenant}){const{t}=(0,es_index_js_.useTranslation)();return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:t("SharePoint d’entreprise connect\xe9")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("Airporting \xe9crit dans les fichiers Excel h\xe9berg\xe9s sur votre propre tenant Microsoft 365.")})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"green",size:"lg",children:t("Connect\xe9")})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Tenant\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:tenant.tenant_id})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Mode\xa0:"})," ","app_only"===tenant.auth_mode?t("app-only (recommand\xe9)"):"delegated"]}),tenant.admin_consented_at?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:t("Consentement donn\xe9 le :")})," ",new Date(tenant.admin_consented_at).toLocaleString((0,locales.O)(),{timeZone:"Europe/Paris"})]}):null,/*#__PURE__*/(0,jsx_runtime.jsx)(AdminConsentBlock,{variant:"reconnect"})]})]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(ExcelFilesSection,{enabled:true})]})}function AdminConsentBlock({variant="connect"}){const{t}=(0,es_index_js_.useTranslation)();const config=(0,useAppConfigConnectorSingle.C)();const startMutation=useStartAdminConsentMutation();const queryClient=(0,modern_index_js_.useQueryClient)();const[lastError,setLastError]=(0,index_js_.useState)(null);const handleResult=(0,index_js_.useCallback)(message=>{if(message.success){setLastError(null);queryClient.invalidateQueries({queryKey:["microsoft","tenant",config.company]})}else setLastError(message.errorDescription??message.error??t("\xc9chec du consentement Microsoft"))},[queryClient,config.company]);const{openPopup,isOpen}=useMicrosoftConsentPopup({onResult:handleResult});const handleConnect=(0,index_js_.useCallback)(async()=>{setLastError(null);try{const returnTo=window.location.href;const{url}=await startMutation.mutateAsync({returnTo});openPopup(url)}catch(err){setLastError(err instanceof Error?err.message:String(err))}},[startMutation,openPopup]);const isConnecting=startMutation.isPending||isOpen;const label="reconnect"===variant?"Reconnecter Microsoft":"Connecter Microsoft";return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"reconnect"===variant?"light":"filled",onClick:handleConnect,loading:isConnecting,children:label}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:[t("Une fen\xeatre Microsoft va s’ouvrir : connecte-toi avec un compte")," ",/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"administrateur"})," ",t('Microsoft 365, puis clique sur "Accepter".')]})]}),lastError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:lastError}):null]})}function useGsheetFilesQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["google","gsheet-files",config.company],queryFn:async()=>{const response=await api.http.request({path:`/v1/google/${config.company}/gsheet/files`,method:"GET",format:"json"});return response.data.list},enabled,refetchOnWindowFocus:true})}function useGsheetFileDeleteMutation(){const{t}=(0,es_index_js_.useTranslation)();const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async fileId=>{const res=await api.http.request({path:`/v1/google/${config.company}/gsheet/files/${fileId}`,method:"DELETE",secure:true,format:"json"});return res.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:["google","gsheet-files",config.company]});esm_index_mjs_.notifications.show({title:t("Fichier supprim\xe9"),message:t("Le fichier ne sera plus propos\xe9 pour cette soci\xe9t\xe9.")})},onError:error=>{console.error(error);esm_index_mjs_.notifications.show({color:"red",title:"Erreur !",message:t("La suppression a \xe9chou\xe9. Veuillez r\xe9essayer plus tard.")})}})}const SPREADSHEET_URL_PATTERN=/\/spreadsheets\/d\/([a-zA-Z0-9_-]+)/;function normalizeSpreadsheetId(raw){const trimmed=raw.trim();const match=trimmed.match(SPREADSHEET_URL_PATTERN);if(match)return match[1];return trimmed}function readGsheetConnectorValues(initialData){const data=initialData??{};const mainRaw=data.Spreadsheet_Id;const mainId="string"==typeof mainRaw?mainRaw.trim():"";const secondaryRaw=data.secondarySheets;let secondarySheets=[];if("string"==typeof secondaryRaw&&""!==secondaryRaw.trim())secondarySheets=[secondaryRaw.trim()];if(Array.isArray(secondaryRaw))secondarySheets=secondaryRaw.filter(item=>"string"==typeof item).map(item=>item.trim());return{mainId,secondarySheets}}function cleanSecondarySheets(secondarySheets,mainId){const seen=new Set([mainId]);const cleaned=[];for(const rawItem of secondarySheets){const id=normalizeSpreadsheetId(rawItem);if(!(""===id||seen.has(id))){seen.add(id);cleaned.push(id)}}return cleaned}function GsheetFilesManager({config,save}){const{t}=(0,es_index_js_.useTranslation)();const filesQuery=useGsheetFilesQuery({enabled:true});const deleteFile=useGsheetFileDeleteMutation();const[values,setValues]=(0,index_js_.useState)({mainId:"",secondarySheets:[]});const[confirmDeleteId,setConfirmDeleteId]=(0,index_js_.useState)(null);const[confirmRemoveIndex,setConfirmRemoveIndex]=(0,index_js_.useState)(null);const initializedRef=(0,index_js_.useRef)(false);(0,index_js_.useEffect)(()=>{if(config.data&&!initializedRef.current){setValues(readGsheetConnectorValues(config.data.initialData));initializedRef.current=true}},[config.data]);const nameById=(0,index_js_.useMemo)(()=>{const map=new Map;for(const file of filesQuery.data??[])if(file.spreadsheet_name)map.set(file.spreadsheet_id,file.spreadsheet_name);return map},[filesQuery.data]);const knownUnreferenced=(0,index_js_.useMemo)(()=>{const referenced=new Set([values.mainId,...values.secondarySheets]);return(filesQuery.data??[]).filter(file=>!referenced.has(file.spreadsheet_id))},[filesQuery.data,values]);const updateMain=raw=>{setValues(prev=>({...prev,mainId:normalizeSpreadsheetId(raw)}))};const updateSecondary=(index,raw)=>{setValues(prev=>{const next=[...prev.secondarySheets];next[index]=normalizeSpreadsheetId(raw);return{...prev,secondarySheets:next}})};const addSecondary=id=>{setValues(prev=>({...prev,secondarySheets:[...prev.secondarySheets,id]}))};const buildPayload=secondarySheets=>{const mainId=normalizeSpreadsheetId(values.mainId);return{...config.data?.initialData??{},share:true,Spreadsheet_Id:mainId,secondarySheets:cleanSecondarySheets(secondarySheets,mainId)}};const removeSecondaryFully=index=>{const removedId=normalizeSpreadsheetId(values.secondarySheets[index]);const next=values.secondarySheets.filter((_,i)=>i!==index);setValues(prev=>({...prev,secondarySheets:next}));save.mutate(buildPayload(next));const known=(filesQuery.data??[]).find(file=>file.spreadsheet_id===removedId);if(known)deleteFile.mutate(known.id)};const handleSave=()=>{save.mutate(buildPayload(values.secondarySheets))};if(config.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement du connecteur...")});if(config.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:t("Impossible de charger la configuration du connecteur.")});const nameCell=id=>{const name=nameById.get(id);if(name)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:500,children:name});if(""===id)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fs:"italic",children:"Nouvelle feuille"});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fs:"italic",children:filesQuery.isPending?"...":"Nom inconnu"})};const openCell=id=>{if(""===id)return null;return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{href:`https://docs.google.com/spreadsheets/d/${id}/edit`,target:"_blank",rel:"noreferrer",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconExternalLink,{size:14}),"ouvrir"]})})};return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:t("Fichiers Google Sheets synchronis\xe9s")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("L'identifiant d'un tableur se trouve dans l'URL du fichier, juste apr\xe8s \xab https://docs.google.com/spreadsheets/d/ \xbb. Vous pouvez coller l'URL compl\xe8te : elle est convertie automatiquement. En cas de doute, nous nous chargeons de la cr\xe9ation du fichier Google Sheets et du param\xe9trage.")})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table,{verticalSpacing:"sm",highlightOnHover:true,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Thead,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:"30%",children:"Fichier"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Identifiant"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:90,children:"Lien"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{w:210})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tbody,{children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(values.mainId)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{value:values.mainId,onChange:e=>updateMain(e.currentTarget.value),placeholder:t("Id du tableur principal"),required:true,autoComplete:"off"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(values.mainId)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{variant:"light",children:"Principal"})})]}),values.secondarySheets.map((id,index)=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.TextInput,{value:id,onChange:e=>updateSecondary(index,e.currentTarget.value),placeholder:t("Id ou URL du tableur"),autoComplete:"off"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",color:"red",variant:confirmRemoveIndex===index?"filled":"light",onClick:()=>{if(confirmRemoveIndex===index){setConfirmRemoveIndex(null);removeSecondaryFully(index)}else setConfirmRemoveIndex(index)},onBlur:()=>setConfirmRemoveIndex(null),children:confirmRemoveIndex===index?"Confirmer ?":t("Supprimer")})})]},`secondary-${index}`)),knownUnreferenced.map(file=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:nameCell(file.spreadsheet_id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",style:{wordBreak:"break-all"},children:file.spreadsheet_id})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:openCell(file.spreadsheet_id)}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:"xs",wrap:"nowrap",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlus,{size:14}),onClick:()=>addSecondary(file.spreadsheet_id),children:t("Ajouter")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{size:"xs",color:"red",variant:confirmDeleteId===file.id?"filled":"subtle",loading:deleteFile.isPending&&deleteFile.variables===file.id,onClick:()=>{if(confirmDeleteId===file.id){setConfirmDeleteId(null);deleteFile.mutate(file.id)}else setConfirmDeleteId(file.id)},onBlur:()=>setConfirmDeleteId(null),children:confirmDeleteId===file.id?"Confirmer ?":t("Supprimer")})]})})]},`known-${file.spreadsheet_id}`))]})]}),filesQuery.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"yellow",title:"Noms indisponibles",children:t("Impossible de charger les noms des fichiers ; les identifiants restent modifiables.")}):null,/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"default",size:"xs",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlus,{size:14}),onClick:()=>addSecondary(""),children:t("Ajouter une feuille")})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{onClick:handleSave,loading:save.isPending,disabled:""===normalizeSpreadsheetId(values.mainId),children:"Sauvegarder"})})]})})}function pennylaneOauthStatusQueryKey(company){return["pennylane","oauth-status",company]}function usePennylaneOauthStatusQuery(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:pennylaneOauthStatusQueryKey(config.company),queryFn:async()=>{const response=await api.pennylane.getStatusV1({cid:config.company});return response.data},refetchOnWindowFocus:true,refetchOnReconnect:true,retry:false})}function usePennylaneOauthDisconnectMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();const queryClient=(0,modern_index_js_.useQueryClient)();return(0,modern_index_js_.useMutation)({mutationFn:async()=>{const response=await api.pennylane.disconnectV1({cid:config.company});return response.data},onSuccess:()=>{queryClient.invalidateQueries({queryKey:pennylaneOauthStatusQueryKey(config.company)})}})}function usePennylaneOauthStartMutation(){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useMutation)({mutationFn:async({returnTo})=>{const response=await api.pennylane.startOauthV1({cid:config.company,returnTo});return response.data}})}function isOauthMessage(value){if("object"!=typeof value||null===value)return false;const v=value;return"airporting-pennylane-oauth"===v.type}const usePennylaneOauthPopup_POPUP_NAME="airporting-pennylane-oauth";const usePennylaneOauthPopup_POPUP_FEATURES="width=600,height=720,resizable,scrollbars";function usePennylaneOauthPopup({onResult}){const{t}=(0,es_index_js_.useTranslation)();const[isOpen,setIsOpen]=(0,index_js_.useState)(false);const popupRef=(0,index_js_.useRef)(null);const pollRef=(0,index_js_.useRef)(null);const stopPolling=(0,index_js_.useCallback)(()=>{if(null!==pollRef.current){window.clearInterval(pollRef.current);pollRef.current=null}},[]);const closePopup=(0,index_js_.useCallback)(()=>{if(popupRef.current&&!popupRef.current.closed)popupRef.current.close();popupRef.current=null;setIsOpen(false);stopPolling()},[stopPolling]);(0,index_js_.useEffect)(()=>{const handler=event=>{if(!isOauthMessage(event.data))return;onResult(event.data);closePopup()};window.addEventListener("message",handler);return()=>{window.removeEventListener("message",handler)}},[onResult,closePopup]);(0,index_js_.useEffect)(()=>()=>{closePopup()},[closePopup]);const openPopup=(0,index_js_.useCallback)(url=>{const popup=window.open(url,usePennylaneOauthPopup_POPUP_NAME,usePennylaneOauthPopup_POPUP_FEATURES);if(!popup)throw new Error(t("Impossible d’ouvrir la fen\xeatre Pennylane (popup bloqu\xe9 par le navigateur ?)"));popupRef.current=popup;setIsOpen(true);stopPolling();pollRef.current=window.setInterval(()=>{if(popupRef.current?.closed)closePopup()},500)},[closePopup,stopPolling]);return{openPopup,closePopup,isOpen}}function PennylaneOauthPanel(){const{t}=(0,es_index_js_.useTranslation)();const statusQuery=usePennylaneOauthStatusQuery();if(statusQuery.isPending)return/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement de la connexion Pennylane...")});if(statusQuery.isError)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:t("Erreur de chargement"),children:t("Impossible de r\xe9cup\xe9rer le statut de connexion Pennylane pour cette entreprise.")});if(statusQuery.data.connected)return/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectedView,{status:statusQuery.data});return/*#__PURE__*/(0,jsx_runtime.jsx)(DisconnectedView,{})}function ConnectButton({variant}){const{t}=(0,es_index_js_.useTranslation)();const config=(0,useAppConfigConnectorSingle.C)();const startMutation=usePennylaneOauthStartMutation();const queryClient=(0,modern_index_js_.useQueryClient)();const[lastError,setLastError]=(0,index_js_.useState)(null);const handleResult=(0,index_js_.useCallback)(message=>{if(message.success){setLastError(null);queryClient.invalidateQueries({queryKey:pennylaneOauthStatusQueryKey(config.company)})}else setLastError(message.errorDescription??message.error??t("\xc9chec de la connexion Pennylane"))},[queryClient,config.company]);const{openPopup,isOpen}=usePennylaneOauthPopup({onResult:handleResult});const handleConnect=(0,index_js_.useCallback)(async()=>{setLastError(null);try{const returnTo=window.location.href;const{url}=await startMutation.mutateAsync({returnTo});openPopup(url)}catch(err){setLastError(err instanceof Error?err.message:String(err))}},[startMutation,openPopup]);const isConnecting=startMutation.isPending||isOpen;const label="reconnect"===variant?"Reconnecter Pennylane":"Connecter Pennylane";return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"reconnect"===variant?"light":"filled",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconPlugConnected,{size:18}),onClick:handleConnect,loading:isConnecting,children:label}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"xs",children:t("Une fen\xeatre Pennylane va s’ouvrir : connecte-toi et autorise Airporting, puis reviens sur cette page.")})]}),lastError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Erreur",children:lastError}):null]})}function DisconnectedView(){const{t}=(0,es_index_js_.useTranslation)();return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:"Connexion Pennylane"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("Connecte ton compte Pennylane en un clic via OAuth. Airporting acc\xe8de \xe0 ta comptabilit\xe9 sans que tu aies \xe0 copier une cl\xe9 API.")})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"gray",size:"lg",children:t("Non connect\xe9")})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectButton,{variant:"connect"})]})})}function ConnectedView({status}){const{t}=(0,es_index_js_.useTranslation)();const disconnectMutation=usePennylaneOauthDisconnectMutation();return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"lg",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{justify:"space-between",align:"flex-start",children:[/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,fz:"lg",children:t("Pennylane connect\xe9")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("Airporting acc\xe8de \xe0 ta comptabilit\xe9 Pennylane via OAuth.")})]}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"green",size:"lg",children:t("Connect\xe9")})]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:4,children:[status.pennylaneCompanyId?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:"Dossier Pennylane\xa0:"})," ",/*#__PURE__*/(0,jsx_runtime.jsx)("code",{children:status.pennylaneCompanyId})]}):null,status.accessTokenExpiresAt?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{fz:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)("b",{children:t("Jeton valide jusqu’au :")})," ",new Date(status.accessTokenExpiresAt).toLocaleString((0,locales.O)(),{timeZone:"Europe/Paris"})]}):null,status.scopes&&status.scopes.length>0?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsx)(es_index_js_.Trans,{i18nKey:"<1>Autorisations :</1> {{count}} accord\xe9es",values:{count:status.scopes.length},components:{1:/*#__PURE__*/(0,jsx_runtime.jsx)("b",{})}})}):null]}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{mt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectButton,{variant:"reconnect"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"subtle",color:"red",loading:disconnectMutation.isPending,onClick:()=>disconnectMutation.mutate(),children:t("D\xe9connecter")})]})]})})}function PennylaneConfigPanel({apiKeyForm}){const{t}=(0,es_index_js_.useTranslation)();const[advancedOpen,setAdvancedOpen]=(0,index_js_.useState)(false);return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"md",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(PennylaneOauthPanel,{}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Card,{withBorder:true,padding:"md",radius:"md",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"xs",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{component:"button",type:"button",onClick:()=>setAdvancedOpen(s=>!s),underline:"never",c:"dimmed",fz:"sm",children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:4,children:[advancedOpen?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronUp,{size:14}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:14}),t("M\xe9thode cl\xe9 API (avanc\xe9)")]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:advancedOpen,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:"sm",pt:"sm",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{c:"dimmed",fz:"sm",children:t("Si tu pr\xe9f\xe8res connecter Pennylane avec une cl\xe9 API plut\xf4t que par OAuth, saisis-la ici. La connexion OAuth ci-dessus reste la m\xe9thode recommand\xe9e.")}),apiKeyForm]})})]})})]})}function useConnectorHistoryQuery({enabled}){const api=useApiConnectorSingle();const config=(0,useAppConfigConnectorSingle.C)();return(0,modern_index_js_.useQuery)({queryKey:["connector","history",config.company,config.connector],queryFn:async()=>await api.connectors.getConnectorHistoryV1({cid:config.company,connector:+config.connector}).then(x=>x.data),enabled,refetchOnWindowFocus:false})}function libelleAction(action,t){const libelles={created:t("Cr\xe9ation"),data_updated:t("Modification"),renamed:t("Renommage"),deleted:t("Suppression"),secrets_revealed:t("Consultation des identifiants")};return libelles[action]??action}function formatDate(iso){const d=new Date(iso);if(Number.isNaN(d.getTime()))return iso;return d.toLocaleString((0,locales.O)(),{day:"2-digit",month:"2-digit",year:"2-digit",hour:"2-digit",minute:"2-digit"})}function PastilleIdentite({source}){const{t}=(0,es_index_js_.useTranslation)();if("reveal_token"===source)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{multiline:true,w:280,label:t("Identit\xe9 v\xe9rifi\xe9e : cette action a demand\xe9 une r\xe9-authentification par mot de passe."),withArrow:true,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"teal",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconShieldCheck,{size:12}),children:t("V\xe9rifi\xe9e")})});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{multiline:true,w:280,label:t("Identit\xe9 d\xe9clar\xe9e : le nom vient de l'application appelante et n'a pas \xe9t\xe9 prouv\xe9. \xc0 lire comme une indication, pas comme une preuve."),withArrow:true,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Badge,{color:"gray",variant:"light",leftSection:/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconShieldQuestion,{size:12}),children:t("D\xe9clar\xe9e")})})}function Champs({champs}){const{t}=(0,es_index_js_.useTranslation)();if(0===champs.length)return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"xs",c:"dimmed",children:t("aucun changement")});return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{gap:4,children:champs.map(champ=>/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Code,{fz:"xs",children:champ},champ))})}function Lignes({entries}){const{t}=(0,es_index_js_.useTranslation)();return/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.ScrollContainer,{minWidth:640,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table,{striped:true,highlightOnHover:true,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Thead,{children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Date"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Action"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:t("Par")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:t("Identit\xe9")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Th,{children:"Champs"})]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Tbody,{children:entries.map((entry,index)=>/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Table.Tr,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:formatDate(entry.date)})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:libelleAction(entry.action,t)})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{size:"sm",children:entry.userEmail??"utilisateur inconnu"})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(PastilleIdentite,{source:entry.identitySource})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Table.Td,{children:/*#__PURE__*/(0,jsx_runtime.jsx)(Champs,{champs:entry.changedFields})})]},`${entry.date}-${entry.action}-${index}`))})]})})}function ConnectorHistory(){const{t}=(0,es_index_js_.useTranslation)();const[ouvert,setOuvert]=(0,index_js_.useState)(false);const historique=useConnectorHistoryQuery({enabled:ouvert});const entries=historique.data?.entries??[];return/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:0,mt:"xl",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.UnstyledButton,{onClick:()=>setOuvert(o=>!o),style:{width:"100%",padding:"8px 0"},children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{gap:"xs",children:[ouvert?/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronDown,{size:16}):/*#__PURE__*/(0,jsx_runtime.jsx)(tabler_icons_react_mjs_.IconChevronRight,{size:16}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{fw:600,children:t("Historique des acc\xe8s et des modifications")}),ouvert&&historique.isSuccess?/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Text,{c:"dimmed",children:["(",entries.length,")"]}):null]})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Collapse,{in:ouvert,children:historique.isLoading?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement de l'historique...")}):historique.isError?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"red",title:"Historique indisponible",children:t("Nous n'avons pas pu charger l'historique de ce connecteur.")}):0===entries.length?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"blue",title:t("Aucune action enregistr\xe9e"),children:t("L'historique ne remonte pas avant la mise en place de la journalisation. Les prochaines modifications et consultations des identifiants appara\xeetront ici.")}):/*#__PURE__*/(0,jsx_runtime.jsx)(Lignes,{entries:entries})})]})}function SingleConnectorApp(){const{t}=(0,es_index_js_.useTranslation)();const config=(0,useAppConfigConnectorSingle.C)();const itemRes=useConnectorSingleQuery();const item=itemRes.data;const configRes=useConnectorConfigQuery({enabled:!!item?.hasForm});const{save:saveFn,reauthModal}=useConnectorSaveWithStepUp();const revealContext={fetchSecrets:revealToken=>fetchConnectorAuthSecrets({api:config.api,token:config.token,owner:config.owner,company:config.company,connector:config.connector,revealToken})};const[editing,setEditing]=(0,index_js_.useState)(false);const[draft,setDraft]=(0,index_js_.useState)("");const renameMutation=useConnectorRenameMutation();const refreshAccountsMutation=useConnectorRefreshAccountsMutation();(0,index_js_.useEffect)(()=>{if(item?.name)setDraft(item.name)},[item?.name]);const handleSave=()=>{renameMutation.mutate(draft,{onSuccess:()=>setEditing(false)})};const handleCancel=()=>{if(item?.name)setDraft(item.name);setEditing(false)};const backLink={text:t("Liste des connecteurs"),tab:""};switch(item?.status){case"active":backLink.tab="?tab=active";backLink.text="Connecteurs actifs";break;case"ill":backLink.tab="?tab=ill";backLink.text=t("Connecteurs \xe0 configurer");break}const isFormLoading=!item||item.hasForm&&!configRes.data;return/*#__PURE__*/(0,jsx_runtime.jsxs)(jsx_runtime.Fragment,{children:[reauthModal,/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{py:10,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{gap:0,children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Title,{w:"fit-content",mb:0,order:1,children:t("Nos connecteurs")}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Text,{w:"fit-content",mb:0,c:"dimmed",fz:"h5",children:"Synchronisez vos comptes bancaires et outils comptables facilement."}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{py:10,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Anchor,{underline:"never",href:`/company/${config.company}/integrations/connectors${backLink.tab}`,children:/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Group,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.Circle,{bg:"dark.4",size:24,ml:"auto",c:"white",children:/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.IconArrowUp,{rotate:270})}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Title,{w:"fit-content",c:"white",mb:0,order:3,children:backLink.text})]})})})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Grid,{w:"100%",children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Grid.Col,{span:{base:12,lg:3},children:item?/*#__PURE__*/(0,jsx_runtime.jsx)(connector_bubble.q,{connector:item,rename:{editing,draft,isPending:renameMutation.isPending,onDraftChange:setDraft,onSave:handleSave,onCancel:handleCancel,onStartEditing:()=>setEditing(true)}}):/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Stack,{children:[/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:64,width:64,radius:"md"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:28,width:"60%"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:16,width:"80%"}),/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Skeleton,{height:16,width:"70%"})]})}),/*#__PURE__*/(0,jsx_runtime.jsxs)(index_mjs_.Grid.Col,{span:{base:12,lg:9},children:[!isFormLoading&&item.supportsAccountDiscovery?/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Group,{justify:"flex-end",mb:10,children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Tooltip,{label:t("Red\xe9couvre les comptes de ce connecteur pour alimenter les s\xe9lecteurs de compte des synchronisations. L'enregistrement du formulaire le fait d\xe9j\xe0 tout seul."),children:/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Button,{variant:"light",size:"xs",loading:refreshAccountsMutation.isPending,onClick:()=>refreshAccountsMutation.mutate(),children:t("Rafra\xeechir les comptes")})})}):null,isFormLoading?/*#__PURE__*/(0,jsx_runtime.jsx)(InlineLoader.F,{label:t("Chargement du connecteur...")}):item.requiresMicrosoftConsent?/*#__PURE__*/(0,jsx_runtime.jsx)(MicrosoftConsentPanel,{}):item.hasForm?/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.IdentityGate,{description:t("Ce formulaire porte les identifiants de connexion \xe0 ce connecteur."),children:"google_sheet"===item.main_connectorlist.codename?/*#__PURE__*/(0,jsx_runtime.jsx)(GsheetFilesManager,{config:configRes,save:saveFn}):"pennylane"===item.main_connectorlist.codename?/*#__PURE__*/(0,jsx_runtime.jsx)(PennylaneConfigPanel,{apiKeyForm:/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.DynamicForm,{config:()=>configRes,save:saveFn,revealContext:revealContext})}):/*#__PURE__*/(0,jsx_runtime.jsx)(dist_index_js_.DynamicForm,{config:()=>configRes,save:saveFn,revealContext:revealContext})}):/*#__PURE__*/(0,jsx_runtime.jsx)(index_mjs_.Alert,{color:"blue",title:t("Aucune configuration n\xe9cessaire"),children:item.isBridge?t("Ce connecteur est g\xe9r\xe9 via Bridge. Il n’y a rien \xe0 configurer ici."):t("Ce connecteur ne n\xe9cessite aucune configuration.")}),item?/*#__PURE__*/(0,jsx_runtime.jsx)(ConnectorHistory,{}):null]})]})]})}}}]);
@@ -0,0 +1,10 @@
1
+ /*! For license information please see 5731.js.LICENSE.txt */
2
+ "use strict";(globalThis["chunk_integrations_app"]=globalThis["chunk_integrations_app"]||[]).push([["5731"],{9698:function(__unused_webpack_module,exports){/**
3
+ * @license React
4
+ * react-jsx-runtime.production.js
5
+ *
6
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
7
+ *
8
+ * This source code is licensed under the MIT license found in the
9
+ * LICENSE file in the root directory of this source tree.
10
+ */var REACT_ELEMENT_TYPE=Symbol.for("react.transitional.element"),REACT_FRAGMENT_TYPE=Symbol.for("react.fragment");function jsxProd(type,config,maybeKey){var key=null;void 0!==maybeKey&&(key=""+maybeKey);void 0!==config.key&&(key=""+config.key);if("key"in config){maybeKey={};for(var propName in config)"key"!==propName&&(maybeKey[propName]=config[propName])}else maybeKey=config;config=maybeKey.ref;return{$$typeof:REACT_ELEMENT_TYPE,type:type,key:key,ref:void 0!==config?config:null,props:maybeKey}}exports.Fragment=REACT_FRAGMENT_TYPE;exports.jsx=jsxProd;exports.jsxs=jsxProd},4848:function(module,__unused_webpack_exports,__webpack_require__){module.exports=__webpack_require__(9698)},108:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{tr:()=>tr,o:()=>registerTranslations,O:()=>formatLocale});var index_js_=__webpack_require__(6155);var main_namespaceObject=JSON.parse('{"Connecteur supprim\xe9":"","Vous pouvez le r\xe9ajouter depuis le catalogue.":"","Suppression \xe9chou\xe9e":"","R\xe9essayez dans un instant.":"","Rien \xe0 rafra\xeechir":"","Ce connecteur n\'a pas de comptes \xe0 d\xe9couvrir.":"","Rafra\xeechissement lanc\xe9":"","Les comptes seront \xe0 jour dans quelques minutes, le temps que la t\xe2che passe.":"","Rafra\xeechissement \xe9chou\xe9":"","Connecteur renomm\xe9":"","Le nom a \xe9t\xe9 mis \xe0 jour avec succ\xe8s.":"","Renommage \xe9chou\xe9":"","Connecteur sauvegard\xe9":"","Vos donn\xe9es sont enregistr\xe9es !":"","R\xe9-authentification annul\xe9e":"","Fichier valid\xe9":"","Fichier rejet\xe9 par la validation":"","Le fichier peut \xeatre import\xe9 dans le grand livre analytique.":"","Associez les colonnes du fichier aux champs Airporting.":"","Corrigez les erreurs avant de relancer un upload.":"","Aucun import s\xe9lectionn\xe9.":"","Mapping valid\xe9":"","Mapping \xe0 corriger":"","Corrigez les champs obligatoires ou les lignes en erreur.":"","Import appliqu\xe9":"","Les lignes ont \xe9t\xe9 ajout\xe9es au grand livre analytique.":"","Import supprim\xe9":"","Les lignes du grand livre analytique li\xe9es \xe0 cet import ont \xe9t\xe9 retir\xe9es.":"","T\xe9l\xe9chargement impossible":"","Fichier supprim\xe9":"","Le fichier ne sera plus propos\xe9 pour cette soci\xe9t\xe9.":"","La suppression a \xe9chou\xe9. Veuillez r\xe9essayer plus tard.":"","Impossible d\'ajouter la t\xe2che.":"","Impossible de supprimer la t\xe2che.":"","T\xe2che renomm\xe9e":"","Le nouveau nom a bien \xe9t\xe9 enregistr\xe9.":"","Impossible de renommer la t\xe2che.":"","T\xe2che lanc\xe9e":"","La t\xe2che a d\xe9marr\xe9.":"","Impossible de lancer la t\xe2che.":"","Configuration sauvegard\xe9e":"","Les param\xe8tres sont enregistr\xe9s.":"","Impossible de sauvegarder la configuration.":"","Impossible de modifier la t\xe2che.":"","Recette lanc\xe9e":"","La synchronisation a d\xe9marr\xe9.":"","Impossible de lancer la recette.":"","Annulation demand\xe9e":"","La t\xe2che a \xe9t\xe9 annul\xe9e avant de d\xe9marrer.":"","La t\xe2che \xe9tait d\xe9j\xe0 termin\xe9e.":"","La t\xe2che va s\'arr\xeater d\'ici quelques secondes.":"","Annulation non confirm\xe9e":"","L\'API n\'a pas r\xe9pondu, mais la demande a pu \xeatre prise en compte : v\xe9rifiez le statut de la t\xe2che dans quelques secondes.":"","Arr\xeater cette t\xe2che ?":"","La t\xe2che est interrompue en pleine ex\xe9cution : les donn\xe9es d\xe9j\xe0 \xe9crites restent en place, relancer la synchronisation les remettra \xe0 jour.":"","Impossible de modifier la recette.":"","Actions du connecteur":"","Supprimer":"","Annuler":"","Cr\xe9ation":"","Modification":"","Renommage":"","Suppression":"","Consultation des identifiants":"","Identit\xe9 v\xe9rifi\xe9e : cette action a demand\xe9 une r\xe9-authentification par mot de passe.":"","V\xe9rifi\xe9e":"","Identit\xe9 d\xe9clar\xe9e : le nom vient de l\'application appelante et n\'a pas \xe9t\xe9 prouv\xe9. \xc0 lire comme une indication, pas comme une preuve.":"","D\xe9clar\xe9e":"","aucun changement":"","Par":"","Identit\xe9":"","Historique des acc\xe8s et des modifications":"","Chargement de l\'historique...":"","Nous n\'avons pas pu charger l\'historique de ce connecteur.":"","Aucune action enregistr\xe9e":"","L\'historique ne remonte pas avant la mise en place de la journalisation. Les prochaines modifications et consultations des identifiants appara\xeetront ici.":"","Le connecteur <1>{{nom}}</1> est actuellement actif. Sa suppression arr\xeatera la synchronisation et le retirera de la liste. Vous pourrez le r\xe9ajouter depuis le catalogue plus tard.":"","Pour confirmer, tapez <1>DELETE</1> ci-dessous.":"","{{count}} m\xe9thode_one":"","{{count}} m\xe9thode_other":"","Rechercher un connecteur...":"","Choisir une m\xe9thode de connexion :":"","Tous vos connecteurs en marche":"","Tous vos connecteurs \xe0 configurer":"","Chargement du connecteur...":"","Impossible de charger la configuration du connecteur.":"","Fichiers Google Sheets synchronis\xe9s":"","L\'identifiant d\'un tableur se trouve dans l\'URL du fichier, juste apr\xe8s \xab https://docs.google.com/spreadsheets/d/ \xbb. Vous pouvez coller l\'URL compl\xe8te : elle est convertie automatiquement. En cas de doute, nous nous chargeons de la cr\xe9ation du fichier Google Sheets et du param\xe9trage.":"","Id du tableur principal":"","Id ou URL du tableur":"","Ajouter":"","Impossible de charger les noms des fichiers ; les identifiants restent modifiables.":"","Ajouter une feuille":"","Renseigne une URL SharePoint d’un fichier Excel":"","Impossible de r\xe9soudre cette URL c\xf4t\xe9 Microsoft":"","Fichiers Excel \xe0 synchroniser":"","Ajoute les fichiers Excel qu’Airporting doit alimenter. Colle l’URL de partage d’un fichier":"",", on r\xe9cup\xe8re automatiquement son nom et son identifiant.":"","Chargement des fichiers...":"","Impossible de charger la liste des fichiers Excel.":"","ajout\xe9 le {{date}}":"","ouvrir sur SharePoint":"","Supprimer ce fichier":"","Aucun fichier Excel ajout\xe9 pour le moment.":"","URL SharePoint du fichier Excel":"","On interroge Microsoft Graph pour r\xe9cup\xe9rer le nom du fichier avant de l’enregistrer.":"","Fichier trouv\xe9":"","Chargement du tenant Microsoft...":"","Erreur de chargement":"","Impossible de r\xe9cup\xe9rer le statut Microsoft pour cette entreprise.":"","Vos fichiers sont h\xe9berg\xe9s chez Airporting":"","On cr\xe9e et alimente les fichiers Excel directement sur le SharePoint Airporting. Rien \xe0 configurer c\xf4t\xe9 Microsoft, et tu peux y acc\xe9der via le lien de partage qu’on te fournit.":"","Pr\xe9f\xe9rer h\xe9berger sur votre propre SharePoint d’entreprise ?":"","Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un <1>administrateur Microsoft 365</1> (r\xf4le <3>Global Administrator</3> ou \xe9quivalent).":"","SharePoint d’entreprise connect\xe9":"","Airporting \xe9crit dans les fichiers Excel h\xe9berg\xe9s sur votre propre tenant Microsoft 365.":"","Connect\xe9":"","app-only (recommand\xe9)":"","Consentement donn\xe9 le :":"","\xc9chec du consentement Microsoft":"","Une fen\xeatre Microsoft va s’ouvrir : connecte-toi avec un compte":"","Microsoft 365, puis clique sur \\"Accepter\\".":"","Impossible d’ouvrir la fen\xeatre Microsoft (popup bloqu\xe9 par le navigateur ?)":"","Activez les notifications pour \xeatre pr\xe9venu de la fin de vos syncros.":"","M\xe9thode cl\xe9 API (avanc\xe9)":"","Si tu pr\xe9f\xe8res connecter Pennylane avec une cl\xe9 API plut\xf4t que par OAuth, saisis-la ici. La connexion OAuth ci-dessus reste la m\xe9thode recommand\xe9e.":"","Chargement de la connexion Pennylane...":"","Impossible de r\xe9cup\xe9rer le statut de connexion Pennylane pour cette entreprise.":"","\xc9chec de la connexion Pennylane":"","Une fen\xeatre Pennylane va s’ouvrir : connecte-toi et autorise Airporting, puis reviens sur cette page.":"","Connecte ton compte Pennylane en un clic via OAuth. Airporting acc\xe8de \xe0 ta comptabilit\xe9 sans que tu aies \xe0 copier une cl\xe9 API.":"","Non connect\xe9":"","Pennylane connect\xe9":"","Airporting acc\xe8de \xe0 ta comptabilit\xe9 Pennylane via OAuth.":"","Jeton valide jusqu’au :":"","<1>Autorisations :</1> {{count}} accord\xe9es":"","D\xe9connecter":"","Impossible d’ouvrir la fen\xeatre Pennylane (popup bloqu\xe9 par le navigateur ?)":"","Activer les notifications":"","Souhaitez-vous activer les notifications du syst\xe8me d\'exploitation pour \xeatre pr\xe9venu de la fin de vos runs m\xeame si l\'onglet est en arri\xe8re-plan ?":"","Vous pouvez r\xe9pondre plus tard : la cloche fonctionnera quand m\xeame via les notifications dans l\'app.":"","Plus tard":"","5 premi\xe8res lignes brutes du fichier":"","Exemples pour v\xe9rifier vos associations":"",". Les badges indiquent l’usage de chaque colonne dans le mapping en cours.":"","Aucune ligne brute non vide \xe0 afficher.":"","En-t\xeates manquants":"","Nommez d\'abord les colonnes de donn\xe9es : {{colonnes}}.":"","Validez les associations de colonnes":"","Grand livre par compte, auto-d\xe9tect\xe9":"","Associez chaque donn\xe9e comptable \xe0 la colonne correspondante de votre fichier. Les champs marqu\xe9s obligatoires doivent tous \xeatre renseign\xe9s avant validation.":"","Le num\xe9ro de compte est lu dans les titres de section : vous ne devez pas l’associer.":"","La 1ʳᵉ ligne contient les en-t\xeates":"","Devise du dossier":"","Devise fonctionnelle des montants du fichier":"","Aucune devise":"","Noms des colonnes":"","{{count}} \xe0 nommer_one":"","{{count}} \xe0 nommer_other":"","Les noms proviennent de la 1ʳᵉ ligne. Compl\xe9tez les en-t\xeates vides.":"","Ce fichier n\'a pas d\'en-t\xeates : nommez les colonnes contenant des donn\xe9es.":"","En-t\xeates manquants pour :":"",". Nommez ces colonnes avant de valider le mapping.":"","Nom de la colonne":"","Date et libell\xe9 identifient l’\xe9criture ; le compte est d\xe9duit des titres de section.":"","Date, compte et libell\xe9 identifient l’\xe9criture.":"","S\xe9lectionnez ensuite comment le fichier porte les montants.":"","Aucune colonne":"","D\xe9bit + Cr\xe9dit (recommand\xe9)":"","Une colonne pour les d\xe9bits et une colonne pour les cr\xe9dits.":"","Montant unique sign\xe9 (mode alternatif)":"","Un montant positif devient un d\xe9bit ; un montant n\xe9gatif devient un cr\xe9dit.":"","D\xe9bit (obligatoire)":"","Cr\xe9dit (obligatoire)":"","Montant unique sign\xe9 (obligatoire)":"","Positif → d\xe9bit ; n\xe9gatif → cr\xe9dit":"","Associez ces donn\xe9es seulement si elles existent dans le fichier.":"","Valider le mapping":"","{{count}} lignes_one":"","{{count}} lignes_other":"","D\xe9bit":"","Cr\xe9dit":"","Afficher uniquement les lignes en erreur ({{nombre}})":"","Aper\xe7u limit\xe9 aux {{count}} premi\xe8res lignes_one":"","Aper\xe7u limit\xe9 aux {{count}} premi\xe8res lignes_other":"","Cet aper\xe7u sert au contr\xf4le visuel. Le fichier complet est pris en compte lors de l’import.":"","Aucune ligne \xe0 afficher avec ce filtre.":"","\xc9criture":"","Contr\xf4le":"","Fin de l’aper\xe7u : les lignes suivantes restent dans le fichier et ne sont pas simul\xe9es ici.":"","Mapping requis":"","Pr\xeat \xe0 importer":"","Import\xe9":"","En erreur":"","Supprim\xe9":"","Date":"","Compte":"","Libell\xe9":"","Journal":"","Num\xe9ro \xe9criture":"","Libell\xe9 compte":"","R\xe9f\xe9rence pi\xe8ce":"","Compte auxiliaire":"","Libell\xe9 auxiliaire":"","Axe analytique":"","Section analytique":"","Code analytique":"","Lettrage":"","Montant unique sign\xe9":"","\xc0 corriger":"","FEC : format standard homog\xe8ne, colonnes reconnues et import\xe9es automatiquement.":"","Export d\'\xe9critures : format libre. Vous devez associer les colonnes avant l\'import.":"","Importer ce fichier dans le grand livre analytique ?":"","lignes seront ajout\xe9es dans le grand livre analytique.":"","Supprimer cet import de fichier ?":"","Les lignes du grand livre analytique li\xe9es \xe0 cet import seront supprim\xe9es.":"","L\'import sera marqu\xe9 comme supprim\xe9.":"","Voir l\'aper\xe7u":"","T\xe9l\xe9charger le fichier import\xe9":"","Supprimer l\'import":"","Choisir un fichier":"",": format standard, colonnes reconnues et import\xe9es automatiquement.":"","(export d\'\xe9critures) : format libre, vous associerez les colonnes apr\xe8s l\'upload.":"","Filtrer par statut":"","Les imports supprim\xe9s et en erreur sont masqu\xe9s par d\xe9faut.":"","S\xe9lectionner les statuts":"","{{affiches}} affich\xe9 sur {{total}}_one":"","{{affiches}} affich\xe9 sur {{total}}_other":"","Impossible de charger les imports de fichiers.":"","Aucun import de fichier.":"","Aucun import ne correspond aux statuts s\xe9lectionn\xe9s.":"","P\xe9riode":"","Cr\xe9\xe9":"","\xc0 mapper":"","Tout d\xe9s\xe9lectionner":"","Tout s\xe9lectionner":"","Source non charg\xe9e : saisie manuelle de l\'identifiant.":"","Aucun code : saisie indisponible.":"","Cat\xe9gorie":"","Jour courant":"","D\xe9but du mois":"","D\xe9but du mois pr\xe9c\xe9dent":"","D\xe9but de l\'ann\xe9e":"","Fin du mois":"","Fin du mois pr\xe9c\xe9dent":"","Fin de l\'ann\xe9e":"","pass\xe9e":"","Ann\xe9e(s)":"","Chargement...":"","S\xe9lectionner un fichier Excel":"","S\xe9lectionner un tableur":"","Sch\xe9ma absent pour {{type}}":"","Supprimer la ligne":"","Tableur non partag\xe9 avec comptabilite@airporting.com ?":"","Fichier Excel introuvable ou inaccessible par l\'application Airporting ?":"","Onglet absent du tableur : il sera cr\xe9\xe9 \xe0 la premi\xe8re \xe9criture. V\xe9rifiez l\'orthographe s\'il devait d\xe9j\xe0 exister.":"","Choisissez d\'abord le tableur : la liste des onglets se remplira toute seule.":"","Liste des onglets indisponible ({{raison}}). {{piste}} Saisie manuelle.":"","Chargement des onglets...":"","Choisir un onglet, ou saisir un nouveau nom":"","ID compte":"","Nom du compte":"","IBAN":"","Flux retour":"","Devise":"","Montant":"","Attention, cet onglet est d\xe9j\xe0 pris :":"","(sans nom)":"","(vide)":"","Oui":"","Non":"","Champs modifi\xe9s":"","R\xe9glage":"","Entr\xe9e / virgule pour valider":"","Laisser vide pour conserver le mot de passe actuel":"","{{champ}} : voir la valeur actuelle":"","Type \xab {{type}} \xbb non support\xe9":"","Enregistrer":"","Supprimer {{count}} t\xe2che ?_one":"","Supprimer {{count}} t\xe2che ?_other":"","Cette action est irr\xe9versible. La configuration des t\xe2ches s\xe9lectionn\xe9es sera perdue.":"","d\xe9sactiv\xe9e":"","\xbb partag\xe9 avec :":"","Synchronisation d\xe9sactiv\xe9e":"","Plus d\'options":"","D\xe9sactiver cette t\xe2che ?":"","La t\xe2che ne sera plus ex\xe9cut\xe9e tant qu\'elle reste d\xe9sactiv\xe9e.":"","D\xe9sactiver":"","Supprimer cette t\xe2che ?":"","Cette action est irr\xe9versible. La configuration de la t\xe2che sera perdue.":"","S\xe9lectionner tout":"","{{count}} s\xe9lectionn\xe9e_one":"","{{count}} s\xe9lectionn\xe9e_other":"","R\xe9duire":"","Voir {{count}} job suppl\xe9mentaire_one":"","Voir {{count}} job suppl\xe9mentaire_other":"","Ajouter une fonction":"","S\xe9lectionner":"","Chargement…":"","Aucune fonction suppl\xe9mentaire disponible.":"","Choisir une fonction":"","Aucun r\xe9sultat":"","Voir les logs →":"","D\xe9tails techniques":"","Pas de d\xe9tails disponibles.":"","Aucun historique disponible.":"","T\xe2che":"","D\xe9marr\xe9e":"","Dur\xe9e":"","Planifi\xe9":"","Arr\xeater la t\xe2che":"","Annul\xe9e":"","\xc9criture Sheet… (":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur a \xe9chou\xe9 : {{detail}}":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur a \xe9chou\xe9":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur n\'a pas \xe9t\xe9 confirm\xe9e":"","Voir les logs":"","Renommer la t\xe2che":"","D\'autres synchros \xe9crivent sur l\'onglet \xab":"","\xbb de ce m\xeame spreadsheet :":"","V\xe9rifie que ce n\'est pas un \xe9crasement involontaire.":"","Rien \xe0 configurer pour cette t\xe2che.":"","Notifications activ\xe9es":"","Aucun d\xe9clencheur configur\xe9.":"","Ajouter un d\xe9clencheur":"","Modifier":"","Modifier le d\xe9clencheur":"","Nouveau d\xe9clencheur":"","Jour du mois":"","31 = dernier jour du mois (29 \xe0 31 retombent sur le dernier jour des mois plus courts).":"","Jobs \xe0 d\xe9clencher":"","Cr\xe9er":"","Notifications activ\xe9es, cliquer pour d\xe9sactiver":"","Activer les notifications pour cette synchro":"","Nos connecteurs":"","Connecteurs actifs ({{nombre}})":"","Connecteurs \xe0 configurer ({{nombre}})":"","Les autres connecteurs":"","Liste des connecteurs":"","Connecteurs \xe0 configurer":"","Red\xe9couvre les comptes de ce connecteur pour alimenter les s\xe9lecteurs de compte des synchronisations. L\'enregistrement du formulaire le fait d\xe9j\xe0 tout seul.":"","Rafra\xeechir les comptes":"","Ce formulaire porte les identifiants de connexion \xe0 ce connecteur.":"","Aucune configuration n\xe9cessaire":"","Ce connecteur est g\xe9r\xe9 via Bridge. Il n’y a rien \xe0 configurer ici.":"","Ce connecteur ne n\xe9cessite aucune configuration.":"","Chargement des synchronisations...":"","Aucune recette configur\xe9e.":"","S\xe9lectionnez une recette.":"","D\xe9clencheurs":"","Impossible de charger la recette.":"","Toutes les synchros":"","Historique : {{job}}":"","Historique des ex\xe9cutions":"","Source non charg\xe9e : saisie manuelle de l":"","Le connecteur":"","est actuellement actif. Sa suppression arr\xeatera la synchronisation et le retirera de la liste. Vous pourrez le r\xe9ajouter depuis le catalogue plus tard.":"","Pour confirmer, tapez":"","m\xe9thodes":"","ajout\xe9 le":"","Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un":"","(r\xf4le":"","ou \xe9quivalent).":"","accord\xe9es":"","\xe0 nommer":"","Aper\xe7u limit\xe9 aux":"","premi\xe8res lignes":"","affich\xe9":"","sur":"","annul\xe9e par":""}');var fr_main_namespaceObject=JSON.parse('{"Connecteur supprim\xe9":"","Vous pouvez le r\xe9ajouter depuis le catalogue.":"","Suppression \xe9chou\xe9e":"","R\xe9essayez dans un instant.":"","Rien \xe0 rafra\xeechir":"","Ce connecteur n\'a pas de comptes \xe0 d\xe9couvrir.":"","Rafra\xeechissement lanc\xe9":"","Les comptes seront \xe0 jour dans quelques minutes, le temps que la t\xe2che passe.":"","Rafra\xeechissement \xe9chou\xe9":"","Connecteur renomm\xe9":"","Le nom a \xe9t\xe9 mis \xe0 jour avec succ\xe8s.":"","Renommage \xe9chou\xe9":"","Connecteur sauvegard\xe9":"","Vos donn\xe9es sont enregistr\xe9es !":"","R\xe9-authentification annul\xe9e":"","Fichier valid\xe9":"","Fichier rejet\xe9 par la validation":"","Le fichier peut \xeatre import\xe9 dans le grand livre analytique.":"","Associez les colonnes du fichier aux champs Airporting.":"","Corrigez les erreurs avant de relancer un upload.":"","Aucun import s\xe9lectionn\xe9.":"","Mapping valid\xe9":"","Mapping \xe0 corriger":"","Corrigez les champs obligatoires ou les lignes en erreur.":"","Import appliqu\xe9":"","Les lignes ont \xe9t\xe9 ajout\xe9es au grand livre analytique.":"","Import supprim\xe9":"","Les lignes du grand livre analytique li\xe9es \xe0 cet import ont \xe9t\xe9 retir\xe9es.":"","T\xe9l\xe9chargement impossible":"","Fichier supprim\xe9":"","Le fichier ne sera plus propos\xe9 pour cette soci\xe9t\xe9.":"","La suppression a \xe9chou\xe9. Veuillez r\xe9essayer plus tard.":"","Impossible d\'ajouter la t\xe2che.":"","Impossible de supprimer la t\xe2che.":"","T\xe2che renomm\xe9e":"","Le nouveau nom a bien \xe9t\xe9 enregistr\xe9.":"","Impossible de renommer la t\xe2che.":"","T\xe2che lanc\xe9e":"","La t\xe2che a d\xe9marr\xe9.":"","Impossible de lancer la t\xe2che.":"","Configuration sauvegard\xe9e":"","Les param\xe8tres sont enregistr\xe9s.":"","Impossible de sauvegarder la configuration.":"","Impossible de modifier la t\xe2che.":"","Recette lanc\xe9e":"","La synchronisation a d\xe9marr\xe9.":"","Impossible de lancer la recette.":"","Annulation demand\xe9e":"","La t\xe2che a \xe9t\xe9 annul\xe9e avant de d\xe9marrer.":"","La t\xe2che \xe9tait d\xe9j\xe0 termin\xe9e.":"","La t\xe2che va s\'arr\xeater d\'ici quelques secondes.":"","Annulation non confirm\xe9e":"","L\'API n\'a pas r\xe9pondu, mais la demande a pu \xeatre prise en compte : v\xe9rifiez le statut de la t\xe2che dans quelques secondes.":"","Arr\xeater cette t\xe2che ?":"","La t\xe2che est interrompue en pleine ex\xe9cution : les donn\xe9es d\xe9j\xe0 \xe9crites restent en place, relancer la synchronisation les remettra \xe0 jour.":"","Impossible de modifier la recette.":"","Actions du connecteur":"","Supprimer":"","Annuler":"","Cr\xe9ation":"","Modification":"","Renommage":"","Suppression":"","Consultation des identifiants":"","Identit\xe9 v\xe9rifi\xe9e : cette action a demand\xe9 une r\xe9-authentification par mot de passe.":"","V\xe9rifi\xe9e":"","Identit\xe9 d\xe9clar\xe9e : le nom vient de l\'application appelante et n\'a pas \xe9t\xe9 prouv\xe9. \xc0 lire comme une indication, pas comme une preuve.":"","D\xe9clar\xe9e":"","aucun changement":"","Par":"","Identit\xe9":"","Historique des acc\xe8s et des modifications":"","Chargement de l\'historique...":"","Nous n\'avons pas pu charger l\'historique de ce connecteur.":"","Aucune action enregistr\xe9e":"","L\'historique ne remonte pas avant la mise en place de la journalisation. Les prochaines modifications et consultations des identifiants appara\xeetront ici.":"","Le connecteur <1>{{nom}}</1> est actuellement actif. Sa suppression arr\xeatera la synchronisation et le retirera de la liste. Vous pourrez le r\xe9ajouter depuis le catalogue plus tard.":"","Pour confirmer, tapez <1>DELETE</1> ci-dessous.":"","{{count}} m\xe9thode_one":"","{{count}} m\xe9thode_many":"","{{count}} m\xe9thode_other":"","Rechercher un connecteur...":"","Choisir une m\xe9thode de connexion :":"","Tous vos connecteurs en marche":"","Tous vos connecteurs \xe0 configurer":"","Chargement du connecteur...":"","Impossible de charger la configuration du connecteur.":"","Fichiers Google Sheets synchronis\xe9s":"","L\'identifiant d\'un tableur se trouve dans l\'URL du fichier, juste apr\xe8s \xab https://docs.google.com/spreadsheets/d/ \xbb. Vous pouvez coller l\'URL compl\xe8te : elle est convertie automatiquement. En cas de doute, nous nous chargeons de la cr\xe9ation du fichier Google Sheets et du param\xe9trage.":"","Id du tableur principal":"","Id ou URL du tableur":"","Ajouter":"","Impossible de charger les noms des fichiers ; les identifiants restent modifiables.":"","Ajouter une feuille":"","Renseigne une URL SharePoint d’un fichier Excel":"","Impossible de r\xe9soudre cette URL c\xf4t\xe9 Microsoft":"","Fichiers Excel \xe0 synchroniser":"","Ajoute les fichiers Excel qu’Airporting doit alimenter. Colle l’URL de partage d’un fichier":"",", on r\xe9cup\xe8re automatiquement son nom et son identifiant.":"","Chargement des fichiers...":"","Impossible de charger la liste des fichiers Excel.":"","ajout\xe9 le {{date}}":"","ouvrir sur SharePoint":"","Supprimer ce fichier":"","Aucun fichier Excel ajout\xe9 pour le moment.":"","URL SharePoint du fichier Excel":"","On interroge Microsoft Graph pour r\xe9cup\xe9rer le nom du fichier avant de l’enregistrer.":"","Fichier trouv\xe9":"","Chargement du tenant Microsoft...":"","Erreur de chargement":"","Impossible de r\xe9cup\xe9rer le statut Microsoft pour cette entreprise.":"","Vos fichiers sont h\xe9berg\xe9s chez Airporting":"","On cr\xe9e et alimente les fichiers Excel directement sur le SharePoint Airporting. Rien \xe0 configurer c\xf4t\xe9 Microsoft, et tu peux y acc\xe9der via le lien de partage qu’on te fournit.":"","Pr\xe9f\xe9rer h\xe9berger sur votre propre SharePoint d’entreprise ?":"","Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un <1>administrateur Microsoft 365</1> (r\xf4le <3>Global Administrator</3> ou \xe9quivalent).":"","SharePoint d’entreprise connect\xe9":"","Airporting \xe9crit dans les fichiers Excel h\xe9berg\xe9s sur votre propre tenant Microsoft 365.":"","Connect\xe9":"","app-only (recommand\xe9)":"","Consentement donn\xe9 le :":"","\xc9chec du consentement Microsoft":"","Une fen\xeatre Microsoft va s’ouvrir : connecte-toi avec un compte":"","Microsoft 365, puis clique sur \\"Accepter\\".":"","Impossible d’ouvrir la fen\xeatre Microsoft (popup bloqu\xe9 par le navigateur ?)":"","Activez les notifications pour \xeatre pr\xe9venu de la fin de vos syncros.":"","M\xe9thode cl\xe9 API (avanc\xe9)":"","Si tu pr\xe9f\xe8res connecter Pennylane avec une cl\xe9 API plut\xf4t que par OAuth, saisis-la ici. La connexion OAuth ci-dessus reste la m\xe9thode recommand\xe9e.":"","Chargement de la connexion Pennylane...":"","Impossible de r\xe9cup\xe9rer le statut de connexion Pennylane pour cette entreprise.":"","\xc9chec de la connexion Pennylane":"","Une fen\xeatre Pennylane va s’ouvrir : connecte-toi et autorise Airporting, puis reviens sur cette page.":"","Connecte ton compte Pennylane en un clic via OAuth. Airporting acc\xe8de \xe0 ta comptabilit\xe9 sans que tu aies \xe0 copier une cl\xe9 API.":"","Non connect\xe9":"","Pennylane connect\xe9":"","Airporting acc\xe8de \xe0 ta comptabilit\xe9 Pennylane via OAuth.":"","Jeton valide jusqu’au :":"","<1>Autorisations :</1> {{count}} accord\xe9es":"","D\xe9connecter":"","Impossible d’ouvrir la fen\xeatre Pennylane (popup bloqu\xe9 par le navigateur ?)":"","Activer les notifications":"","Souhaitez-vous activer les notifications du syst\xe8me d\'exploitation pour \xeatre pr\xe9venu de la fin de vos runs m\xeame si l\'onglet est en arri\xe8re-plan ?":"","Vous pouvez r\xe9pondre plus tard : la cloche fonctionnera quand m\xeame via les notifications dans l\'app.":"","Plus tard":"","5 premi\xe8res lignes brutes du fichier":"","Exemples pour v\xe9rifier vos associations":"",". Les badges indiquent l’usage de chaque colonne dans le mapping en cours.":"","Aucune ligne brute non vide \xe0 afficher.":"","En-t\xeates manquants":"","Nommez d\'abord les colonnes de donn\xe9es : {{colonnes}}.":"","Validez les associations de colonnes":"","Grand livre par compte, auto-d\xe9tect\xe9":"","Associez chaque donn\xe9e comptable \xe0 la colonne correspondante de votre fichier. Les champs marqu\xe9s obligatoires doivent tous \xeatre renseign\xe9s avant validation.":"","Le num\xe9ro de compte est lu dans les titres de section : vous ne devez pas l’associer.":"","La 1ʳᵉ ligne contient les en-t\xeates":"","Devise du dossier":"","Devise fonctionnelle des montants du fichier":"","Aucune devise":"","Noms des colonnes":"","{{count}} \xe0 nommer_one":"","{{count}} \xe0 nommer_many":"","{{count}} \xe0 nommer_other":"","Les noms proviennent de la 1ʳᵉ ligne. Compl\xe9tez les en-t\xeates vides.":"","Ce fichier n\'a pas d\'en-t\xeates : nommez les colonnes contenant des donn\xe9es.":"","En-t\xeates manquants pour :":"",". Nommez ces colonnes avant de valider le mapping.":"","Nom de la colonne":"","Date et libell\xe9 identifient l’\xe9criture ; le compte est d\xe9duit des titres de section.":"","Date, compte et libell\xe9 identifient l’\xe9criture.":"","S\xe9lectionnez ensuite comment le fichier porte les montants.":"","Aucune colonne":"","D\xe9bit + Cr\xe9dit (recommand\xe9)":"","Une colonne pour les d\xe9bits et une colonne pour les cr\xe9dits.":"","Montant unique sign\xe9 (mode alternatif)":"","Un montant positif devient un d\xe9bit ; un montant n\xe9gatif devient un cr\xe9dit.":"","D\xe9bit (obligatoire)":"","Cr\xe9dit (obligatoire)":"","Montant unique sign\xe9 (obligatoire)":"","Positif → d\xe9bit ; n\xe9gatif → cr\xe9dit":"","Associez ces donn\xe9es seulement si elles existent dans le fichier.":"","Valider le mapping":"","{{count}} lignes_one":"","{{count}} lignes_many":"","{{count}} lignes_other":"","D\xe9bit":"","Cr\xe9dit":"","Afficher uniquement les lignes en erreur ({{nombre}})":"","Aper\xe7u limit\xe9 aux {{count}} premi\xe8res lignes_one":"","Aper\xe7u limit\xe9 aux {{count}} premi\xe8res lignes_many":"","Aper\xe7u limit\xe9 aux {{count}} premi\xe8res lignes_other":"","Cet aper\xe7u sert au contr\xf4le visuel. Le fichier complet est pris en compte lors de l’import.":"","Aucune ligne \xe0 afficher avec ce filtre.":"","\xc9criture":"","Contr\xf4le":"","Fin de l’aper\xe7u : les lignes suivantes restent dans le fichier et ne sont pas simul\xe9es ici.":"","Mapping requis":"","Pr\xeat \xe0 importer":"","Import\xe9":"","En erreur":"","Supprim\xe9":"","Date":"","Compte":"","Libell\xe9":"","Journal":"","Num\xe9ro \xe9criture":"","Libell\xe9 compte":"","R\xe9f\xe9rence pi\xe8ce":"","Compte auxiliaire":"","Libell\xe9 auxiliaire":"","Axe analytique":"","Section analytique":"","Code analytique":"","Lettrage":"","Montant unique sign\xe9":"","\xc0 corriger":"","FEC : format standard homog\xe8ne, colonnes reconnues et import\xe9es automatiquement.":"","Export d\'\xe9critures : format libre. Vous devez associer les colonnes avant l\'import.":"","Importer ce fichier dans le grand livre analytique ?":"","lignes seront ajout\xe9es dans le grand livre analytique.":"","Supprimer cet import de fichier ?":"","Les lignes du grand livre analytique li\xe9es \xe0 cet import seront supprim\xe9es.":"","L\'import sera marqu\xe9 comme supprim\xe9.":"","Voir l\'aper\xe7u":"","T\xe9l\xe9charger le fichier import\xe9":"","Supprimer l\'import":"","Choisir un fichier":"",": format standard, colonnes reconnues et import\xe9es automatiquement.":"","(export d\'\xe9critures) : format libre, vous associerez les colonnes apr\xe8s l\'upload.":"","Filtrer par statut":"","Les imports supprim\xe9s et en erreur sont masqu\xe9s par d\xe9faut.":"","S\xe9lectionner les statuts":"","{{affiches}} affich\xe9 sur {{total}}_one":"","{{affiches}} affich\xe9 sur {{total}}_many":"","{{affiches}} affich\xe9 sur {{total}}_other":"","Impossible de charger les imports de fichiers.":"","Aucun import de fichier.":"","Aucun import ne correspond aux statuts s\xe9lectionn\xe9s.":"","P\xe9riode":"","Cr\xe9\xe9":"","\xc0 mapper":"","Tout d\xe9s\xe9lectionner":"","Tout s\xe9lectionner":"","Source non charg\xe9e : saisie manuelle de l\'identifiant.":"","Aucun code : saisie indisponible.":"","Cat\xe9gorie":"","Jour courant":"","D\xe9but du mois":"","D\xe9but du mois pr\xe9c\xe9dent":"","D\xe9but de l\'ann\xe9e":"","Fin du mois":"","Fin du mois pr\xe9c\xe9dent":"","Fin de l\'ann\xe9e":"","pass\xe9e":"","Ann\xe9e(s)":"","Chargement...":"","S\xe9lectionner un fichier Excel":"","S\xe9lectionner un tableur":"","Sch\xe9ma absent pour {{type}}":"","Supprimer la ligne":"","Tableur non partag\xe9 avec comptabilite@airporting.com ?":"","Fichier Excel introuvable ou inaccessible par l\'application Airporting ?":"","Onglet absent du tableur : il sera cr\xe9\xe9 \xe0 la premi\xe8re \xe9criture. V\xe9rifiez l\'orthographe s\'il devait d\xe9j\xe0 exister.":"","Choisissez d\'abord le tableur : la liste des onglets se remplira toute seule.":"","Liste des onglets indisponible ({{raison}}). {{piste}} Saisie manuelle.":"","Chargement des onglets...":"","Choisir un onglet, ou saisir un nouveau nom":"","ID compte":"","Nom du compte":"","IBAN":"","Flux retour":"","Devise":"","Montant":"","Attention, cet onglet est d\xe9j\xe0 pris :":"","(sans nom)":"","(vide)":"","Oui":"","Non":"","Champs modifi\xe9s":"","R\xe9glage":"","Entr\xe9e / virgule pour valider":"","Laisser vide pour conserver le mot de passe actuel":"","{{champ}} : voir la valeur actuelle":"","Type \xab {{type}} \xbb non support\xe9":"","Enregistrer":"","Supprimer {{count}} t\xe2che ?_one":"","Supprimer {{count}} t\xe2che ?_many":"","Supprimer {{count}} t\xe2che ?_other":"","Cette action est irr\xe9versible. La configuration des t\xe2ches s\xe9lectionn\xe9es sera perdue.":"","d\xe9sactiv\xe9e":"","\xbb partag\xe9 avec :":"","Synchronisation d\xe9sactiv\xe9e":"","Plus d\'options":"","D\xe9sactiver cette t\xe2che ?":"","La t\xe2che ne sera plus ex\xe9cut\xe9e tant qu\'elle reste d\xe9sactiv\xe9e.":"","D\xe9sactiver":"","Supprimer cette t\xe2che ?":"","Cette action est irr\xe9versible. La configuration de la t\xe2che sera perdue.":"","S\xe9lectionner tout":"","{{count}} s\xe9lectionn\xe9e_one":"","{{count}} s\xe9lectionn\xe9e_many":"","{{count}} s\xe9lectionn\xe9e_other":"","R\xe9duire":"","Voir {{count}} job suppl\xe9mentaire_one":"","Voir {{count}} job suppl\xe9mentaire_many":"","Voir {{count}} job suppl\xe9mentaire_other":"","Ajouter une fonction":"","S\xe9lectionner":"","Chargement…":"","Aucune fonction suppl\xe9mentaire disponible.":"","Choisir une fonction":"","Aucun r\xe9sultat":"","Voir les logs →":"","D\xe9tails techniques":"","Pas de d\xe9tails disponibles.":"","Aucun historique disponible.":"","T\xe2che":"","D\xe9marr\xe9e":"","Dur\xe9e":"","Planifi\xe9":"","Arr\xeater la t\xe2che":"","Annul\xe9e":"","\xc9criture Sheet… (":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur a \xe9chou\xe9 : {{detail}}":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur a \xe9chou\xe9":"","Le job a r\xe9ussi mais l\'\xe9criture du tableur n\'a pas \xe9t\xe9 confirm\xe9e":"","Voir les logs":"","Renommer la t\xe2che":"","D\'autres synchros \xe9crivent sur l\'onglet \xab":"","\xbb de ce m\xeame spreadsheet :":"","V\xe9rifie que ce n\'est pas un \xe9crasement involontaire.":"","Rien \xe0 configurer pour cette t\xe2che.":"","Notifications activ\xe9es":"","Aucun d\xe9clencheur configur\xe9.":"","Ajouter un d\xe9clencheur":"","Modifier":"","Modifier le d\xe9clencheur":"","Nouveau d\xe9clencheur":"","Jour du mois":"","31 = dernier jour du mois (29 \xe0 31 retombent sur le dernier jour des mois plus courts).":"","Jobs \xe0 d\xe9clencher":"","Cr\xe9er":"","Notifications activ\xe9es, cliquer pour d\xe9sactiver":"","Activer les notifications pour cette synchro":"","Nos connecteurs":"","Connecteurs actifs ({{nombre}})":"","Connecteurs \xe0 configurer ({{nombre}})":"","Les autres connecteurs":"","Liste des connecteurs":"","Connecteurs \xe0 configurer":"","Red\xe9couvre les comptes de ce connecteur pour alimenter les s\xe9lecteurs de compte des synchronisations. L\'enregistrement du formulaire le fait d\xe9j\xe0 tout seul.":"","Rafra\xeechir les comptes":"","Ce formulaire porte les identifiants de connexion \xe0 ce connecteur.":"","Aucune configuration n\xe9cessaire":"","Ce connecteur est g\xe9r\xe9 via Bridge. Il n’y a rien \xe0 configurer ici.":"","Ce connecteur ne n\xe9cessite aucune configuration.":"","Chargement des synchronisations...":"","Aucune recette configur\xe9e.":"","S\xe9lectionnez une recette.":"","D\xe9clencheurs":"","Impossible de charger la recette.":"","Toutes les synchros":"","Historique : {{job}}":"","Historique des ex\xe9cutions":"","Source non charg\xe9e : saisie manuelle de l":"","Le connecteur":"","est actuellement actif. Sa suppression arr\xeatera la synchronisation et le retirera de la liste. Vous pourrez le r\xe9ajouter depuis le catalogue plus tard.":"","Pour confirmer, tapez":"","m\xe9thodes":"","ajout\xe9 le":"","Si ton organisation veut conserver la ma\xeetrise compl\xe8te du fichier (sur votre tenant Microsoft 365), tu peux connecter ton SharePoint d’entreprise. Cette op\xe9ration n\xe9cessite un":"","(r\xf4le":"","ou \xe9quivalent).":"","accord\xe9es":"","\xe0 nommer":"","Aper\xe7u limit\xe9 aux":"","premi\xe8res lignes":"","affich\xe9":"","sur":"","annul\xe9e par":""}');function registerTranslations(){const i18n=(0,index_js_.getI18n)();if(!i18n)return void console.info("[integrations-app] i18n : aucune instance partag\xe9e, l'interface reste en fran\xe7ais.");i18n.addResourceBundle("fr","translation",fr_main_namespaceObject,true,false);i18n.addResourceBundle("en","translation",main_namespaceObject,true,false)}function formatLocale(){return(0,index_js_.getI18n)()?.resolvedLanguage??"fr"}function tr(key,options){const i18n=(0,index_js_.getI18n)();if(!i18n)return key;return i18n.t(key,options)}},1034:function(__unused_webpack_module,__webpack_exports__,__webpack_require__){__webpack_require__.d(__webpack_exports__,{U:()=>connectorLogoUrl});const fec_namespaceObject=__webpack_require__.p+"static/image/fec.png";function connectorLogoUrl(connector){if("fec"===connector.codename)return fec_namespaceObject;return connector.logo_key?`https://img.logo.dev/${connector.logo_key}?token=pk_QvyqAb6uTRGJE2_sDsEb9g&retina=true`:`https://s3.eu-west-3.amazonaws.com/media.airporting/connectors/${connector.codename}.png`}}}]);