The legal wording, rules and defaults of the country pack Germany were reviewed against the UStG, the UStDV, the UStAE, the BMF letters of 15 October 2025 and 15 October 2026 and the case law, and confirmed by a tax adviser in October 2026. The changes below follow from that review. Quittio remains software, not tax advice; see the legal review and the disclaimer in the README.
Added
DE-USTG-16 (warning): an invoice to a business, or for a service in connection with a property, issued more than six months after the supply (section 14 (2) sentence 2 UStG). Cancellations, corrections, prepayment invoices and re-issued invoices are skipped.DE-USTG-17 (warning): a prepayment invoice (386) with an amount already paid (BT-113) but no VAT point date (BT-7). The date of receipt must be stated if it differs from the issue date (section 14 (4) sentence 1 no. 6 UStG).->de()->serviceDateOpen() for prepayment invoices whose date of the service is not agreed yet: flag de.service_date_open and the note LegalTexts::SERVICE_DATE_OPEN ("Der Zeitpunkt der Leistung ist noch nicht vereinbart."). DE-USTG-03 no longer warns about the missing date then (section 14.8 (4) sentence 5 UStAE).->de()->smallBusinessId('DE123456789EX') for small businesses that state their small business identification number (suffix EX) instead of the tax number (section 34a sentence 1 no. 2 UStDV). It sets the number as tax number (BT-32) and the small business flag. VatIdFormat::isSmallBusinessId() recognises such numbers.QUITTIO-SME-ID (info): a small business identification number (suffix EX) in a VAT identifier field (BT-31, BT-48, BT-63). It is no VAT identifier (Article 284 (3) VAT Directive) and cannot be checked in VIES.UstgRules::supplyDate(): the supply date that DE-USTG-08, DE-USTG-15 and DE-USTG-16 use.- Tax presets can require an invoice note: presets that implement
Quittio\Core\Tax\StatesInvoiceNote give a text (invoiceNote()), which the builder adds once as note (BT-22, subject REG) when a line uses the preset, unless the invoice has a note with the same text. The PDF lists such a text once, also when it is the exemption reason (BT-120) as well. - The German margin scheme, travel agency and triangular transaction presets state their text of section 14a (6) and (7) UStG also as invoice note, as the mapping table of KoSIT and FeRD assigns these statements to the invoice note (BG-1).
VatPreset::ZeroRatedPv adds the note "Steuersatz 0 % nach § 12 Abs. 3 UStG." (LegalTexts::ZERO_RATED_PV), which category Z cannot carry as exemption reason. VatPreset::BusinessTransfer (de.business_transfer): transfer of a business as a whole (Geschäftsveräußerung im Ganzen, section 1 (1a) UStG), category O with VATEX-EU-O and the text "Nicht steuerbare Geschäftsveräußerung im Ganzen (§ 1 Abs. 1a UStG).". Like every category O invoice it states tax numbers instead of VAT identifiers (BR-O-02).->de()->discountAgreement('der Bonusvereinbarung vom 01.01.2026') refers to agreed bonuses or rebates whose amount is not known yet (section 14 (4) no. 7 UStG) with the note LegalTexts::DISCOUNT_AGREEMENT.Quittio::correction($original, $number, reason: …) (core and Laravel facade, Corrections\Correction::of()) starts a corrected invoice (384) that replaces the original: a copy with the new number, BG-3 and the note "Diese Rechnung berichtigt und ersetzt die Rechnung … vom …" (label correction_note), titled by the policy (correction, Germany: "Rechnungskorrektur"). Credit notes and self-billed documents are rejected. The new rule DE-USTG-18 (warning) reports a 384 without such a note (section 31 (5) UStDV, section 15.2a (7) UStAE).Quittio::priceReduction($original, $number, PriceReductionReason::CashDiscount, percent: '2') (core and Laravel facade, Corrections\PriceReduction::of()) builds a document on the reduction of the consideration (section 17 UStG): a credit note (381) with one line per reduced VAT group, BG-3, the flag price_reduction and a note that names reason, net amount and VAT per rate. The reduction is a percentage, a net amount (one VAT group) or net amounts per VAT group ('S:19' => '50.00'). The German policy titles it "Entgeltminderung" (title price_reduction).CorrectionPolicy takes a strategyResolver that chooses the cancellation strategy per original (cancellationStrategyFor()); Quittio::cancellation() uses it when neither the argument nor the configuration sets one. The German pack cancels self-billed invoices with a Leitweg-ID (sent as XRechnung) by a negative self-billed invoice (389) instead of 261, which XRechnung does not list (BR-DE-17).- Bonus statements (
DocumentType::BonusStatement, DocumentBuilder::bonusStatement(), Quittio::bonusStatement() in Laravel): the reduction of the consideration of the supplies of a period, e.g. an annual bonus, per VAT rate (section 17 (4) UStG). bonusPeriod(), bonusAgreement() and bonusInvoices() set period, agreement and invoices (DocumentData::$bonus, BonusStatement); bonus() and bonusOnRevenue() add one reduction per VAT rate as a line. The PDF names period and agreement (label bonus_statement_note, with "§ 17 Abs. 4 UStG" from the German pack), names reductions instead of prices, VAT and amounts ("Minderung", "Minderung USt. 19 %", "Bonus gesamt (brutto)") and shows no bank details or amount due. Reductions for intra-community supplies and exports state "Minderung des Entgelts für steuerfreie innergemeinschaftliche Lieferungen" or "… Ausfuhrlieferungen" instead of the exemption text of a supply. - The PDF prints the text of a special scheme once when it is also part of the joined exemption reason (BT-120) of a mixed exempt group; the note (BT-22) stays in the XML.
- Documents have plausibility notices (
DocumentData::notices(), RenderedDocument::notices() in core and Laravel; the render run logs them as warnings): QUITTIO-DUNNING-FLAT-RATE-FEES for a reminder to a business that claims the flat rate and reminder fees, which count towards it (section 288 (5) sentence 3 BGB). DE-USTG-19 (info): a final invoice deducts an advance settled by self-billing (389) but is no self-billed invoice itself (flag de.self_billed_advance, set by deductAdvance()).->de()->advance($expectedService, receivedOn: …) builds a prepayment invoice (386): the note "Anzahlungsrechnung. Die Leistung wird voraussichtlich am … / im … erbracht." with the expected date or month ("2027-03"), or without one the note that the date is not agreed yet. A date of receipt is stated as VAT point date (BT-7) and in the note "Die Anzahlung wurde am … vereinnahmt." (LegalTexts::PREPAYMENT_MONTH, PREPAYMENT_RECEIVED, flag de.expected_service_date).->de()->deductAdvance($advance, received: …) deducts only the amount received: a part is distributed over the VAT rows of the advance invoice and the VAT taken out of each part (section 14.8 (5) UStAE); GermanInvoice::RECEIVED_IN_FULL deducts the whole advance. Without received: the whole advance is deducted as before, and the new warning DE-USTG-20 asks to confirm the amount (flag de.advance_receipt_unconfirmed).DocumentBuilder::flatRate($claim, $amount = '40.00') adds the flat rate for recovery costs of a late payment (Article 6 Directive 2011/7/EU, section 288 (5) BGB) for one claim, as DunningFee of the new kind DunningFeeKind::FlatRate with the claim (DunningFee::$kind, $claim). Building a reminder rejects a second flat rate of the same claim and a flat rate for a consumer.- Country packs can complete an invoice before it is calculated, validated and rendered (
Countries\Capabilities\CompletesInvoices::complete()), with their settings from Config::$countrySettings (core: countries.{code}, Laravel: quittio.countries.{code}). - The German pack leaves out the VAT identifiers of seller and buyer on invoices of category O only (not subject to VAT), which EN 16931 forbids (BR-O-02), when the seller's tax number is given and there is no tax representative: flag
de.vat_ids_omitted, info DE-CATEGORY-O-01. Otherwise the info DE-CATEGORY-O-02 names what is missing. Setting quittio.countries.de.omit_vat_ids_for_category_o (default true). - The German pack adds the default notice of section 286 (3) BGB (
LegalTexts::CONSUMER_DEFAULT, subject PMT) to every invoice for a consumer that does not have one: without it the 30 days do not apply to consumers. Switch it off with quittio.countries.de.consumer_default_notice = false. - The German pack checks the e-invoice obligation of section 14 (1) and section 27 (38) UStG when a run produces no e-invoice (plain PDF, MINIMUM, BASIC WL):
DE-EINVOICE-01 (error) when an e-invoice is required (supplies from 2028, of 2027 with a prior-year turnover above 800,000 EUR, or after the end of the transition), DE-EINVOICE-02 (warning) while the transition still allows an other invoice, as PDF only with the buyer's consent. Not for consumers, buyers or sellers outside the Inland, small amount invoices up to 250 EUR, small businesses, tickets (->de()->ticket()), supplies exempt under section 4 no. 8 to 29 UStG only, cancellations and corrections, nor for drafts. Prepayment invoices count with their issue date. New setting quittio.countries.de.prior_year_turnover_above_800k (default false). Both findings are BMF format errors. - A PDF or HTML rendered in one run with an XML-only e-invoice (e.g.
['xrechnung-cii', 'pdf']) states in its legal notes that it is a readable copy: "Lesbare Darstellung der E-Rechnung (XRechnung 3.0) Nr. … – inhaltsgleiches Mehrstück. Maßgeblich ist ausschließlich die XML-Datei." (label einvoice_visualization). The render option visualization_notice = false leaves it out. tools/validate-fixtures.php writes 13 further German documents (small business with identification number, prepayment invoice, final invoices with full, partial and remainder deduction, self-billed invoice and both of its cancellations, corrected invoice, price reduction, business transfer, photovoltaic, margin scheme) in EN 16931 and XRechnung, CII and UBL, and as ZUGFeRD PDF, so that KoSIT and veraPDF check them in CI.- The validation context carries whether the run produces an e-invoice (option
e_invoice) and the settings of the country packs (option countries). ->de()->deductAdvance($advance, style: GermanInvoice::REMAINDER) deducts the advance as negative lines per VAT rate instead of the prepaid amount (remainder invoice, section 14.8 (11) UStAE), with the note LegalTexts::ADVANCE_DEDUCTION_REMAINDER. The default PREPAID stays (BT-113 with the itemisation in BT-22, accepted by the BMF letter of 15 October 2026 until 30 June 2030).
Changed
DE-USTG-06 (missing "Steuerschuldnerschaft des Leistungsempfängers") is an error instead of a warning: the statement is mandatory (section 14a (1) sentence 1 and (5) sentence 1 UStG). The buyer owes the VAT all the same.DE-USTG-11 no longer requires a VAT identifier of a small business seller for reverse charge services in another member state and triangular transactions (section 19 (1) sentence 2 UStG). The buyer's VAT identifier is still required.- Small business invoices (section 34a UStDV) are recognised by the small business flag as well:
UstgRules::isSmallBusinessInvoice() is true when the flag is set or a line uses VatPreset::SmallBusiness (before: every line). DE-USTG-03 and the mandatory PDF output skip the service date for them, as DE-USTG-09 and DE-USTG-14 already did. DE-USTG-15 checks final invoices (BG-3 with a prepaid amount BT-113): on intra-community supplies advance payments trigger no VAT, so the final invoice has the deadline. Re-issued invoices with BG-3 and no prepaid amount are still skipped.DE-USTG-08 takes the small amount limit of the supply date instead of the issue date (the raise to 250 EUR applies to supplies from 1 January 2017), and the issue date only without a supply date.DE-USTG-04 (missing "Gutschrift") is a warning when the XML is written: in an e-invoice the type code labels a self-billed invoice (section 14.5 (24) sentence 1 UStAE). It stays an error otherwise.QUITTIO-VATID-FORMAT no longer reports small business identification numbers, and DE-TAX-NUMBER accepts them as tax number of a small business.- German default interest counts actual/actual:
CountryDE::dunningLaw()->dayCount is null instead of 365, so the days of a leap year are divided by 366 (as the statutory conventions of the annex to section 16 PAngV do); a full leap year yields exactly the annual rate. DunningLaw::$dayCount accepts null. LegalTexts::PREPAYMENT reads "Anzahlungsrechnung. Die Leistung wird voraussichtlich am :date erbracht." ("Advance invoice. The service is expected to be performed on :date."): the sentence that VAT becomes due on receipt is not required and was dropped.- The PDF and HTML recognise margin scheme and travel agency lines by their own exemption code: their lines show no rate also when the exempt VAT group lost its code because other exemptions share it (
QUITTIO-EXEMPTION-CONFLICT), and a group of different special schemes is shown as special scheme. An exempt group that mixes a special scheme with other exemptions is shown in two rows of vatRows ("Sonderregelung, kein gesonderter Steuerausweis: …" and "Umsatzsteuerfrei … auf …"), or in one row without rate and VAT amount (vat_row_exempt_special_scheme) when an exempt document level allowance or charge makes the parts unknown. ViewModelFactory::mixedExemptGroup() and vatRowIndexes() tell templates and country packs which row shows which VAT breakdown row. - The readable copy notice of a PDF next to an XRechnung is the last of the
legalNotes, so that the note paths of MandatoryFieldGuard::notePath() stay valid. - The text of
VatPreset::NotTaxableInGermany names the place of supply abroad: "Nicht im Inland steuerbare Leistung (Leistungsort im Ausland)" ("Service not taxable in Germany (place of supply abroad)"). - The note of a partial cancellation whose VAT is aligned with the earlier ones (
cancellation_vat_aligned) explains the rounding: "Rundungsausgleich: Die Umsatzsteuer dieses Teilstornos ist so bemessen, dass alle Teilstornos zur Rechnung RE-… zusammen deren Umsatzsteuer exakt berichtigen." The label takes the placeholder :number; overridden labels without it keep working.