invoice/app/config.yml
Claude ff5f4bdb19
Apply UX feedback: field locking, dynamic FX labels, line persistence
Charge to:
- All fields locked when "Select"; fill+lock on predefined entity;
  unlock all fields only when "Other" is chosen

Invoice lines:
- QTY, UOM, Price start disabled; Description dropdown is always active
- Predefined item: fills UOM (locked) and rate (editable) from config
- "Other": unlocks all three fields

Foreign currency:
- Unit Price locked and calculated-only when FX is enabled
- Re-enables Unit Price when FX is toggled back to No
- Exchange rate label dynamically shows "Exchange rate (X USD = 1 EUR)"
  using the selected foreign currency and invoice currency
- Per-item label shows "Price per item in USD" (selected FCY)
- Label updates when either currency changes

Invoice output:
- FX note shows "Price per item (foreign currency): USD …" —
  the "Converted from …" prefix is removed from preview and PDF

Invoice lines persistence:
- Lines saved to localStorage on every change (desc, qty, UOM, price,
  FX toggle, FCY, rate, per-item)
- Lines fully restored on page reload including FX state
- "Reset invoice lines" button added to the INVOICE LINES card header
2026-05-24 16:09:12 +00:00

517 lines
12 KiB
YAML

# Invoice App Configuration
# (C) 2026 Kristian Benestad. Licensed under the Apache 2 license.
# ── Default language ───────────────────────────────────────────────────────────
default-code: en
default-name: English
default-direction: ltr
# ── Available languages ────────────────────────────────────────────────────────
languages:
- code: en
name: English
direction: ltr
- code: de
name: Deutsch
direction: ltr
- code: fr
name: Français
direction: ltr
- code: "no"
name: Norsk
direction: ltr
# ── Payment info visibility ───────────────────────────────────────────────────
# Set to true to hide the payment info panel entirely (useful if payment info
# should not appear on invoices, e.g. per company policy).
hide-payment-info: false
# ── Date and paper format ─────────────────────────────────────────────────────
# Date tokens: d=day, dd=day(0-padded), M=month number, MM=month(0-padded),
# MMM=short month name, MMMM=full month name, YY=2-digit year, YYYY=4-digit year
date-format: "d MMMM YYYY"
# paper-format: a4 or letter
paper-format: a4
# ── Tax types (user builds tax lines; these are the label options) ─────────────
tax-types:
- key: vat
labels:
en: VAT
de: MwSt.
fr: TVA
"no": MVA
- key: gst
labels:
en: GST
de: GST
fr: TPS
"no": GST
- key: sales-tax
labels:
en: Sales Tax
de: Umsatzsteuer
fr: Taxe de vente
"no": Omsetningsavgift
- key: withholding
labels:
en: Withholding Tax
de: Quellensteuer
fr: "Retenue à la source"
"no": Kildeskatt
- key: other
labels:
en: Other Tax
de: Sonstige Steuer
fr: Autre taxe
"no": Annen skatt
# ── Units of measure ──────────────────────────────────────────────────────────
uom:
- code: EA
labels:
en: Each
de: Stück
fr: Pièce
"no": Stykk
- code: HR
labels:
en: Hour
de: Stunde
fr: Heure
"no": Time
- code: DY
labels:
en: Day
de: Tag
fr: Jour
"no": Dag
- code: WK
labels:
en: Week
de: Woche
fr: Semaine
"no": Uke
- code: MO
labels:
en: Month
de: Monat
fr: Mois
"no": Måned
- code: LS
labels:
en: Lump Sum
de: Pauschale
fr: Forfait
"no": Engangsbeløp
# ── Predefined recipients (charge-to) ─────────────────────────────────────────
charge-to:
- display: Acme Corporation
name: Acme Corporation Ltd.
address1: 123 Business Avenue
address2: Suite 400
address3: New York, NY 10001
address4: ""
country: US
phone: "+1-212-555-0100"
email: accounts@acmecorp.example
vat-id: "US-EIN-12-3456789"
reg-no: ""
currency: USD
- display: Example NGO
name: Example Non-Profit Organisation
address1: 45 Charity Lane
address2: London EC1A 1BB
address3: ""
address4: ""
country: GB
phone: "+44 20 7123 4567"
email: finance@examplengo.example
vat-id: "GB123456789"
reg-no: "01234567"
currency: GBP
# ── Project codes ──────────────────────────────────────────────────────────────
project-codes:
- Project 100
- Project 110
- Project 230
# ── Predefined products / services ────────────────────────────────────────────
products:
- code: CONSULTING
description:
en: Consulting Services
de: Beratungsleistungen
fr: Services de conseil
"no": Konsulenttjenester
uom: HR
price: 100.00
- code: TRAINING
description:
en: Training
de: Schulung
fr: Formation
"no": Opplæring
uom: DY
price: 800.00
- code: REPORT
description:
en: Written Report
de: Schriftlicher Bericht
fr: Rapport écrit
"no": Skriftlig rapport
uom: EA
price: 500.00
- code: REVIEW
description:
en: Review & Feedback
de: Überprüfung & Feedback
fr: Révision et retours
"no": Gjennomgang og tilbakemelding
uom: HR
price: 120.00
# ── Foreign currency options ───────────────────────────────────────────────────
currencies:
- USD
- EUR
- GBP
- JPY
- CHF
- CAD
- AUD
- NOK
- SEK
- DKK
- THB
- SGD
- HKD
- INR
- MXN
- BRL
- ZAR
# ── UI label translations ──────────────────────────────────────────────────────
translations:
language:
en: Language
de: Sprache
fr: Langue
"no": Språk
invoice:
en: INVOICE
de: RECHNUNG
fr: FACTURE
"no": FAKTURA
sender-name:
en: Your Name / Organisation
de: Ihr Name / Organisation
fr: Votre nom / Organisation
"no": Ditt navn / Organisasjon
sender-address1:
en: Address Line 1
de: Adresszeile 1
fr: "Ligne d'adresse 1"
"no": Adresselinje 1
sender-address2:
en: Address Line 2
de: Adresszeile 2
fr: "Ligne d'adresse 2"
"no": Adresselinje 2
sender-address3:
en: Address Line 3
de: Adresszeile 3
fr: "Ligne d'adresse 3"
"no": Adresselinje 3
sender-address4:
en: Address Line 4
de: Adresszeile 4
fr: "Ligne d'adresse 4"
"no": Adresselinje 4
sender-country:
en: Country
de: Land
fr: Pays
"no": Land
sender-phone:
en: Phone
de: Telefon
fr: Téléphone
"no": Telefon
sender-email:
en: Email
de: E-Mail
fr: "E-mail"
"no": E-post
charge-to:
en: "Charge to"
de: "In Rechnung an"
fr: "Facturer à"
"no": "Faktureres til"
charge-to-name:
en: Organisation / Name
de: Organisation / Name
fr: Organisation / Nom
"no": Organisasjon / Navn
charge-to-address1:
en: Address Line 1
de: Adresszeile 1
fr: "Ligne d'adresse 1"
"no": Adresselinje 1
charge-to-address2:
en: Address Line 2
de: Adresszeile 2
fr: "Ligne d'adresse 2"
"no": Adresselinje 2
charge-to-address3:
en: Address Line 3
de: Adresszeile 3
fr: "Ligne d'adresse 3"
"no": Adresselinje 3
charge-to-address4:
en: Address Line 4
de: Adresszeile 4
fr: "Ligne d'adresse 4"
"no": Adresselinje 4
charge-to-country:
en: Country
de: Land
fr: Pays
"no": Land
charge-to-phone:
en: Phone
de: Telefon
fr: Téléphone
"no": Telefon
charge-to-email:
en: Email
de: E-Mail
fr: "E-mail"
"no": E-post
vat-id:
en: VAT / Tax ID
de: USt-IdNr.
fr: "N° TVA / ID fiscal"
"no": MVA-nummer
registration-no:
en: "Registration no."
de: "Handelsreg.-Nr."
fr: "N° d'enregistrement"
"no": "Organisasjonsnr."
invoice-date:
en: Invoice date
de: Rechnungsdatum
fr: Date de facture
"no": Fakturadato
project-code:
en: Project code
de: Projektnummer
fr: Code projet
"no": Prosjektkode
invoice-no:
en: "Invoice no."
de: "Rechnungsnr."
fr: "N° de facture"
"no": "Fakturanr."
qty:
en: QTY
de: Menge
fr: Qté
"no": Ant.
uom:
en: UOM
de: Einh.
fr: UM
"no": Enh.
description:
en: Description
de: Beschreibung
fr: Description
"no": Beskrivelse
price:
en: Unit Price
de: Einzelpreis
fr: Prix unitaire
"no": Enhetspris
line-total:
en: Line Total
de: Betrag
fr: Total ligne
"no": Linjebeløp
foreign-currency:
en: Foreign currency
de: Fremdwährung
fr: Devise étrangère
"no": Utenlandsk valuta
currency-code:
en: Currency code
de: Währungscode
fr: Code devise
"no": Valutakode
exchange-rate:
en: "Exchange rate (X foreign = 1 local)"
de: "Wechselkurs (X Fremd = 1 Inland)"
fr: "Taux de change (X étranger = 1 local)"
"no": "Valutakurs (X utenlandsk = 1 lokal)"
per-item:
en: Price per item (foreign currency)
de: Preis je Einheit (Fremdwährung)
fr: Prix par unité (devise étrangère)
"no": Pris per enhet (utenlandsk valuta)
total-local:
en: Line total (local currency)
de: Zeilenbetrag (Landeswährung)
fr: Total ligne (devise locale)
"no": Linjebeløp (lokal valuta)
add-line:
en: "+ Add new line"
de: "+ Neue Zeile hinzufügen"
fr: "+ Ajouter une ligne"
"no": "+ Legg til ny linje"
subtotal:
en: Subtotal
de: Zwischensumme
fr: Sous-total
"no": Delsum
tax:
en: Tax
de: Steuer
fr: Taxe
"no": Mva
paid:
en: Paid
de: Bezahlt
fr: Payé
"no": Betalt
to-pay:
en: To Pay
de: Zu zahlen
fr: À payer
"no": Å betale
generate-invoice:
en: Generate Invoice
de: Rechnung erstellen
fr: Générer la facture
"no": Generer faktura
other:
en: Other
de: Andere
fr: Autre
"no": Annet
select:
en: "— Select —"
de: "— Auswählen —"
fr: "— Sélectionner —"
"no": "— Velg —"
yes:
en: "Yes"
de: "Ja"
fr: "Oui"
"no": "Ja"
no-option:
en: "No"
de: "Nein"
fr: "Non"
"no": "Nei"
invoice-currency:
en: Invoice currency
de: Rechnungswährung
fr: Devise de facturation
"no": Fakturavaluta
add-tax:
en: "+ Add new tax"
de: "+ Neue Steuer hinzufügen"
fr: "+ Ajouter une taxe"
"no": "+ Legg til skatt"
tax-pct:
en: "%"
de: "%"
fr: "%"
"no": "%"
tax-amount:
en: Amount
de: Betrag
fr: Montant
"no": Beløp
converted-from:
en: Converted from
de: Umgerechnet aus
fr: Converti depuis
"no": Konvertert fra
download-pdf:
en: "Download PDF"
de: "PDF herunterladen"
fr: "Télécharger PDF"
"no": "Last ned PDF"
close:
en: Close
de: Schließen
fr: Fermer
"no": Lukk
invoice-lines:
en: Invoice Lines
de: Rechnungspositionen
fr: Lignes de facture
"no": Fakturalinjer
sender-section:
en: From
de: Von
fr: De
"no": Fra
invoice-details-section:
en: Invoice Details
de: Rechnungsdetails
fr: Détails de la facture
"no": Fakturaopplysninger
payment:
en: Payment
de: Zahlung
fr: Paiement
"no": Betaling
payment-terms:
en: Payment terms
de: Zahlungsbedingungen
fr: Conditions de paiement
"no": Betalingsbetingelser
payment-days:
en: days
de: Tage
fr: jours
"no": dager
pay-by:
en: Pay by
de: Zahlbar bis
fr: "À payer avant le"
"no": Betal innen
account-holder:
en: Account holder
de: Kontoinhaber
fr: Titulaire du compte
"no": Kontohaver
account-no:
en: "Account no. (BBAN/IBAN)"
de: "Kontonummer (BBAN/IBAN)"
fr: "N° de compte (BBAN/IBAN)"
"no": "Kontonr. (BBAN/IBAN)"
bank-bic:
en: "Bank / BIC (Swift code)"
de: "Bank / BIC (Swift)"
fr: "Banque / BIC (code Swift)"
"no": "Bank / BIC (Swift-kode)"
bank-address:
en: Bank address
de: Bankadresse
fr: Adresse de la banque
"no": Bankadresse
payment-ref:
en: Please use reference
de: Bitte Referenz angeben
fr: "Merci d'indiquer la référence"
"no": Vennligst oppgi referanse
reset-lines:
en: Reset invoice lines
de: Positionen zurücksetzen
fr: Réinitialiser les lignes
"no": Tilbakestill linjer