feat(invoice): informal German tone + show payment method and status
- i18n.de: switch Sie/Ihren to du/dein for salutation, thank-you line, customer-VAT label and payment-terms paragraph. Closing line was already informal. - i18n: add paymentMethodLabel/paymentStatusLabel + per-status labels (paid/unpaid/partial/refunded) for both DE and EN, plus derivePaymentStatus helper that condenses Shopify's displayFinancialStatus (PAID, PARTIALLY_PAID, REFUNDED, …) into a 4-value enum. - loadOrderForInvoice: query Order.paymentGatewayNames and propagate it on the raw view-model. - composeInvoice + types: expose paymentStatus + paymentGatewayNames on InvoiceViewModel (filtered/trimmed). loadDraftOrderForOffer keeps paymentGatewayNames empty (drafts have no gateway yet). - InvoiceDocument: render two new meta rows on real invoices — 'Zahlart / Payment method' (joined, prettified gateway names) and 'Zahlstatus / Payment status' (translated label). Storno + offer kinds intentionally omit them. - scripts/render-sample.ts: extend smoke checks to assert the informal DE wording, the new payment-method/status rows and the paymentStatus/paymentGatewayNames composer outputs.
This commit is contained in:
@@ -11,7 +11,7 @@ import {
|
||||
import React from "react";
|
||||
|
||||
import { formatDate, formatMoney, formatQuantity, formatTaxRate } from "../format";
|
||||
import { getStrings } from "../i18n";
|
||||
import { getStrings, paymentStatusLabel as getPaymentStatusLabel } from "../i18n";
|
||||
import type { InvoiceLanguage } from "../i18n";
|
||||
import type { InvoiceViewModel, InvoiceLine, IssuerData, RecipientData } from "../types";
|
||||
|
||||
@@ -287,6 +287,22 @@ export function InvoiceDocument({ invoice }: DocProps) {
|
||||
<Text style={styles.metaValue}>{invoice.recipientVatId}</Text>
|
||||
</View>
|
||||
) : null}
|
||||
{invoice.kind === "invoice" && invoice.paymentGatewayNames.length > 0 && (
|
||||
<View style={styles.metaRow}>
|
||||
<Text style={styles.metaLabel}>{t.paymentMethodLabel}</Text>
|
||||
<Text style={styles.metaValue}>
|
||||
{invoice.paymentGatewayNames.map(prettifyGatewayName).join(", ")}
|
||||
</Text>
|
||||
</View>
|
||||
)}
|
||||
{invoice.kind === "invoice" && (
|
||||
<View style={styles.metaRow}>
|
||||
<Text style={styles.metaLabel}>{t.paymentStatusLabel}</Text>
|
||||
<Text style={styles.metaValue}>
|
||||
{getPaymentStatusLabel(invoice.paymentStatus, t)}
|
||||
</Text>
|
||||
</View>
|
||||
)}
|
||||
</View>
|
||||
</View>
|
||||
</View>
|
||||
@@ -545,3 +561,28 @@ function normaliseWebUrl(url: string): string {
|
||||
if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
||||
return `https://${trimmed.replace(/^\/\//, "")}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn a Shopify payment-gateway machine name (e.g. `shopify_payments`,
|
||||
* `manual`, `bogus`) into something a customer can read on the invoice. We
|
||||
* keep this purely cosmetic — the underlying value is preserved for any
|
||||
* downstream automation.
|
||||
*/
|
||||
function prettifyGatewayName(name: string): string {
|
||||
const known: Record<string, string> = {
|
||||
manual: "Manual",
|
||||
bogus: "Bogus (Test)",
|
||||
shopify_payments: "Shopify Payments",
|
||||
paypal: "PayPal",
|
||||
cash_on_delivery: "Cash on delivery",
|
||||
"cash-on-delivery": "Cash on delivery",
|
||||
};
|
||||
const key = name.trim().toLowerCase();
|
||||
if (known[key]) return known[key];
|
||||
// Replace separators and title-case each word.
|
||||
return key
|
||||
.split(/[_\s-]+/)
|
||||
.filter(Boolean)
|
||||
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
||||
.join(" ");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user