feat(laufzeiten): anlegen, bearbeiten und zusammenfuehren (#043)
Laufzeiten entstanden bisher nur als Vorschlag aus dem Agenten-Report; bestaetigen oder verwerfen war alles. Anlegen von Hand gab es als Aktion ohne Oberflaeche, Aendern und Zusammenfuehren gar nicht - obwohl der Doppelfall zwangslaeufig auftritt, sobald das gemeldete Ablaufdatum von der Bestellung abweicht. Jetzt: Formular zum Anlegen auf der Rechnungsseite (Key vorgeschlagen, Ende aus dem Beginn vorbelegt), Bearbeiten von Key, Zeitraum und Notiz im Laufzeit-Detail, und Zusammenfuehren zweier Laufzeiten desselben Hosts. Die aufgeloeste gibt ihre Rechnungen ab, sofern das Ziel dort nichts hat; sonst bricht der Vorgang mit Erklaerung ab - zwei Einkaufsrechnungen auf einem Lizenzjahr waeren nicht mehr zuzuordnen. Dazu die Kundenansicht: Laufzeit und Host verlinkt, Marge und Rabatt je Zeile. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@ import { CopyableCode } from "@/components/ui/CopyableCode";
|
||||
import { InfoBox } from "@/components/ui/SmallBox";
|
||||
import { prisma } from "@/lib/db";
|
||||
import { formatDatum, formatEuro, tageBis } from "@/lib/format";
|
||||
import { LaufzeitAnlegen } from "@/components/rechnungen/LaufzeitAnlegen";
|
||||
import {
|
||||
anzahlVorschlaege,
|
||||
laufzeitJahre,
|
||||
@@ -33,11 +34,16 @@ export default async function RechnungenSeite({ searchParams }: { searchParams:
|
||||
q: einzeln(roh.q),
|
||||
};
|
||||
|
||||
const [{ zeilen, summen }, jahre, kunden, vorschlaege] = await Promise.all([
|
||||
const [{ zeilen, summen }, jahre, kunden, vorschlaege, hostsFuerLaufzeit] = await Promise.all([
|
||||
rechnungsListe(filter),
|
||||
laufzeitJahre(),
|
||||
prisma.kunde.findMany({ orderBy: { name: "asc" }, select: { id: true, name: true } }),
|
||||
anzahlVorschlaege(),
|
||||
prisma.host.findMany({
|
||||
where: { archiviertAm: null },
|
||||
orderBy: { hostname: "asc" },
|
||||
select: { id: true, hostname: true, subKey: true, kunde: { select: { name: true } } },
|
||||
}),
|
||||
]);
|
||||
|
||||
const heute = new Date();
|
||||
@@ -106,6 +112,19 @@ export default async function RechnungenSeite({ searchParams }: { searchParams:
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Laufzeiten entstehen sonst aus den Agenten-Reports; von Hand braucht man es für
|
||||
Hosts ohne gemeldetes Ablaufdatum oder für Nachträge (#043). */}
|
||||
<Card titel="Laufzeit von Hand anlegen" rahmen="keiner">
|
||||
<LaufzeitAnlegen
|
||||
hosts={hostsFuerLaufzeit.map((host) => ({
|
||||
id: host.id,
|
||||
hostname: host.hostname,
|
||||
kundeName: host.kunde?.name ?? null,
|
||||
subKey: host.subKey,
|
||||
}))}
|
||||
/>
|
||||
</Card>
|
||||
|
||||
<Card
|
||||
titel="Laufzeiten und Rechnungen"
|
||||
rahmen="primary"
|
||||
|
||||
Reference in New Issue
Block a user