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:
@@ -37,6 +37,9 @@ export default function ImportSettings() {
|
||||
const [emailImportPort, setEmailImportPort] = useState(993);
|
||||
const [emailImportFrequency, setEmailImportFrequency] = useState(30);
|
||||
|
||||
// Export folder
|
||||
const [exportFolder, setExportFolder] = useState("");
|
||||
|
||||
// Initialize form with settings from database
|
||||
useEffect(() => {
|
||||
if (settings) {
|
||||
@@ -50,6 +53,7 @@ export default function ImportSettings() {
|
||||
setEmailImportHost(settings.emailImportHost || "");
|
||||
setEmailImportPort(settings.emailImportPort || 993);
|
||||
setEmailImportFrequency(settings.emailImportFrequency || 30);
|
||||
setExportFolder(settings.exportFolder || "");
|
||||
}
|
||||
}, [settings]);
|
||||
|
||||
@@ -66,6 +70,7 @@ export default function ImportSettings() {
|
||||
emailImportHost: emailImportHost || null,
|
||||
emailImportPort: emailImportPort,
|
||||
emailImportFrequency: emailImportFrequency,
|
||||
exportFolder: exportFolder || null,
|
||||
});
|
||||
|
||||
toast.success("Paramètres enregistrés", {
|
||||
@@ -461,6 +466,34 @@ export default function ImportSettings() {
|
||||
</CardContent>
|
||||
</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 où les factures seront exportées
|
||||
</p>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Save Button */}
|
||||
<div className="flex justify-end">
|
||||
<Button
|
||||
|
||||
1
drizzle/0008_orange_prism.sql
Normal file
1
drizzle/0008_orange_prism.sql
Normal file
@@ -0,0 +1 @@
|
||||
ALTER TABLE `importSettings` ADD `exportFolder` text;
|
||||
1110
drizzle/meta/0008_snapshot.json
Normal file
1110
drizzle/meta/0008_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -57,6 +57,13 @@
|
||||
"when": 1770821233743,
|
||||
"tag": "0007_faulty_titanium_man",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 8,
|
||||
"version": "5",
|
||||
"when": 1770830684846,
|
||||
"tag": "0008_orange_prism",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -165,6 +165,9 @@ export const importSettings = mysqlTable("importSettings", {
|
||||
emailImportPort: int("emailImportPort").default(993), // IMAP port (default: 993 for SSL)
|
||||
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(),
|
||||
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
|
||||
});
|
||||
|
||||
@@ -657,6 +657,7 @@ export const appRouter = router({
|
||||
emailImportHost: null,
|
||||
emailImportPort: 993,
|
||||
emailImportFrequency: 30,
|
||||
exportFolder: null,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -675,6 +676,7 @@ export const appRouter = router({
|
||||
emailImportHost: z.string().nullable().optional(),
|
||||
emailImportPort: z.number().min(1).max(65535).optional(),
|
||||
emailImportFrequency: z.number().min(1).optional(),
|
||||
exportFolder: z.string().nullable().optional(),
|
||||
}))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const settings = await upsertImportSettings({
|
||||
|
||||
6
todo.md
6
todo.md
@@ -283,3 +283,9 @@
|
||||
- [x] Ajouter la route /invoices-bap dans App.tsx
|
||||
- [x] Ajouter le menu "Factures BAP" dans DashboardLayout
|
||||
- [ ] 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
|
||||
|
||||
Reference in New Issue
Block a user