feat: add functionality to clear category assignments from transactions and display categorized count in settings
This commit is contained in:
24
app/api/banking/transactions/clear-categories/route.ts
Normal file
24
app/api/banking/transactions/clear-categories/route.ts
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { NextResponse } from "next/server"
|
||||||
|
import { prisma } from "@/lib/prisma"
|
||||||
|
|
||||||
|
export async function POST() {
|
||||||
|
try {
|
||||||
|
const result = await prisma.transaction.updateMany({
|
||||||
|
where: {
|
||||||
|
categoryId: { not: null },
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
categoryId: null,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
return NextResponse.json({
|
||||||
|
success: true,
|
||||||
|
count: result.count,
|
||||||
|
})
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error clearing categories:", error)
|
||||||
|
return NextResponse.json({ error: "Failed to clear categories" }, { status: 500 })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ import {
|
|||||||
AlertDialogTitle,
|
AlertDialogTitle,
|
||||||
AlertDialogTrigger,
|
AlertDialogTrigger,
|
||||||
} from "@/components/ui/alert-dialog"
|
} from "@/components/ui/alert-dialog"
|
||||||
import { Download, Trash2, Upload, RefreshCw, Database, FileJson } from "lucide-react"
|
import { Download, Trash2, Upload, RefreshCw, Database, FileJson, Tags } from "lucide-react"
|
||||||
import type { BankingData } from "@/lib/types"
|
import type { BankingData } from "@/lib/types"
|
||||||
|
|
||||||
export default function SettingsPage() {
|
export default function SettingsPage() {
|
||||||
@@ -82,6 +82,22 @@ export default function SettingsPage() {
|
|||||||
window.location.reload()
|
window.location.reload()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const clearAllCategories = async () => {
|
||||||
|
try {
|
||||||
|
const response = await fetch("/api/banking/transactions/clear-categories", {
|
||||||
|
method: "POST",
|
||||||
|
})
|
||||||
|
if (!response.ok) throw new Error("Erreur")
|
||||||
|
refresh()
|
||||||
|
alert("Catégories supprimées de toutes les opérations")
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
alert("Erreur lors de la suppression des catégories")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const categorizedCount = data.transactions.filter((t) => t.categoryId).length
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex h-screen bg-background">
|
<div className="flex h-screen bg-background">
|
||||||
<Sidebar />
|
<Sidebar />
|
||||||
@@ -132,10 +148,39 @@ export default function SettingsPage() {
|
|||||||
</CardTitle>
|
</CardTitle>
|
||||||
<CardDescription>Actions irréversibles - procédez avec prudence</CardDescription>
|
<CardDescription>Actions irréversibles - procédez avec prudence</CardDescription>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardContent>
|
<CardContent className="space-y-3">
|
||||||
|
{/* Supprimer catégories des opérations */}
|
||||||
<AlertDialog>
|
<AlertDialog>
|
||||||
<AlertDialogTrigger asChild>
|
<AlertDialogTrigger asChild>
|
||||||
<Button variant="destructive">
|
<Button variant="outline" className="w-full justify-start border-orange-300 text-orange-700 hover:bg-orange-50">
|
||||||
|
<Tags className="w-4 h-4 mr-2" />
|
||||||
|
Supprimer les catégories des opérations
|
||||||
|
<span className="ml-auto text-xs text-muted-foreground">
|
||||||
|
{categorizedCount} opération{categorizedCount > 1 ? "s" : ""} catégorisée{categorizedCount > 1 ? "s" : ""}
|
||||||
|
</span>
|
||||||
|
</Button>
|
||||||
|
</AlertDialogTrigger>
|
||||||
|
<AlertDialogContent>
|
||||||
|
<AlertDialogHeader>
|
||||||
|
<AlertDialogTitle>Supprimer toutes les catégories ?</AlertDialogTitle>
|
||||||
|
<AlertDialogDescription>
|
||||||
|
Cette action va retirer la catégorie de {categorizedCount} opération{categorizedCount > 1 ? "s" : ""}.
|
||||||
|
Les catégories elles-mêmes ne seront pas supprimées, seulement leur affectation aux opérations.
|
||||||
|
</AlertDialogDescription>
|
||||||
|
</AlertDialogHeader>
|
||||||
|
<AlertDialogFooter>
|
||||||
|
<AlertDialogCancel>Annuler</AlertDialogCancel>
|
||||||
|
<AlertDialogAction onClick={clearAllCategories} className="bg-orange-600 hover:bg-orange-700">
|
||||||
|
Supprimer les affectations
|
||||||
|
</AlertDialogAction>
|
||||||
|
</AlertDialogFooter>
|
||||||
|
</AlertDialogContent>
|
||||||
|
</AlertDialog>
|
||||||
|
|
||||||
|
{/* Réinitialiser toutes les données */}
|
||||||
|
<AlertDialog>
|
||||||
|
<AlertDialogTrigger asChild>
|
||||||
|
<Button variant="destructive" className="w-full justify-start">
|
||||||
<Trash2 className="w-4 h-4 mr-2" />
|
<Trash2 className="w-4 h-4 mr-2" />
|
||||||
Réinitialiser toutes les données
|
Réinitialiser toutes les données
|
||||||
</Button>
|
</Button>
|
||||||
|
|||||||
Reference in New Issue
Block a user