Checkpoint: Ajout du paramètre "Dossier d'export" dans les paramètres de réception

Nouvelle fonctionnalité :
 Champ "Dossier d'export" ajouté dans la page Paramètres de réception
 Permet de configurer le chemin du dossier de destination pour l'export des factures
 Stockage en base de données dans la table importSettings
 Interface utilisateur avec carte dédiée et champ de saisie

Modifications techniques :
- drizzle/schema.ts : Ajout du champ exportFolder (type text, nullable) dans la table importSettings
- server/routers.ts : Ajout de exportFolder dans les routes importSettings.get et importSettings.update
- client/src/pages/ImportSettings.tsx : Ajout du state, initialisation, et carte UI pour le dossier d'export
- Migration de base de données : 0008_orange_prism.sql appliquée avec succès

Utilisation :
1. Accéder à "Paramètres de réception" dans le menu
2. Descendre jusqu'à la section "Dossier d'export"
3. Saisir le chemin absolu du dossier (ex: /chemin/vers/dossier/export)
4. Cliquer sur "Enregistrer les paramètres"
5. Le chemin est sauvegardé et pourra être utilisé pour les exports futurs

Ce paramètre permettra de centraliser la configuration du dossier d'export pour toutes les fonctionnalités d'export de l'application.
This commit is contained in:
Manus
2026-02-11 12:26:52 -05:00
parent e11d24cb94
commit 6e04cbe798
7 changed files with 1162 additions and 0 deletions

View File

@@ -37,6 +37,9 @@ export default function ImportSettings() {
const [emailImportPort, setEmailImportPort] = useState(993); const [emailImportPort, setEmailImportPort] = useState(993);
const [emailImportFrequency, setEmailImportFrequency] = useState(30); const [emailImportFrequency, setEmailImportFrequency] = useState(30);
// Export folder
const [exportFolder, setExportFolder] = useState("");
// Initialize form with settings from database // Initialize form with settings from database
useEffect(() => { useEffect(() => {
if (settings) { if (settings) {
@@ -50,6 +53,7 @@ export default function ImportSettings() {
setEmailImportHost(settings.emailImportHost || ""); setEmailImportHost(settings.emailImportHost || "");
setEmailImportPort(settings.emailImportPort || 993); setEmailImportPort(settings.emailImportPort || 993);
setEmailImportFrequency(settings.emailImportFrequency || 30); setEmailImportFrequency(settings.emailImportFrequency || 30);
setExportFolder(settings.exportFolder || "");
} }
}, [settings]); }, [settings]);
@@ -66,6 +70,7 @@ export default function ImportSettings() {
emailImportHost: emailImportHost || null, emailImportHost: emailImportHost || null,
emailImportPort: emailImportPort, emailImportPort: emailImportPort,
emailImportFrequency: emailImportFrequency, emailImportFrequency: emailImportFrequency,
exportFolder: exportFolder || null,
}); });
toast.success("Paramètres enregistrés", { toast.success("Paramètres enregistrés", {
@@ -461,6 +466,34 @@ export default function ImportSettings() {
</CardContent> </CardContent>
</Card> </Card>
{/* Export Folder */}
<Card>
<CardHeader>
<CardTitle className="flex items-center gap-2">
<FolderOpen className="h-5 w-5" />
Dossier d'export
</CardTitle>
<CardDescription>
Configurez le dossier de destination pour l'export des factures
</CardDescription>
</CardHeader>
<CardContent className="space-y-4">
<div className="space-y-2">
<Label htmlFor="exportFolder">Chemin du dossier d'export</Label>
<Input
id="exportFolder"
type="text"
placeholder="/chemin/vers/dossier/export"
value={exportFolder}
onChange={(e) => setExportFolder(e.target.value)}
/>
<p className="text-sm text-muted-foreground">
Spécifiez le chemin absolu du dossier les factures seront exportées
</p>
</div>
</CardContent>
</Card>
{/* Save Button */} {/* Save Button */}
<div className="flex justify-end"> <div className="flex justify-end">
<Button <Button

View File

@@ -0,0 +1 @@
ALTER TABLE `importSettings` ADD `exportFolder` text;

File diff suppressed because it is too large Load Diff

View File

@@ -57,6 +57,13 @@
"when": 1770821233743, "when": 1770821233743,
"tag": "0007_faulty_titanium_man", "tag": "0007_faulty_titanium_man",
"breakpoints": true "breakpoints": true
},
{
"idx": 8,
"version": "5",
"when": 1770830684846,
"tag": "0008_orange_prism",
"breakpoints": true
} }
] ]
} }

View File

@@ -165,6 +165,9 @@ export const importSettings = mysqlTable("importSettings", {
emailImportPort: int("emailImportPort").default(993), // IMAP port (default: 993 for SSL) emailImportPort: int("emailImportPort").default(993), // IMAP port (default: 993 for SSL)
emailImportFrequency: int("emailImportFrequency").default(30).notNull(), // Frequency in minutes (default: 30) emailImportFrequency: int("emailImportFrequency").default(30).notNull(), // Frequency in minutes (default: 30)
// Export folder settings
exportFolder: text("exportFolder"), // Path to folder for exporting invoices
createdAt: timestamp("createdAt").defaultNow().notNull(), createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(), updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
}); });

View File

@@ -657,6 +657,7 @@ export const appRouter = router({
emailImportHost: null, emailImportHost: null,
emailImportPort: 993, emailImportPort: 993,
emailImportFrequency: 30, emailImportFrequency: 30,
exportFolder: null,
}; };
} }
@@ -675,6 +676,7 @@ export const appRouter = router({
emailImportHost: z.string().nullable().optional(), emailImportHost: z.string().nullable().optional(),
emailImportPort: z.number().min(1).max(65535).optional(), emailImportPort: z.number().min(1).max(65535).optional(),
emailImportFrequency: z.number().min(1).optional(), emailImportFrequency: z.number().min(1).optional(),
exportFolder: z.string().nullable().optional(),
})) }))
.mutation(async ({ input, ctx }) => { .mutation(async ({ input, ctx }) => {
const settings = await upsertImportSettings({ const settings = await upsertImportSettings({

View File

@@ -283,3 +283,9 @@
- [x] Ajouter la route /invoices-bap dans App.tsx - [x] Ajouter la route /invoices-bap dans App.tsx
- [x] Ajouter le menu "Factures BAP" dans DashboardLayout - [x] Ajouter le menu "Factures BAP" dans DashboardLayout
- [ ] Tester le filtrage et l'édition directe dans la nouvelle page - [ ] Tester le filtrage et l'édition directe dans la nouvelle page
## Paramètre Dossier d'export
- [x] Ajouter le champ exportFolder dans la table importSettings du schéma
- [x] Pousser la migration avec pnpm db:push
- [x] Ajouter le champ dans l'interface ImportSettings.tsx
- [x] Tester la sauvegarde et récupération du paramètre