diff --git a/client/src/pages/BapHistory.tsx b/client/src/pages/BapHistory.tsx index b11515c..07f8e6b 100644 --- a/client/src/pages/BapHistory.tsx +++ b/client/src/pages/BapHistory.tsx @@ -291,11 +291,21 @@ export default function BapHistory() { )} ) : (entry as any).sharepointUploadStatus === 'error' ? ( -
-
- - SP Erreur +
+
+ + SP Erreur
+ {(entry as any).sharepointUploadError && ( + + {(entry as any).sharepointUploadError} + + )}
) : entry.exportPath ? (
diff --git a/client/src/pages/ImportSettings.tsx b/client/src/pages/ImportSettings.tsx index 2c06c1e..a287001 100644 --- a/client/src/pages/ImportSettings.tsx +++ b/client/src/pages/ImportSettings.tsx @@ -34,6 +34,7 @@ export default function ImportSettings() { const startFolderServiceMutation = trpc.folderImportService.start.useMutation(); const stopFolderServiceMutation = trpc.folderImportService.stop.useMutation(); const testAzureConnectionMutation = trpc.importSettings.testAzureConnection.useMutation(); + const testSharePointUploadMutation = trpc.importSettings.testSharePointUpload.useMutation(); // Manual import const [manualImportEnabled, setManualImportEnabled] = useState(true); @@ -770,6 +771,47 @@ export default function ImportSettings() {

Vérifie le token OAuth2 et l'accès au site SharePoint

+ + {/* Bouton test upload réel */} +
+ +

Dépose un fichier texte de 1 Ko dans le dossier SharePoint pour valider les permissions d'upload

+
)} diff --git a/server/routers.ts b/server/routers.ts index 015dc4c..3f57ab1 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -1569,6 +1569,54 @@ export const appRouter = router({ return { success: false, error: err.message || 'Erreur inconnue' }; } }), + + testSharePointUpload: protectedProcedure + .mutation(async ({ ctx }) => { + const settings = await getImportSettingsByUser(ctx.user.id); + const tenantId = (settings as any)?.azureTenantId; + const clientId = (settings as any)?.azureClientId; + const clientSecret = (settings as any)?.azureClientSecret; + const sharepointUrl = settings?.exportFolder; + + if (!tenantId || !clientId || !clientSecret) { + return { success: false, error: 'Credentials Azure AD manquants (Tenant ID, Client ID ou Secret)' }; + } + if (!sharepointUrl) { + return { success: false, error: 'URL SharePoint non configurée dans le dossier d\'export' }; + } + + try { + const { uploadToSharePoint } = await import('./sharepoint'); + // Créer un fichier test de 1 Ko + const testContent = `Test upload SharePoint - ${new Date().toISOString()}\nApplication : Dématérialisation Facturation\nCe fichier peut être supprimé.`; + const testBuffer = Buffer.from(testContent, 'utf-8'); + const testFileName = `test-upload-${Date.now()}.txt`; + + const result = await uploadToSharePoint( + { tenantId, clientId, clientSecret, sharepointUrl }, + testBuffer, + testFileName + ); + + if (result.success) { + return { + success: true, + message: `Fichier test déposé avec succès dans SharePoint`, + webUrl: result.webUrl, + fileName: testFileName, + debugInfo: result.debugInfo, + }; + } else { + return { + success: false, + error: result.error || 'Échec de l\'upload test', + debugInfo: result.debugInfo, + }; + } + } catch (err: any) { + return { success: false, error: err.message || 'Erreur inconnue' }; + } + }), }), // ============= DEPARTMENT LIST ROUTES =============