feat: Implement combined quote PDF with AGBs and recurring pricing, utilizing shared PDF UI components.

This commit is contained in:
2026-02-03 00:16:24 +01:00
parent 083be92c5b
commit 9751d2f61f
10 changed files with 511 additions and 416 deletions

154
src/components/AgbsPDF.tsx Normal file
View File

@@ -0,0 +1,154 @@
'use client';
import * as React from 'react';
import {
Page as PDFPage,
Text as PDFText,
View as PDFView,
StyleSheet as PDFStyleSheet,
} from '@react-pdf/renderer';
import { pdfStyles, Header, Footer, FoldingMarks, DocumentTitle } from './pdf/SharedUI';
const localStyles = PDFStyleSheet.create({
sectionContainer: {
marginTop: 0,
},
agbSection: {
marginBottom: 20,
},
labelRow: {
flexDirection: 'row',
alignItems: 'baseline',
marginBottom: 6,
},
monoNumber: {
fontSize: 7,
fontWeight: 'bold',
color: '#94a3b8',
letterSpacing: 2,
width: 25,
},
sectionTitle: {
fontSize: 9,
fontWeight: 'bold',
color: '#000000',
textTransform: 'uppercase',
letterSpacing: 0.5,
},
officialText: {
fontSize: 8,
lineHeight: 1.5,
color: '#334155',
textAlign: 'justify',
paddingLeft: 25,
}
});
const AGBSection = ({ index, title, children }: { index: string; title: string; children: React.ReactNode }) => (
<PDFView style={localStyles.agbSection} wrap={false}>
<PDFView style={localStyles.labelRow}>
<PDFText style={localStyles.monoNumber}>{index}</PDFText>
<PDFText style={localStyles.sectionTitle}>{title}</PDFText>
</PDFView>
<PDFText style={localStyles.officialText}>{children}</PDFText>
</PDFView>
);
interface AgbsPDFProps {
state: any;
headerIcon?: string;
footerLogo?: string;
}
export const AgbsPDF = ({ state, headerIcon, footerLogo }: AgbsPDFProps) => {
const date = new Date().toLocaleDateString('de-DE', {
year: 'numeric',
month: 'long',
day: 'numeric',
});
const companyData = {
name: "Marc Mintel",
address1: "Georg-Meistermann-Straße 7",
address2: "54586 Schüller",
ustId: "DE367588065"
};
const bankData = {
name: "N26",
bic: "NTSBDEB1XXX",
iban: "DE50 1001 1001 2620 4328 65"
};
return (
<PDFPage size="A4" style={pdfStyles.page}>
<FoldingMarks />
<Header icon={headerIcon} showAddress={false} />
<DocumentTitle
title="Allgemeine Geschäftsbedingungen"
subLines={[
`Stand: ${date}`
]}
/>
<PDFView style={localStyles.sectionContainer}>
<AGBSection
index="01"
title="Geltungsbereich"
>
Diese Allgemeinen Geschäftsbedingungen gelten für alle Verträge zwischen Marc Mintel (nachfolgend Auftragnehmer) und dem Auftraggeber. Abweichende Bedingungen des Auftraggebers werden nicht Vertragsbestandteil.
</AGBSection>
<AGBSection
index="02"
title="Vertragsgegenstand"
>
Dienstleistungen in Webentwicklung, technischer Umsetzung und Hosting. Der Auftragnehmer schuldet eine fachgerechte technische Ausführung, jedoch keinen wirtschaftlichen Erfolg.
</AGBSection>
<AGBSection
index="03"
title="Mitwirkungspflichten"
>
Der Auftraggeber stellt alle erforderlichen Inhalte und Zugänge rechtzeitig bereit. Verzögerungen durch fehlende Mitwirkung gehen zu Lasten der Projektlaufzeit.
</AGBSection>
<AGBSection
index="04"
title="Abnahme"
>
Die Abnahme erfolgt durch produktive Nutzung oder Ablauf von 7 Tagen nach Projektabschluss. Subjektives Nichtgefallen stellt keinen technischen Mangel dar.
</AGBSection>
<AGBSection
index="05"
title="Haftung"
>
Haftung besteht nur bei Vorsatz oder grober Fahrlässigkeit. Die Haftung für indirekte Schäden oder entgangenen Gewinn wird ausgeschlossen.
</AGBSection>
<AGBSection
index="06"
title="Hosting & Wartung"
>
Wartung sichert den Betrieb des Ist-Zustands. Erweiterungen oder Funktionsänderungen sind separat zu beauftragen.
</AGBSection>
<AGBSection
index="07"
title="Zahlung & Verzug"
>
Alle Preise netto. Fälligkeit innerhalb von 7 Tagen. Bei erheblichem Verzug ist der Auftragnehmer berechtigt, die Leistung einzustellen.
</AGBSection>
</PDFView>
<Footer
logo={footerLogo}
companyData={companyData}
bankData={bankData}
showDetails={false}
/>
</PDFPage>
);
};