Files
musicland/functions/src/components/SharedElements.js
T
Philip Cesar Garay 84fc719a10 update
2025-07-31 21:25:33 +08:00

148 lines
4.1 KiB
JavaScript

import React from "react";
import { Text, View, Image, StyleSheet } from "@react-pdf/renderer";
import numbro from "numbro";
const DisplayCustomerInformation = ({ billingDetails } = {}) => {
return (
<View style={Styles.rightColumn}>
{[
`Client: ${billingDetails.legalName || "NC"}`,
billingDetails.billingAddress,
// `${billingDetails.zipCode}, ${billingDetails.city}, ${billingDetails.countryCode}`,
`TVA: ${billingDetails.taxIdentificationNumber || "NC"}`,
`SIREN: ${billingDetails.SIREN || "NC"}`,
]
.filter(Boolean)
.map((line, index) => (
<Text key={index} style={Styles.textParagraph}>
{line}
</Text>
))}
</View>
);
};
const RenderCompanyLogo = ({ logoBase64 } = {}) => {
return (
<Image src={`data:image/png;base64,${logoBase64}`} style={{ width: 200 }} />
);
};
const RenderTermsOfSale = () => {
return {
title: "Conditions générales de vente",
content: <Text style={Styles.textParagraph}>{"ICI TES CGV"}</Text>,
};
};
const RenderCompanyInformation = ({ company }) => {
return {
title: "Informations du prestataire",
content: (
<Text style={Styles.textParagraph}>
{`${company?.name}, ${company?.address}, ${company?.postalCode || "-"}, ${company?.city || "-"},\nSIRET: ${company?.identifier}, RCS: ${company?.city} ${company?.RCS}, TVA: ${company?.taxIdentifier || "-"}.\nPour toute question, vous pourrez nous contacter au ${company?.phoneNumber} ou à l'adresse ${company?.supportEmail}.`}
</Text>
),
};
};
const SignatureForm = () => {
return {
title: "Signature du client",
content: (
<>
<Text style={Styles.textParagraph}>
Fait à {"{{Ville de signature;font_size=12}}"}, le
{" {{Date;type=datenow;font_size=12}}"}
</Text>
<Text style={Styles.textParagraph}>
Nom et prénom du signataire:{" "}
{"{{Nom et Prénom du signataire;font_size=12}}"}
</Text>
<Text style={Styles.textParagraph}>
Fonction du signataire: {"{{Fonction du signataire;font_size=12}}"}
</Text>
<Text style={Styles.textParagraph}>
Téléphone: {"{{type=phone;required=true;font_size=12}}"}
</Text>
<Text style={Styles.textParagraph}>Signature:</Text>
<View style={Styles.signatureBox}>
<Text>{"{{Sign;type=signature;width=200;height=50}}"}</Text>
</View>
</>
),
};
};
const formatPrice = ({ amount = 0, average = false }) =>
`${numbro(amount || 0).format({
spaceSeparated: true,
thousandSeparated: true,
average,
mantissa: average ? 1 : 2,
})} €`;
const Styles = StyleSheet.create({
body: {
padding: 40,
fontFamily: "Helvetica",
fontSize: 12,
lineHeight: 1.5,
color: "#000",
},
section: { marginBottom: 30 },
sectionTitle: { fontSize: 14, opacity: 0.5, marginBottom: 5 },
textParagraph: { marginBottom: 5 },
headerRow: {
flexDirection: "row",
justifyContent: "space-between",
},
leftColumn: { width: "50%", textAlign: "left" },
rightColumn: { width: "50%", textAlign: "right" },
table: { marginBottom: 20 },
tableRow: {
flexDirection: "row",
justifyContent: "space-between",
paddingVertical: 10,
borderBottomWidth: 1,
borderBottomColor: "#ccc",
},
tableColHeaderLeft: { width: "70%", fontWeight: "bold", textAlign: "left" },
tableColHeaderRight: { width: "30%", fontWeight: "bold", textAlign: "right" },
tableColLeft: { width: "70%", textAlign: "left" },
tableColRight: { width: "30%", textAlign: "right" },
summaryRow: {
flexDirection: "row",
justifyContent: "flex-end",
marginTop: 10,
},
summaryLabel: {
width: "70%",
textAlign: "right",
paddingRight: 10,
fontWeight: "bold",
},
summaryValue: { width: "30%", textAlign: "right" },
signatureBox: {
width: 200,
height: 50,
borderWidth: 1,
borderStyle: "solid",
},
});
export {
Styles,
formatPrice,
DisplayCustomerInformation,
RenderTermsOfSale,
RenderCompanyLogo,
RenderCompanyInformation,
SignatureForm,
};