mirror of
https://github.com/kbenestad/invoice.git
synced 2026-06-18 16:14:33 +00:00
Left brand: - org-name set in config → kb-brand with 46px logo, org name, optional subheading (org-subheading) - org-name absent/empty → plain app-wordmark (icon + "invoice") Right doctitle: - h1: 24px icon inline + lowercase "invoice" (built by buildHeader()) - .meta: invoice number, live-updates as user types in the ino field Toolbar: - Theme toggle updated to moon-phase icon (matches timesheet) - ⓘ button added; shown only when cfg.about is configured config.yml: org-name / org-subheading keys documented (commented out) About modal comment updated to mention ⓘ button https://claude.ai/code/session_01MkM7p8Us3L8YAfLKGA13NS
584 lines
14 KiB
YAML
584 lines
14 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
|
|
|
|
# ── Organisation brand ────────────────────────────────────────────────────────
|
|
# Optional. Set org-name to show a branded header (org logo + name + subheading).
|
|
# Leave org-name absent or empty to show the plain "invoice" wordmark instead.
|
|
# org-name: "Acme Corporation"
|
|
# org-subheading: "Freelance invoicing"
|
|
|
|
# ── About modal ───────────────────────────────────────────────────────────────
|
|
# Optional. Remove this section entirely to hide the ⓘ button and footer link.
|
|
about:
|
|
en:
|
|
title: "About"
|
|
content: |
|
|
### Invoice Generator
|
|
A single-file browser app for generating freelance invoices as PDF.
|
|
No backend, no build step — just a browser and a config file.
|
|
|
|
**Source:** [kbenestad/invoice](https://github.com/kbenestad/invoice)
|
|
**Docs:** [docs.benestad.net/invoice](https://docs.benestad.net/invoice)
|
|
|
|
© 2026 Kristian Benestad. Licensed under the Apache 2 license.
|
|
btn-close: "Close"
|
|
de:
|
|
title: "Über"
|
|
content: |
|
|
### Rechnungsgenerator
|
|
Eine Single-File-Browser-App zur Erstellung von Freiberufler-Rechnungen als PDF.
|
|
Kein Backend, kein Build-Schritt.
|
|
|
|
**Quellcode:** [kbenestad/invoice](https://github.com/kbenestad/invoice)
|
|
**Dokumentation:** [docs.benestad.net/invoice](https://docs.benestad.net/invoice)
|
|
|
|
© 2026 Kristian Benestad. Lizenziert unter Apache 2.
|
|
btn-close: "Schließen"
|
|
fr:
|
|
title: "À propos"
|
|
content: |
|
|
### Générateur de factures
|
|
Une application de navigateur en fichier unique pour générer des factures en PDF.
|
|
Aucun backend, aucune étape de build.
|
|
|
|
**Code source :** [kbenestad/invoice](https://github.com/kbenestad/invoice)
|
|
**Documentation :** [docs.benestad.net/invoice](https://docs.benestad.net/invoice)
|
|
|
|
© 2026 Kristian Benestad. Sous licence Apache 2.
|
|
btn-close: "Fermer"
|
|
"no":
|
|
title: "Om"
|
|
content: |
|
|
### Fakturagenerator
|
|
En nettleserapp i én fil for å generere frilansfakturaer som PDF.
|
|
Ingen backend, ingen byggtrinn.
|
|
|
|
**Kildekode:** [kbenestad/invoice](https://github.com/kbenestad/invoice)
|
|
**Dokumentasjon:** [docs.benestad.net/invoice](https://docs.benestad.net/invoice)
|
|
|
|
© 2026 Kristian Benestad. Lisensiert under Apache 2.
|
|
btn-close: "Lukk"
|
|
|
|
# ── 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
|
|
project-codes:
|
|
- AC-100
|
|
- AC-110
|
|
- AC-200
|
|
- 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:
|
|
- NGO-2026-01
|
|
- NGO-2026-02
|
|
- NGO-2026-03
|
|
|
|
# ── 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
|
|
qty: 1
|
|
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: Issuer
|
|
de: Issuer
|
|
fr: Issuer
|
|
"no": Issuer
|
|
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: Foreign currency code
|
|
de: Fremdwährungscode
|
|
fr: Code devise étrangère
|
|
"no": Utenlandsk valutakode
|
|
exchange-rate:
|
|
en: Exchange rate
|
|
de: Wechselkurs
|
|
fr: Taux de change
|
|
"no": Valutakurs
|
|
per-item:
|
|
en: Price per item in
|
|
de: Preis je Einheit in
|
|
fr: Prix par unité en
|
|
"no": Pris per enhet i
|
|
total-foreign:
|
|
en: Line total in
|
|
de: Zeilenbetrag in
|
|
fr: Total ligne en
|
|
"no": Linjebeløp i
|
|
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
|