feat: add transaction deduplication feature and enhance filtering options in settings and transactions pages

This commit is contained in:
Julien Froidefond
2025-11-30 13:02:03 +01:00
parent e087143675
commit d5aa00a885
9 changed files with 616 additions and 26 deletions

View File

@@ -1,5 +1,6 @@
"use client";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import {
Card,
@@ -19,19 +20,39 @@ import {
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog";
import { Trash2, Tags } from "lucide-react";
import { Trash2, Tags, Copy } from "lucide-react";
interface DangerZoneCardProps {
categorizedCount: number;
onClearCategories: () => void;
onResetData: () => void;
onDeduplicate: () => Promise<{ deletedCount: number; duplicatesFound: number }>;
}
export function DangerZoneCard({
categorizedCount,
onClearCategories,
onResetData,
onDeduplicate,
}: DangerZoneCardProps) {
const [deduplicating, setDeduplicating] = useState(false);
const handleDeduplicate = async () => {
setDeduplicating(true);
try {
const result = await onDeduplicate();
if (result.deletedCount > 0) {
alert(`${result.deletedCount} transaction${result.deletedCount > 1 ? "s" : ""} en double supprimée${result.deletedCount > 1 ? "s" : ""}`);
} else {
alert("Aucun doublon trouvé");
}
} catch (error) {
console.error(error);
alert("Erreur lors du dédoublonnage");
} finally {
setDeduplicating(false);
}
};
return (
<Card className="border-red-200">
<CardHeader>
@@ -44,6 +65,48 @@ export function DangerZoneCard({
</CardDescription>
</CardHeader>
<CardContent className="space-y-3">
{/* Dédoublonnage */}
<AlertDialog>
<AlertDialogTrigger asChild>
<Button
variant="outline"
className="w-full justify-start border-blue-300 text-blue-700 hover:bg-blue-50"
disabled={deduplicating}
>
<Copy className="w-4 h-4 mr-2" />
Dédoublonner les transactions
{deduplicating && (
<span className="ml-auto text-xs text-muted-foreground">
En cours...
</span>
)}
</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
Dédoublonner les transactions ?
</AlertDialogTitle>
<AlertDialogDescription>
Cette action va rechercher et supprimer les transactions en double
dans votre base de données. Les critères de dédoublonnage sont :
même compte, même date, même montant et même libellé. La première
transaction trouvée sera conservée, les autres seront supprimées.
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>Annuler</AlertDialogCancel>
<AlertDialogAction
onClick={handleDeduplicate}
className="bg-blue-600 hover:bg-blue-700"
disabled={deduplicating}
>
{deduplicating ? "Dédoublonnage..." : "Dédoublonner"}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
{/* Supprimer catégories des opérations */}
<AlertDialog>
<AlertDialogTrigger asChild>