import { useState, useEffect } from "react"; import { Link, useLoaderData, useRevalidator } from "react-router"; import { requireUser } from "@/session.server"; import prisma from "@/lib/prisma.server"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { ChevronLeft, Plus, Edit, Trash2, Layers } from "lucide-react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { formatCurrency, formatDate } from "@/lib/tax"; export const handle = { breadcrumbs: (data: { companyId: string; companyName: string }) => [ { label: "Mandanten", href: "/companies" }, { label: data.companyName, href: `/companies/${data.companyId}` }, { label: "Anlagevermögen" }, ], }; const schema = z.object({ bezeichnung: z.string().min(1, "Pflichtfeld"), anschaffungsdatum: z.string().min(1, "Pflichtfeld"), anschaffungskosten: z.coerce.number({ invalid_type_error: "Ungültiger Betrag" }).positive("Betrag muss größer 0 sein"), nutzungsdauerJahre: z.coerce.number().int().min(1, "Mindestens 1 Jahr"), restwert: z.coerce.number().min(0).default(0), beschreibung: z.string().optional(), aktiv: z.boolean().default(true), }); type FormData = z.infer; interface Asset { id: string; bezeichnung: string; beschreibung: string | null; anschaffungsdatum: string; anschaffungskosten: number; nutzungsdauerJahre: number; restwert: number; aktiv: boolean; afaJahr: number; buchwert: number; status: "aktiv" | "vollständig abgeschrieben" | "inaktiv"; } export async function loader({ request, params }: { request: Request; params: { id: string } }) { const user = await requireUser(request); const company = await prisma.company.findFirst({ where: { id: params.id, userId: user.id }, select: { id: true, name: true }, }); if (!company) throw new Response("Not Found", { status: 404 }); return { companyId: company.id, companyName: company.name }; } function AnlagegutForm({ defaultValues, onSubmit, submitLabel, }: { defaultValues?: Partial; onSubmit: (d: FormData) => Promise; submitLabel: string; }) { const { register, handleSubmit, formState: { errors, isSubmitting } } = useForm({ resolver: zodResolver(schema), defaultValues: { aktiv: true, restwert: 0, anschaffungsdatum: new Date().toISOString().slice(0, 10), ...defaultValues, }, }); return (
{errors.bezeichnung &&

{errors.bezeichnung.message}

}
{errors.anschaffungsdatum &&

{errors.anschaffungsdatum.message}

}
{errors.nutzungsdauerJahre &&

{errors.nutzungsdauerJahre.message}

}
{errors.anschaffungskosten &&

{errors.anschaffungskosten.message}

}
{errors.restwert &&

{errors.restwert.message}

}