Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b023c068eb | |||
| 2c1e7af797 |
@@ -40,6 +40,7 @@ export default async function BillingSettingsPage() {
|
||||
isPersonal={user.isPersonal}
|
||||
orgName={user.orgName}
|
||||
userName={user.name}
|
||||
userEmail={user.email}
|
||||
/>
|
||||
</main>
|
||||
);
|
||||
|
||||
@@ -33,7 +33,12 @@ export default async function SettingsPage() {
|
||||
key: "billing",
|
||||
href: "/settings/billing",
|
||||
title: t("billingTitle"),
|
||||
description: t("billingDescription"),
|
||||
// Personal customers (B2C) don't have a VAT number; the
|
||||
// description shouldn't mention one. Same pattern used in the
|
||||
// form itself (label/field gating).
|
||||
description: user.isPersonal
|
||||
? t("billingDescriptionPersonal")
|
||||
: t("billingDescription"),
|
||||
// Owners and platform admins can edit billing. `user` role
|
||||
// can't even view it — billing details aren't useful to them.
|
||||
visible: canMutate(user),
|
||||
|
||||
@@ -1008,7 +1008,11 @@ export function OnboardingWizard({
|
||||
}))
|
||||
}
|
||||
rows={3}
|
||||
placeholder={t("billingNotesPlaceholder")}
|
||||
placeholder={t(
|
||||
isPersonal
|
||||
? "billingNotesPlaceholderPersonal"
|
||||
: "billingNotesPlaceholder"
|
||||
)}
|
||||
className="w-full px-3 py-2 bg-surface-2 border border-border rounded-lg text-sm text-text-primary placeholder:text-text-muted focus:outline-none focus:ring-1 focus:ring-accent focus:border-accent transition-colors resize-y"
|
||||
/>
|
||||
</div>
|
||||
@@ -1113,6 +1117,19 @@ export function OnboardingWizard({
|
||||
</div>
|
||||
}
|
||||
/>
|
||||
{/* Bug 35: VAT review row. Company customers see this so
|
||||
they can verify the VAT id they typed before submitting.
|
||||
Personal customers never see it — they don't have a
|
||||
VAT number, the form didn't ask, the review hides it. */}
|
||||
{!isPersonal &&
|
||||
config.billingAddress.vatNumber &&
|
||||
config.billingAddress.vatNumber.trim().length > 0 && (
|
||||
<ReviewRow
|
||||
label={t("billingVatNumber")}
|
||||
value={config.billingAddress.vatNumber}
|
||||
mono
|
||||
/>
|
||||
)}
|
||||
<ReviewRow
|
||||
label={t("reviewContactEmail")}
|
||||
value={userEmail || ""}
|
||||
|
||||
@@ -20,6 +20,13 @@ interface Props {
|
||||
orgName: string;
|
||||
/** Default full-name for personal orgs on first edit. */
|
||||
userName: string;
|
||||
/**
|
||||
* Default billing email — the address the user registered with.
|
||||
* Used on first edit (when `initial` is null). Customers can still
|
||||
* type a different address (e.g. accounting@…) but the registration
|
||||
* email is a sensible starting point.
|
||||
*/
|
||||
userEmail: string;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -38,6 +45,7 @@ export function BillingSettingsForm({
|
||||
isPersonal,
|
||||
orgName,
|
||||
userName,
|
||||
userEmail,
|
||||
}: Props) {
|
||||
const t = useTranslations("settingsBilling");
|
||||
const tCommon = useTranslations("common");
|
||||
@@ -53,7 +61,12 @@ export function BillingSettingsForm({
|
||||
const [city, setCity] = useState(initial?.city ?? "");
|
||||
const [country, setCountry] = useState(initial?.country ?? "CH");
|
||||
const [vatNumber, setVatNumber] = useState(initial?.vatNumber ?? "");
|
||||
const [billingEmail, setBillingEmail] = useState(initial?.billingEmail ?? "");
|
||||
// Default billing email to the user's registration email when no
|
||||
// record exists yet. They can change it (a separate accounting
|
||||
// address is common); we just want sensible pre-fill on first edit.
|
||||
const [billingEmail, setBillingEmail] = useState(
|
||||
initial?.billingEmail ?? userEmail ?? ""
|
||||
);
|
||||
const [notes, setNotes] = useState(initial?.notes ?? "");
|
||||
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
@@ -227,7 +240,9 @@ export function BillingSettingsForm({
|
||||
onChange={(e) => setNotes(e.target.value)}
|
||||
rows={3}
|
||||
className="w-full px-3 py-2 rounded-lg border border-border bg-surface-2 text-text-primary text-sm focus:outline-none focus:border-text-secondary"
|
||||
placeholder={t("notesPlaceholder")}
|
||||
placeholder={t(
|
||||
isPersonal ? "notesPlaceholderPersonal" : "notesPlaceholder"
|
||||
)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -118,7 +118,8 @@
|
||||
"rejectionReason": "Angegebener Grund",
|
||||
"saveChanges": "Änderungen speichern",
|
||||
"billingVatNumber": "MWST-Nummer",
|
||||
"billingVatHelp": "Ihre registrierte MWST-Nummer. Falls Ihre Firma von der MWST befreit ist, leer lassen und in den Notizen erläutern."
|
||||
"billingVatHelp": "Ihre registrierte MWST-Nummer. Falls Ihre Firma von der MWST befreit ist, leer lassen und in den Notizen erläutern.",
|
||||
"billingNotesPlaceholderPersonal": "Was wir wissen sollten — bevorzugte Zahlungsart, Rechnungsreferenz, etc."
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
@@ -389,7 +390,8 @@
|
||||
"subtitle": "Organisationsweite Konfiguration, die für alle Ihre Tenants gilt.",
|
||||
"billingTitle": "Abrechnung",
|
||||
"billingDescription": "Adresse, MWST-Nummer und Rechnungs-E-Mail für alle Ihre Tenants.",
|
||||
"nothingForYou": "Für Ihre Rolle gibt es hier noch nichts. Inhaber können Organisationseinstellungen verwalten."
|
||||
"nothingForYou": "Für Ihre Rolle gibt es hier noch nichts. Inhaber können Organisationseinstellungen verwalten.",
|
||||
"billingDescriptionPersonal": "Adresse und Rechnungs-E-Mail für alle Ihre Tenants."
|
||||
},
|
||||
"settingsBilling": {
|
||||
"title": "Abrechnung",
|
||||
@@ -409,6 +411,7 @@
|
||||
"saved": "Gespeichert.",
|
||||
"saveFailed": "Konnte nicht gespeichert werden. Bitte erneut versuchen.",
|
||||
"lastUpdated": "Zuletzt aktualisiert {when}",
|
||||
"fullName": "Voller Name"
|
||||
"fullName": "Voller Name",
|
||||
"notesPlaceholderPersonal": "Was wir wissen sollten — bevorzugte Zahlungsart, Rechnungsreferenz, etc."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,8 @@
|
||||
"rejectionReason": "Reason given",
|
||||
"saveChanges": "Save changes",
|
||||
"billingVatNumber": "VAT number",
|
||||
"billingVatHelp": "Your registered VAT identifier. If your company is VAT-exempt, leave blank and explain in the notes field."
|
||||
"billingVatHelp": "Your registered VAT identifier. If your company is VAT-exempt, leave blank and explain in the notes field.",
|
||||
"billingNotesPlaceholderPersonal": "Anything we should know — preferred payment method, billing reference, etc."
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
@@ -389,7 +390,8 @@
|
||||
"subtitle": "Manage org-level configuration that applies to all your tenants.",
|
||||
"billingTitle": "Billing",
|
||||
"billingDescription": "Address, VAT number, and invoice email used for all your tenants.",
|
||||
"nothingForYou": "There's nothing here for your role yet. Owners can manage org settings."
|
||||
"nothingForYou": "There's nothing here for your role yet. Owners can manage org settings.",
|
||||
"billingDescriptionPersonal": "Address and invoice email used for all your tenants."
|
||||
},
|
||||
"settingsBilling": {
|
||||
"title": "Billing",
|
||||
@@ -409,6 +411,7 @@
|
||||
"saved": "Saved.",
|
||||
"saveFailed": "Could not save. Please try again.",
|
||||
"lastUpdated": "Last updated {when}",
|
||||
"fullName": "Full name"
|
||||
"fullName": "Full name",
|
||||
"notesPlaceholderPersonal": "Anything we should know — preferred payment method, billing reference, etc."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,8 @@
|
||||
"rejectionReason": "Motif indiqué",
|
||||
"saveChanges": "Enregistrer les modifications",
|
||||
"billingVatNumber": "Numéro de TVA",
|
||||
"billingVatHelp": "Votre identifiant TVA enregistré. Si votre entreprise est exonérée de TVA, laissez vide et précisez dans les notes."
|
||||
"billingVatHelp": "Votre identifiant TVA enregistré. Si votre entreprise est exonérée de TVA, laissez vide et précisez dans les notes.",
|
||||
"billingNotesPlaceholderPersonal": "Tout ce que nous devons savoir — moyen de paiement préféré, référence de facturation, etc."
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Tableau de bord",
|
||||
@@ -389,7 +390,8 @@
|
||||
"subtitle": "Gérez la configuration au niveau de l'organisation, qui s'applique à tous vos locataires.",
|
||||
"billingTitle": "Facturation",
|
||||
"billingDescription": "Adresse, numéro de TVA et e-mail de facturation utilisés pour tous vos locataires.",
|
||||
"nothingForYou": "Il n'y a rien ici pour votre rôle pour le moment. Les propriétaires peuvent gérer les paramètres de l'organisation."
|
||||
"nothingForYou": "Il n'y a rien ici pour votre rôle pour le moment. Les propriétaires peuvent gérer les paramètres de l'organisation.",
|
||||
"billingDescriptionPersonal": "Adresse et e-mail de facturation utilisés pour tous vos locataires."
|
||||
},
|
||||
"settingsBilling": {
|
||||
"title": "Facturation",
|
||||
@@ -409,6 +411,7 @@
|
||||
"saved": "Enregistré.",
|
||||
"saveFailed": "Impossible d'enregistrer. Veuillez réessayer.",
|
||||
"lastUpdated": "Dernière mise à jour {when}",
|
||||
"fullName": "Nom complet"
|
||||
"fullName": "Nom complet",
|
||||
"notesPlaceholderPersonal": "Tout ce que nous devons savoir — moyen de paiement préféré, référence de facturation, etc."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,8 @@
|
||||
"rejectionReason": "Motivo indicato",
|
||||
"saveChanges": "Salva modifiche",
|
||||
"billingVatNumber": "Partita IVA",
|
||||
"billingVatHelp": "Il tuo identificativo IVA registrato. Se la tua azienda è esente IVA, lascia vuoto e spiega nelle note."
|
||||
"billingVatHelp": "Il tuo identificativo IVA registrato. Se la tua azienda è esente IVA, lascia vuoto e spiega nelle note.",
|
||||
"billingNotesPlaceholderPersonal": "Qualsiasi cosa dovremmo sapere — metodo di pagamento preferito, riferimento per fatturazione, ecc."
|
||||
},
|
||||
"dashboard": {
|
||||
"title": "Dashboard",
|
||||
@@ -389,7 +390,8 @@
|
||||
"subtitle": "Gestisci la configurazione a livello di organizzazione, valida per tutti i tuoi tenant.",
|
||||
"billingTitle": "Fatturazione",
|
||||
"billingDescription": "Indirizzo, numero di IVA ed e-mail di fatturazione usati per tutti i tuoi tenant.",
|
||||
"nothingForYou": "Al momento non c'è nulla qui per il tuo ruolo. I proprietari possono gestire le impostazioni dell'organizzazione."
|
||||
"nothingForYou": "Al momento non c'è nulla qui per il tuo ruolo. I proprietari possono gestire le impostazioni dell'organizzazione.",
|
||||
"billingDescriptionPersonal": "Indirizzo ed e-mail di fatturazione usati per tutti i tuoi tenant."
|
||||
},
|
||||
"settingsBilling": {
|
||||
"title": "Fatturazione",
|
||||
@@ -409,6 +411,7 @@
|
||||
"saved": "Salvato.",
|
||||
"saveFailed": "Impossibile salvare. Riprova.",
|
||||
"lastUpdated": "Ultimo aggiornamento {when}",
|
||||
"fullName": "Nome completo"
|
||||
"fullName": "Nome completo",
|
||||
"notesPlaceholderPersonal": "Qualsiasi cosa dovremmo sapere — metodo di pagamento preferito, riferimento per fatturazione, ecc."
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user