243 lines
8.2 KiB
TypeScript
243 lines
8.2 KiB
TypeScript
"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,
|
|
COLORS,
|
|
FONT_SIZES,
|
|
} from "./pdf/SharedUI.js";
|
|
import { SimpleLayout } from "./pdf/SimpleLayout.js";
|
|
|
|
const localStyles = PDFStyleSheet.create({
|
|
sectionContainer: {
|
|
marginTop: 0,
|
|
},
|
|
agbSection: {
|
|
marginBottom: 20,
|
|
},
|
|
labelRow: {
|
|
flexDirection: "row",
|
|
alignItems: "baseline",
|
|
marginBottom: 6,
|
|
},
|
|
monoNumber: {
|
|
fontSize: FONT_SIZES.TINY,
|
|
fontWeight: "bold",
|
|
color: COLORS.TEXT_LIGHT,
|
|
letterSpacing: 2,
|
|
width: 25,
|
|
},
|
|
sectionTitle: {
|
|
fontSize: FONT_SIZES.LABEL,
|
|
fontWeight: "bold",
|
|
color: COLORS.CHARCOAL,
|
|
textTransform: "uppercase",
|
|
letterSpacing: 0.5,
|
|
},
|
|
officialText: {
|
|
fontSize: FONT_SIZES.BODY,
|
|
lineHeight: 1.5,
|
|
color: COLORS.TEXT_MAIN,
|
|
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 {
|
|
headerIcon?: string;
|
|
footerLogo?: string;
|
|
mode?: "estimation" | "full";
|
|
}
|
|
|
|
export const AgbsPDF = ({
|
|
headerIcon,
|
|
footerLogo,
|
|
mode = "full",
|
|
}: 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",
|
|
};
|
|
|
|
const content = (
|
|
<PDFView>
|
|
<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 jeweiligen
|
|
Kunden (nachfolgend „Auftraggeber“). Abweichende oder ergänzende
|
|
Bedingungen des Auftraggebers werden nicht Vertragsbestandteil, auch
|
|
wenn ihrer Geltung nicht ausdrücklich widersprochen wird.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="02" title="Vertragsgegenstand">
|
|
Der Auftragnehmer erbringt Dienstleistungen im Bereich:
|
|
Webentwicklung, technische Umsetzung digitaler Systeme, Funktionen,
|
|
Schnittstellen und Automatisierungen sowie Hosting, Betrieb und
|
|
Wartung, sofern ausdrücklich vereinbard. Der Auftragnehmer schuldet
|
|
ausschließlich die vereinbarte technische Leistung, nicht jedoch einen
|
|
wirtschaftlichen Erfolg, bestimmte Umsätze, Conversions, Reichweiten,
|
|
Suchmaschinen-Rankings oder rechtliche Ergebnisse.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="03" title="Mitwirkungspflichten des Auftraggebers">
|
|
Der Auftraggeber verpflichtet sich, alle zur Leistungserbringung
|
|
erforderlichen Inhalte, Informationen, Zugänge und Entscheidungen
|
|
rechtzeitig, vollständig und korrekt bereitzustellen. Hierzu zählen
|
|
insbesondere Texte, Bilder, Videos, Produktdaten, Freigaben, Feedback,
|
|
Zugangsdaten sowie rechtlich erforderliche Inhalte (z. B. Impressum,
|
|
DSGVO). Verzögerungen oder Unterlassungen führen zu Verschiebungen
|
|
aller Termine ohne Schadensersatzanspruch.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="04" title="Ausführungs- und Bearbeitungszeiten">
|
|
Angegebene Bearbeitungszeiten sind unverbindliche Schätzungen, keine
|
|
garantierten Fristen. Fixe Termine oder Deadlines gelten nur, wenn sie
|
|
ausdrücklich schriftlich als verbindlich vereinbart wurden.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="05" title="Abnahme">
|
|
Die Leistung gilt als abgenommen, wenn der Auftraggeber sie produktiv
|
|
nutzt oder innerhalb von 30 Tagen nach Bereitstellung keine
|
|
wesentlichen Mängel angezeigt werden. Optische Abweichungen,
|
|
Geschmacksfragen oder subjektive Einschätzungen stellen keine Mängel
|
|
dar.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="06" title="Haftung">
|
|
Der Auftragnehmer haftet nur für Schäden, die auf vorsätzlicher oder
|
|
grob fahrlässiger Pflichtverletzung beruhen. Eine Haftung für
|
|
entgangenen Gewinn, Umsatzausfälle, Datenverlust,
|
|
Betriebsunterbrechungen, mittelbare oder Folgeschäden ist
|
|
ausgeschlossen, soweit gesetzlich zulässig.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="07" title="Verfügbarkeit & Betrieb">
|
|
Bei vereinbartem Hosting oder Betrieb schuldet der Auftragnehmer keine
|
|
permanente Verfügbarkeit. Wartungsarbeiten, Updates,
|
|
Sicherheitsmaßnahmen oder externe Störungen können zu zeitweisen
|
|
Einschränkungen führen und begründen keine Haftungsansprüche.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="07a" title="Betriebs- und Pflegeleistung">
|
|
Die Betriebs- und Pflegeleistung umfasst ausschließlich die
|
|
Sicherstellung des technischen Betriebs, Wartung, Updates,
|
|
Fehlerbehebung der bestehenden Systeme sowie Pflege bestehender
|
|
Datensätze ohne Strukturänderung. Nicht Bestandteil sind die
|
|
Erstellung neuer Inhalte (Blogartikel, News, Produkte), redaktionelle
|
|
Tätigkeiten, strategische Planung oder der Aufbau neuer
|
|
Features/Datenmodelle. Leistungen darüber hinaus gelten als
|
|
Neuentwicklung.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="08" title="Drittanbieter & externe Systeme">
|
|
Der Auftragnehmer übernimmt keine Verantwortung für Leistungen,
|
|
Ausfälle oder Änderungen externer Dienste, APIs, Schnittstellen oder
|
|
Plattformen Dritter. Eine Funktionsfähigkeit kann nur im Rahmen der
|
|
jeweils aktuellen externen Schnittstellen gewährleistet werden.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="09" title="Inhalte & Rechtliches">
|
|
Der Auftraggeber ist allein verantwortlich für Inhalte, rechtliche
|
|
Konformität (DSGVO, Urheberrecht etc.) sowie bereitgestellte Daten.
|
|
Der Auftragnehmer übernimmt keine rechtliche Prüfung.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="10" title="Vergütung & Zahlungsverzug">
|
|
Alle Preise netto zzgl. MwSt. Rechnungen sind innerhalb von 7 Tagen
|
|
fällig. Bei Zahlungsverzug ist der Auftragnehmer berechtigt,
|
|
Leistungen auszusetzen, Systeme offline zu nehmen oder laufende
|
|
Arbeiten zu stoppen.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="11" title="Kündigung laufender Leistungen">
|
|
Laufende Leistungen (z. B. Hosting & Betrieb) können mit einer Frist
|
|
von 4 Wochen zum Monatsende gekündigt werden, sofern nichts anderes
|
|
vereinbart ist.
|
|
</AGBSection>
|
|
|
|
<AGBSection index="12" title="Schlussbestimmungen">
|
|
Es gilt das Recht der Bundesrepublik Deutschland. Gerichtsstand ist
|
|
der Sitz des Auftragnehmers. Sollte eine Bestimmung unwirksam sein,
|
|
bleibt die Wirksamkeit der übrigen Regelungen unberührt.
|
|
</AGBSection>
|
|
</PDFView>
|
|
</PDFView>
|
|
);
|
|
|
|
if (mode === "full") {
|
|
return (
|
|
<SimpleLayout
|
|
companyData={companyData}
|
|
bankData={bankData}
|
|
headerIcon={headerIcon}
|
|
footerLogo={footerLogo}
|
|
showPageNumber={false}
|
|
>
|
|
{content}
|
|
</SimpleLayout>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<PDFPage size="A4" style={pdfStyles.page}>
|
|
<FoldingMarks />
|
|
<Header icon={headerIcon} showAddress={false} />
|
|
{content}
|
|
<Footer
|
|
logo={footerLogo}
|
|
companyData={companyData}
|
|
_bankData={bankData}
|
|
showDetails={false}
|
|
showPageNumber={false}
|
|
/>
|
|
</PDFPage>
|
|
);
|
|
};
|