[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs:country-packs":3},{"versions":4,"version":26,"nav":28,"path":73,"kind":106,"page":107},[5,10,13,16,18,20,22,24],{"name":6,"label":7,"prefix":8,"channel":9},"0.7","0.7 (latest)","","latest",{"name":11,"label":12,"prefix":11,"channel":11},"next","next (unreleased)",{"name":14,"label":14,"prefix":14,"channel":15},"0.6","old",{"name":17,"label":17,"prefix":17,"channel":15},"0.5",{"name":19,"label":19,"prefix":19,"channel":15},"0.4",{"name":21,"label":21,"prefix":21,"channel":15},"0.3",{"name":23,"label":23,"prefix":23,"channel":15},"0.2",{"name":25,"label":25,"prefix":25,"channel":15},"0.1",{"name":6,"label":7,"prefix":8,"channel":9,"base":27},"\u002Fdocs",[29,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,91,94,97,100,103],{"slug":30,"title":31,"preview":32},"index","Home",false,{"slug":34,"title":35,"preview":32},"getting-started","Getting started",{"slug":37,"title":38,"preview":32},"concepts","E-invoicing basics",{"slug":40,"title":41,"preview":32},"examples","Examples",{"slug":43,"title":44,"preview":32},"building-invoices","Building invoices",{"slug":46,"title":47,"preview":32},"formats","Formats and profiles",{"slug":49,"title":50,"preview":32},"validation","Validation",{"slug":52,"title":53,"preview":32},"templates","Templates and design",{"slug":55,"title":56,"preview":32},"documents","Quotes and other documents",{"slug":58,"title":59,"preview":32},"reading","Reading incoming invoices",{"slug":61,"title":62,"preview":32},"laravel","Laravel integration",{"slug":64,"title":65,"preview":32},"configuration","Configuration",{"slug":67,"title":68,"preview":32},"commands","Artisan commands",{"slug":70,"title":71,"preview":32},"testing","Testing",{"slug":73,"title":74,"preview":32},"country-packs","Country packs",{"slug":76,"title":77,"parent":74,"preview":32},"country-at","Austria",{"slug":79,"title":80,"parent":74,"preview":32},"country-be","Belgium",{"slug":82,"title":83,"parent":74,"preview":32},"country-ch","Switzerland",{"slug":85,"title":86,"parent":74,"preview":32},"country-fr","France",{"slug":88,"title":89,"preview":90},"managed","Managed layer (preview)",true,{"slug":92,"title":93,"preview":32},"troubleshooting","Troubleshooting",{"slug":95,"title":96,"preview":32},"faq","FAQ",{"slug":98,"title":99,"preview":32},"compatibility","Versioning and compatibility",{"slug":101,"title":102,"preview":32},"field-reference","Field reference",{"slug":104,"title":105,"preview":32},"ai","AI assistants","page",{"title":74,"description":108,"html":109,"headings":110,"editUrl":250,"markdownUrl":251,"prev":252,"next":253},"A country pack holds everything in Quittio that differs between countries: VAT rates and exemption texts, national invoice rules and profiles, the formats a country prescribes, legal notices, letter layouts, numbering …","\u003Ch1 id=\"country-packs\">Country packs\u003C\u002Fh1>\n\u003Cp>A country pack holds everything in Quittio that differs between countries: VAT rates and exemption texts, national invoice rules and profiles, the formats a country prescribes, legal notices, letter layouts, numbering and retention periods, and the law on late payment. The core of Quittio stays country-neutral. Quittio ships a pack for Germany, and \u003Ccode>quittio\u002Fquittio\u003C\u002Fcode> installs it. Packs for \u003Ca href=\"\u002Fdocs\u002Fcountry-at\">Austria\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fcountry-be\">Belgium\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fcountry-ch\">Switzerland\u003C\u002Fa> and \u003Ca href=\"\u002Fdocs\u002Fcountry-fr\">France\u003C\u002Fa> are published as separate packages; their legal wording is not reviewed by a tax adviser yet (\u003Ca href=\"#other-countries\">Other countries\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>Read this page when you invoice from Germany and need more than a standard invoice: an exemption or reverse charge, a small business invoice, XRechnung for a public buyer, a reminder with default interest or a letter layout after DIN 5008 (the German standard for business letters). Read it also when you want to support another country. If terms such as EN 16931, XRechnung, profile or \u003Ccode>BR-DE\u003C\u002Fcode> codes are new to you, read \u003Ca href=\"\u002Fdocs\u002Fconcepts\">E-invoicing basics\u003C\u002Fa> first.\u003C\u002Fp>\n\u003Cp>The page has two parts:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Part\u003C\u002Fth>\n\u003Cth>For\u003C\u002Fth>\n\u003Cth>Start with\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Using the German pack\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd data-label=\"For\">Everyone who invoices as a seller in Germany (most readers)\u003C\u002Ftd>\n\u003Ctd data-label=\"Start with\">\u003Ca href=\"#germany-quittiocountry-de\">Germany (\u003Ccode>quittio\u002Fcountry-de\u003C\u002Fcode>)\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>Writing a country pack\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd data-label=\"For\">Developers who add another country or change how a pack behaves\u003C\u002Ftd>\n\u003Ctd data-label=\"Start with\">\u003Ca href=\"#how-a-pack-is-selected\">How a pack is selected\u003C\u002Fa>, \u003Ca href=\"#writing-your-own-country-pack\">Writing your own country pack\u003C\u002Fa>, \u003Ca href=\"#the-countrypack-contract\">The \u003Ccode>CountryPack\u003C\u002Fcode> contract\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The legal wording, references, rules and defaults of the German pack were reviewed in October 2026 and confirmed by a tax adviser; they reflect the law of that time. Quittio is no tax advice, and the issuer of an invoice remains responsible for it (see the legal review and the disclaimer in the README).\u003C\u002Fp>\n\u003Ch2 id=\"germany-quittiocountry-de\">Germany (\u003Ccode>quittio\u002Fcountry-de\u003C\u002Fcode>)\u003Ca class=\"q-doc-anchor\" href=\"#germany-quittiocountry-de\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The German pack implements German VAT law (the VAT Act UStG and its implementing ordinance UStDV), XRechnung and German business letter conventions. Its class is \u003Ccode>Quittio\\Country\\DE\\CountryDE\u003C\u002Fcode> (code \u003Ccode>DE\u003C\u002Fcode>, translation namespace \u003Ccode>quittio-de\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Installation.\u003C\u002Fstrong> Laravel discovers the pack automatically, so there is nothing to register. Without Laravel, pass \u003Ccode>new CountryDE\u003C\u002Fcode> to \u003Ccode>Quittio::create()\u003C\u002Fcode> (see \u003Ca href=\"#registering-packs\">Registering packs\u003C\u002Fa>). The builder macro \u003Ccode>de()\u003C\u002Fcode> leads to the German special cases (\u003Ccode>Quittio\\Country\\DE\\Builder\\GermanInvoice\u003C\u002Fcode>), e.g. \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode>; it is available as soon as Composer loads the package. Each method returns the builder, so the chain continues there. The macros of version 0.2 directly on the builder (\u003Ccode>-&gt;smallAmount()\u003C\u002Fcode>, \u003Ccode>-&gt;selfBilled()\u003C\u002Fcode> …) still work, but are deprecated and report an \u003Ccode>E_USER_DEPRECATED\u003C\u002Fcode>. \u003Ccode>stubs\u002FInvoiceBuilder.stub.php\u003C\u002Fcode> describes \u003Ccode>de()\u003C\u002Fcode> for IDEs and PHPStan.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>When it applies.\u003C\u002Fstrong> The pack leads every invoice whose seller is in Germany (seller country code \u003Ccode>DE\u003C\u002Fcode>). It then checks the German rules, chooses the format and provides the defaults: the German locale (unless the invoice or the configuration sets one), A4 paper and the DIN 5008 form B layout. For an invoice from another country to a business in Germany, only its format rules apply, so that German public buyers receive XRechnung. Details are in \u003Ca href=\"#how-a-pack-is-selected\">How a pack is selected\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Legal references.\u003C\u002Fstrong> This page writes German legal references in English form: &quot;section 14 (4) no. 1 UStG&quot; stands for &quot;§ 14 Abs. 4 Nr. 1 UStG&quot;. Other laws cited are the Civil Code (BGB), the Fiscal Code (AO) and the VAT application decree (UStAE). Values that the pack stores or prints in German keep their German form. German terms such as Gutschrift, Kleinunternehmer or Leitweg-ID are explained on first use and in the \u003Ca href=\"\u002Fdocs\u002Fconcepts#german-terms\">glossary\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Common tasks:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>You want to\u003C\u002Fth>\n\u003Cth>Read\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Set the VAT rate or an exemption on a line\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#tax-presets\">Tax presets\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Invoice as a small business without VAT (Kleinunternehmer)\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#small-businesses\">Small businesses\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Invoice a business in another EU country\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#reverse-charge-intra-community-supplies-and-vat-identifiers\">Reverse charge, intra-community supplies and VAT identifiers\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Know which format Quittio picks (ZUGFeRD, XRechnung, PDF)\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#format-choice\">Format choice\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Invoice a German public authority\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#format-choice\">Format choice\u003C\u002Fa>, \u003Ca href=\"#xrechnung-profiles\">XRechnung profiles\u003C\u002Fa>, \u003Ca href=\"#xrechnung-rules\">XRechnung rules\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Issue an invoice of up to 250 € with fewer details\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#small-amount-invoices\">Small amount invoices\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Deduct advance payments in a final invoice\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#final-invoices-deductadvance\">Final invoices\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Issue a self-billed invoice (Gutschrift)\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#self-billing-gutschrift\">Self-billing\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Cancel or correct an invoice\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#cancellations-and-corrections\">Cancellations and corrections\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Send a reminder with default interest\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#dunning-law\">Dunning law\u003C\u002Fa>, \u003Ca href=\"#default-interest\">Default interest\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Choose the letter layout\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#din-5008-letter-layouts\">DIN 5008 letter layouts\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Look up a validation code such as \u003Ccode>DE-USTG-03\u003C\u002Fcode> or \u003Ccode>BR-DE-15\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Read\">\u003Ca href=\"#ustg-rules\">UStG rules\u003C\u002Fa>, \u003Ca href=\"#xrechnung-rules\">XRechnung rules\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Complete invoices for these cases are on \u003Ca href=\"\u002Fdocs\u002Fexamples#invoices-in-germany\">Examples\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"tax-presets\">Tax presets\u003Ca class=\"q-doc-anchor\" href=\"#tax-presets\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A tax preset is a ready-made VAT treatment for an invoice line. It sets the VAT category (BT-151) and the rate, and for exempt supplies also the exemption reason code (BT-121) and text (BT-120). Use a preset instead of a bare category and rate: the line then carries the wording German law requires, and the German rules recognise the case. Lines without \u003Ccode>vat:\u003C\u002Fcode> take the \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#default-vat\">default VAT\u003C\u002Fa>; in Laravel that is 19 % for a German seller and \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> for a small business.\u003C\u002Fp>\n\u003Cp>The categories are the codes of EN 16931: \u003Ccode>S\u003C\u002Fcode> standard rate, \u003Ccode>Z\u003C\u002Fcode> zero rated, \u003Ccode>E\u003C\u002Fcode> exempt, \u003Ccode>AE\u003C\u002Fcode> reverse charge, \u003Ccode>K\u003C\u002Fcode> intra-community supply, \u003Ccode>G\u003C\u002Fcode> export outside the EU, \u003Ccode>O\u003C\u002Fcode> not subject to VAT (see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#categories\">Categories\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fcode> is a string-backed enum that implements \u003Ccode>TaxPreset\u003C\u002Fcode>. Apply it per line:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Web development'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'95.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">24\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Standard\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F an exemption without its own case: legal reference and VATEX code;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F the invoice prints \"Steuerfrei nach § 4 Nr. 14 UStG\" (exempt under section 4 no. 14 UStG)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Medical treatment'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'90.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Piece\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">exempt\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'§ 4 Nr. 14 UStG'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'VATEX-EU-132-1C'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">));\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Case\u003C\u002Fth>\n\u003Cth>Key\u003C\u002Fth>\n\u003Cth>Category\u003C\u002Fth>\n\u003Cth>Rate\u003C\u002Fth>\n\u003Cth>Code (BT-121)\u003C\u002Fth>\n\u003Cth>Use\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Standard\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.standard\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>S\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">19 (of the supply date)\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Standard rate\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Reduced\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.reduced\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>S\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">7 (of the supply date)\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Reduced rate\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ZeroRatedPv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.zero_rated_pv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>Z\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">0 % rate for photovoltaic systems (section 12 (3) UStG). Category \u003Ccode>Z\u003C\u002Fcode> allows no exemption reason (BR-Z-10), so the preset adds the note &quot;Steuersatz 0 % nach § 12 Abs. 3 UStG.&quot; (BT-22). Quittio does not check the conditions of the zero rate (operator, place of the system).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SmallBusiness\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.small_business\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Small business exemption (Kleinunternehmer, section 19 (1) UStG); see \u003Ca href=\"#small-businesses\">Small businesses\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ReverseChargeDomestic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.reverse_charge_domestic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Domestic reverse charge (section 13b UStG): the buyer in Germany owes the VAT\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ReverseChargeEu\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.reverse_charge_eu\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Service to a business in another member state, which owes the VAT there. Both VAT identifiers are required (\u003Ccode>DE-USTG-11\u003C\u002Fcode>). Issue the invoice by the 15th of the following month (\u003Ccode>DE-USTG-15\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>IntraCommunitySupply\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.intra_community_supply\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>K\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-IC\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">VAT-exempt intra-community supply (section 4 no. 1b with section 6a UStG), also of new vehicles (\u003Ccode>newVehicle()\u003C\u002Fcode>). Not for small businesses, except new vehicles (\u003Ccode>DE-USTG-14\u003C\u002Fcode>). Issue the invoice by the 15th of the following month (\u003Ccode>DE-USTG-15\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TriangularTransaction\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.triangular_transaction\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-AE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Intra-community triangular transaction (section 25b UStG), in which the last customer owes the VAT; wording of section 14a (7) UStG, also as note (BT-22). Both VAT identifiers are required.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Export\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.export\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>G\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-G\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">VAT-exempt export supply (section 4 no. 1a with section 6 UStG)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>NotTaxableInGermany\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.not_taxable\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>O\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">none\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-O\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Supply not taxable in Germany (place of supply abroad). EN 16931 allows no VAT identifiers with category \u003Ccode>O\u003C\u002Fcode> (BR-O-02); the pack leaves them out when the seller's tax number is given (\u003Ca href=\"#vat-identifiers-on-invoices-of-category-o\">Category O\u003C\u002Fa>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BusinessTransfer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.business_transfer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>O\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">none\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-O\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Transfer of a business as a whole (Geschäftsveräußerung im Ganzen, section 1 (1a) UStG), not subject to VAT. VAT identifiers as with \u003Ccode>NotTaxableInGermany\u003C\u002Fcode>. VAT shown on such an invoice would be owed under section 14c (1) UStG; category \u003Ccode>O\u003C\u002Fcode> cannot carry any.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>MarginSecondHand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.margin_second_hand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Margin scheme, second-hand goods; wording of section 14a (6) UStG, also as note (BT-22)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>MarginArt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.margin_art\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-I\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Margin scheme, works of art; also as note (BT-22)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>MarginAntiques\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.margin_antiques\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-J\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Margin scheme, collectors' items and antiques; also as note (BT-22)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TravelAgency\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.travel_agency\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>VATEX-EU-D\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Special scheme for travel agents; also as note (BT-22)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>VatPreset::exempt(string $paragraph, $code = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Key\">\u003Ccode>de.exempt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Category\">\u003Ccode>E\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate\">0\u003C\u002Ftd>\n\u003Ctd data-label=\"Code (BT-121)\">\u003Ccode>$code\u003C\u002Fcode> (enum, raw code or string)\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Any other exemption, e.g. \u003Ccode>§ 4 Nr. 14 UStG\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The codes in column BT-121 are VATEX codes: the standard codes for the reason of an exemption.\u003C\u002Fp>\n\u003Cp>\u003Ccode>Standard\u003C\u002Fcode> and \u003Ccode>Reduced\u003C\u002Fcode> take the rate that applied on the supply date of the line (\u003Ccode>TaxTables::STANDARD_RATE\u003C\u002Fcode>, \u003Ccode>TaxTables::REDUCED_RATE\u003C\u002Fcode>). The supply date is the end of the line period (BT-135), its start, the VAT point date (BT-7), the delivery date (BT-72), the end of the invoicing period (BT-74) or the issue date, in this order (\u003Ccode>Quittio\\Core\\Tax\\SupplyDate\u003C\u002Fcode>). A delivery in August 2020 gets 16 % and 5 %, a correction of it issued in 2021 as well:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">issueDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2021-01-20'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">deliveryDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2020-08-15'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Desk'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'400.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Standard\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 16 %\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>VatPreset::Standard-&gt;rate()\u003C\u002Fcode> returns the rate of today. The plausibility rule \u003Ccode>DE-VAT-RATE\u003C\u002Fcode> warns when a line of category \u003Ccode>S\u003C\u002Fcode> within the German VAT territory has a rate that applied neither as standard nor as reduced rate on its supply date. It cannot tell whether the right one of the two was chosen: 19 % on restaurant meals, which are reduced again since 1 January 2026 (section 12 (2) no. 15 UStG, not for drinks), passes unnoticed. Average rates of agriculture and forestry (section 24 UStG) are a legitimate exception; switch the rule off for them with \u003Ccode>validation.rules.disabled\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fvalidation#switching-rules-off-and-changing-their-severity\">Switching rules off\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>Up to version 0.2 the presets were called \u003Ccode>Standard19\u003C\u002Fcode> (\u003Ccode>de.standard_19\u003C\u002Fcode>) and \u003Ccode>Reduced7\u003C\u002Fcode> (\u003Ccode>de.reduced_7\u003C\u002Fcode>). These cases are deprecated and follow the dates as well; their keys stay readable: \u003Ccode>taxPresets()-&gt;get('de.standard_19')\u003C\u002Fcode> and \u003Ccode>quittio.defaults.vat\u003C\u002Fcode> find \u003Ccode>Standard\u003C\u002Fcode>, and lines of stored invoices keep their key. \u003Ccode>VatPreset::fromKey($key)?-&gt;canonical()\u003C\u002Fcode> turns an old key into the current case.\u003C\u002Fp>\n\u003Cp>\u003Ccode>Standard\u003C\u002Fcode>, \u003Ccode>Reduced\u003C\u002Fcode> and \u003Ccode>ZeroRatedPv\u003C\u002Fcode> carry no text, because EN 16931 forbids an exemption reason for these categories (BR-S-10, BR-Z-10). The other presets print an exemption reason (BT-120) in German or English, from \u003Ccode>resources\u002Flang\u002F{de,en}\u002Ftax.php\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Key\u003C\u002Fth>\n\u003Cth>German\u003C\u002Fth>\n\u003Cth>English\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.small_business\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie Leistung nach § 19 Abs. 1 UStG (Steuerbefreiung für Kleinunternehmer).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt supply under section 19 (1) UStG (small business exemption).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.reverse_charge_domestic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerschuldnerschaft des Leistungsempfängers (§ 13b UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Reverse charge, the recipient is liable for VAT (section 13b UStG)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.reverse_charge_eu\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerschuldnerschaft des Leistungsempfängers\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Reverse charge, the recipient is liable for VAT\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.intra_community_supply\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie innergemeinschaftliche Lieferung (§ 4 Nr. 1b i. V. m. § 6a UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt intra-Community supply (section 4 no. 1b in conjunction with section 6a UStG)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.triangular_transaction\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Innergemeinschaftliches Dreiecksgeschäft nach § 25b UStG; Steuerschuldnerschaft des letzten Abnehmers\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Intra-Community triangular transaction (section 25b UStG); the last customer is liable for the VAT\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.export\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie Ausfuhrlieferung (§ 4 Nr. 1a i. V. m. § 6 UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt export supply (section 4 no. 1a in conjunction with section 6 UStG)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.not_taxable\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Nicht im Inland steuerbare Leistung (Leistungsort im Ausland)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Service not taxable in Germany (place of supply abroad)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.business_transfer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Nicht steuerbare Geschäftsveräußerung im Ganzen (§ 1 Abs. 1a UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Transfer of a business as a whole, not subject to VAT (section 1 (1a) UStG).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.margin_second_hand\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Gebrauchtgegenstände\u002FSonderregelung\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Second-hand goods\u002Fspecial arrangements\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.margin_art\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Kunstgegenstände\u002FSonderregelung\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Works of art\u002Fspecial arrangements\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.margin_antiques\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Sammlungsstücke und Antiquitäten\u002FSonderregelung\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Collectors’ items and antiques\u002Fspecial arrangements\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.travel_agency\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Sonderregelung für Reisebüros\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Special arrangements for travel agents\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>de.exempt\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfrei nach :paragraph\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Exempt from VAT according to :paragraph\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The English texts follow the terms of Directive 2006\u002F112\u002FEC (&quot;exempt&quot;, &quot;intra-Community supply&quot;, &quot;Reverse charge&quot;). The \u003Ca href=\"#legal-texts\">legal texts\u003C\u002Fa> of the same notices use the same wording.\u003C\u002Fp>\n\u003Cp>How presets behave:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Language.\u003C\u002Fstrong> The text is taken in the invoice locale (\u003Ccode>-&gt;locale()\u003C\u002Fcode> on the builder) when the line is built. The enum presets and \u003Ccode>VatPreset::exempt()\u003C\u002Fcode> (a \u003Ccode>Quittio\\Country\\DE\\Tax\\CustomVatPreset\u003C\u002Fcode>) use German when the invoice has no locale. Other locales without a text fall back to English.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Preset key.\u003C\u002Fstrong> The key stays on the line (\u003Ccode>$line-&gt;vat-&gt;presetKey\u003C\u002Fcode>). \u003Ccode>DE-USTG-09\u003C\u002Fcode>, \u003Ccode>DE-USTG-11\u003C\u002Fcode>, \u003Ccode>DE-USTG-14\u003C\u002Fcode>, \u003Ccode>DE-USTG-15\u003C\u002Fcode> and the small business detection rely on it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>VAT breakdown.\u003C\u002Fstrong> Category, rate, code and text flow into the VAT breakdown (BG-23). When lines of one category and rate have different texts, the texts are joined in BT-120. The code (BT-121) is kept only when all codes agree; otherwise Quittio warns with \u003Ccode>QUITTIO-EXEMPTION-CONFLICT\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Invoice notes.\u003C\u002Fstrong> The mapping table of KoSIT and FeRD (recommended by the BMF letter of 15 October 2026) puts the statements of section 14a (6) and (7) UStG into the invoice note (BG-1). The margin scheme, travel agency and triangular presets therefore add their text once as note (BT-22, subject \u003Ccode>REG\u003C\u002Fcode>) as well, and \u003Ccode>ZeroRatedPv\u003C\u002Fcode> its reference to section 12 (3) UStG. A note with the same text is not added twice. Presets of other packs can do the same by implementing \u003Ccode>Quittio\\Core\\Tax\\StatesInvoiceNote\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PDF.\u003C\u002Fstrong> The PDF lists the BT-120 texts of all categories other than the standard rate in its legal notes (\u003Ccode>legalNotes\u003C\u002Fcode>), together with the regulatory notes and without duplicates. Margin scheme and travel agency rows show no VAT amount and their lines no rate (section 14a (6) UStG), recognised by the code of the line.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Margin scheme next to an exemption.\u003C\u002Fstrong> EN 16931 allows one VAT group of category \u003Ccode>E\u003C\u002Fcode> only (BR-E-01). A margin scheme line and a line exempt under section 4 UStG therefore share it in the XML, with both texts in BT-120 and no code in BT-121 (\u003Ccode>QUITTIO-EXEMPTION-CONFLICT\u003C\u002Fcode>). The PDF shows the two parts in rows of their own, &quot;Sonderregelung, kein gesonderter Steuerausweis: 500,00 €&quot; and &quot;Umsatzsteuerfrei (Steuerbefreit) auf 90,00 €&quot;, which add up to the group in the XML. With a document level allowance or charge of category \u003Ccode>E\u003C\u002Fcode> the parts cannot be told apart; then one row reads &quot;Steuerfrei bzw. Sonderregelung, kein gesonderter Steuerausweis: 590,00 €&quot; (label \u003Ccode>vat_row_exempt_special_scheme\u003C\u002Fcode>). Either way no &quot;0 %&quot; appears next to the margin scheme.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Allowances and charges.\u003C\u002Fstrong> Document level allowances and charges take a category and a rate, not a preset: \u003Ccode>-&gt;charge(VatCategory::StandardRate, '19', amount: '10.00', reason: 'Shipping')\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Lookup by key\u003C\u002Fstrong>, e.g. from a database column: \u003Ccode>VatPreset::from('de.standard')\u003C\u002Fcode>, \u003Ccode>(new CountryDE)-&gt;taxPresets()-&gt;get('de.standard')\u003C\u002Fcode> or, across all installed packs, \u003Ccode>$quittio-&gt;countries()-&gt;taxPreset('de.standard')\u003C\u002Fcode>. \u003Ccode>de.exempt\u003C\u002Fcode> is not part of the collection.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"small-businesses\">Small businesses\u003Ca class=\"q-doc-anchor\" href=\"#small-businesses\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A small business (Kleinunternehmer, section 19 UStG) charges no VAT. Its invoices state the exemption instead. Three steps make an invoice a correct small business invoice:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Mark the seller as a small business.\u003C\u002Fstrong> Set \u003Ccode>quittio.seller.small_business = true\u003C\u002Fcode> (applied by \u003Ccode>Quittio::invoice()\u003C\u002Fcode>), the Managed issuer setting \u003Ccode>tax_settings.small_business\u003C\u002Fcode>, or \u003Ccode>-&gt;flag(Meta::FLAG_SMALL_BUSINESS)\u003C\u002Fcode>. \u003Ccode>Flags::SMALL_BUSINESS\u003C\u002Fcode> is the same flag (\u003Ccode>small_business\u003C\u002Fcode>). With the flag, a standard rated line, allowance or charge is an error (\u003Ccode>DE-USTG-09\u003C\u002Fcode>). The flag does not set presets or texts.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Use \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> on every line.\u003C\u002Fstrong> Lines without \u003Ccode>-&gt;vat()\u003C\u002Fcode> get it automatically when the invoice has the small business flag and the default VAT comes from the country pack (\u003Ccode>CountryDefaultVat\u003C\u002Fcode>; in Laravel always, see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#default-vat\">Default VAT\u003C\u002Fa>). The preset's text (BT-120) appears in the PDF.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Give a seller identifier if you have no VAT identifier.\u003C\u002Fstrong> Without a VAT identifier, EN 16931 needs a seller identifier (BT-29) or a legal registration (BT-30) (rule BR-CO-26). In Laravel set \u003Ccode>quittio.seller.identifiers\u003C\u002Fcode> or \u003Ccode>legal_registration\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fconfiguration\">Configuration\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()                      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F quittio.seller.small_business = true\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Consulting'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'80.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F VatPreset::SmallBusiness by default\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>What the pack checks:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>An invoice with the small business flag, or with a line that uses the preset, is a small business invoice under section 34a UStDV. It needs no service date (\u003Ccode>DE-USTG-03\u003C\u002Fcode>), and the PDF is not checked for one. The tax number or VAT identifier is still required (\u003Ccode>DE-USTG-02\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>A small business needs no VAT identifier of its own for reverse charge services in another member state (\u003Ccode>DE-USTG-11\u003C\u002Fcode>; section 19 (1) sentence 2 UStG). The buyer's VAT identifier is still required.\u003C\u002Fli>\n\u003Cli>A small business that takes part in the cross-border small business scheme may state its small business identification number (Kleinunternehmer-Identifikationsnummer, suffix \u003Ccode>EX\u003C\u002Fcode>) instead of the tax number (section 34a sentence 1 no. 2 UStDV). It is no VAT identifier and belongs to the tax number (BT-32): \u003Ccode>-&gt;de()-&gt;smallBusinessId('DE123456789EX')\u003C\u002Fcode> sets it there and sets the small business flag. \u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode> accepts it. In a VAT identifier field (BT-31) it gets the info \u003Ccode>QUITTIO-SME-ID\u003C\u002Fcode> instead of a format warning.\u003C\u002Fli>\n\u003Cli>A small business cannot use the exemption for intra-community supplies (category \u003Ccode>K\u003C\u002Fcode>; \u003Ccode>DE-USTG-14\u003C\u002Fcode>, section 19 (1) sentence 2 UStG). The only exception is the intra-community supply of a new vehicle (\u003Ccode>-&gt;de()-&gt;newVehicle()\u003C\u002Fcode>, section 19 (6) sentence 1 UStG).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A complete invoice is in \u003Ca href=\"\u002Fdocs\u002Fexamples#small-business\">Examples: Small business\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"reverse-charge-intra-community-supplies-and-vat-identifiers\">Reverse charge, intra-community supplies and VAT identifiers\u003Ca class=\"q-doc-anchor\" href=\"#reverse-charge-intra-community-supplies-and-vat-identifiers\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>With reverse charge (German: Steuerschuldnerschaft des Leistungsempfängers), the buyer owes the VAT instead of the seller. The invoice shows no VAT and must say why. An intra-community supply (innergemeinschaftliche Lieferung) is a VAT-exempt delivery of goods to a business in another EU member state. Use the presets \u003Ccode>ReverseChargeDomestic\u003C\u002Fcode>, \u003Ccode>ReverseChargeEu\u003C\u002Fcode>, \u003Ccode>TriangularTransaction\u003C\u002Fcode> and \u003Ccode>IntraCommunitySupply\u003C\u002Fcode> for these cases (\u003Ca href=\"#tax-presets\">Tax presets\u003C\u002Fa>). The pack then checks:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Wording.\u003C\u002Fstrong> Reverse charge rows (category \u003Ccode>AE\u003C\u002Fcode>) must name &quot;Steuerschuldnerschaft des Leistungsempfängers&quot; (\u003Ccode>DE-USTG-06\u003C\u002Fcode>, error; the buyer owes the VAT all the same). The texts of the reverse charge presets are accepted in every locale the pack ships, so English invoices with the presets pass as well. Your own texts must contain &quot;Steuerschuldnerschaft&quot;.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>VAT identifiers.\u003C\u002Fstrong> Reverse charge in another member state and triangular transactions need the VAT identifiers of seller and buyer (\u003Ccode>DE-USTG-11\u003C\u002Fcode>). The rule does not apply to \u003Ccode>ReverseChargeDomestic\u003C\u002Fcode> (section 13b UStG), and a small business needs none of its own (section 19 (1) sentence 2 UStG).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Deadline.\u003C\u002Fstrong> Invoices for intra-community supplies and for services in another member state (\u003Ccode>ReverseChargeEu\u003C\u002Fcode>) must be issued by the 15th of the month following the supply (\u003Ccode>DE-USTG-15\u003C\u002Fcode>, warning; section 14a (1) sentence 2 and (3) sentence 1 UStG). This includes final invoices: advance payments trigger no VAT on intra-community supplies, so the invoice for the supply is the one with the deadline.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>PDF.\u003C\u002Fstrong> The PDF must show the reverse charge or exemption note and the VAT identifiers (see \u003Ca href=\"#mandatory-pdf-output\">Mandatory PDF output\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Tax representative.\u003C\u002Fstrong> A tax representative of the seller (BG-11, \u003Ccode>-&gt;taxRepresentative($name, $vatId, $address)\u003C\u002Fcode>) satisfies \u003Ccode>DE-USTG-02\u003C\u002Fcode> and \u003Ccode>BR-DE-16\u003C\u002Fcode>. Its VAT identifier satisfies \u003Ccode>DE-USTG-11\u003C\u002Fcode> and the mandatory output.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Number formats.\u003C\u002Fstrong> The tax number (Steuernummer, BT-32) of a seller in Germany is checked for format and check digit (\u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode>, see \u003Ca href=\"#tax-number\">Tax number\u003C\u002Fa>). VAT identifiers are checked by the core plausibility rules: \u003Ccode>QUITTIO-VATID-FORMAT\u003C\u002Fcode> (for \u003Ccode>DE\u003C\u002Fcode> nine digits) and optionally \u003Ccode>QUITTIO-VIES\u003C\u002Fcode>, an online check against the EU's VIES service. The same rules warn about category \u003Ccode>K\u003C\u002Fcode> with a domestic or non-EU destination, and about \u003Ccode>G\u003C\u002Fcode> within the EU (see \u003Ca href=\"\u002Fdocs\u002Fvalidation#plausibility-l7\">Validation\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Complete invoices are in \u003Ca href=\"\u002Fdocs\u002Fexamples#eu-business-services\">Examples: EU business: services\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fexamples#eu-business-goods\">EU business: goods\u003C\u002Fa> and \u003Ca href=\"\u002Fdocs\u002Fexamples#export\">Export\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"format-choice\">Format choice\u003Ca class=\"q-doc-anchor\" href=\"#format-choice\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Without \u003Ccode>-&gt;format()\u003C\u002Fcode>, Quittio chooses the format for each invoice (\u003Ca href=\"\u002Fdocs\u002Fformats#automatic-choice\">Automatic choice\u003C\u002Fa>). The German pack adds only the cases in which German law prescribes a format. \u003Ccode>Quittio\\Country\\DE\\Formats\\GermanFormatRule\u003C\u002Fcode> returns a choice for these cases and null (no opinion) otherwise:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Condition\u003C\u002Fth>\n\u003Cth>Format\u003C\u002Fth>\n\u003Cth>Profile\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>The buyer reference (BT-10) is a Leitweg-ID with valid check digits, or the buyer's electronic address (BT-49) uses scheme \u003Ccode>0204\u003C\u002Fcode> (\u003Ccode>GermanFormatRule::LEITWEG_SCHEME\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Format\">\u003Ccode>xrechnung-cii\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Profile\">\u003Ccode>xrechnung\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>A small amount invoice whose simplifications apply (\u003Ccode>UstgRules::isSmallAmountInvoice()\u003C\u002Fcode>), with seller and buyer in the German Inland (domestic territory under section 1 (2) UStG, i.e. without Büsingen and Heligoland; an address without country code counts as domestic)\u003C\u002Ftd>\n\u003Ctd data-label=\"Format\">\u003Ccode>pdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Profile\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>otherwise\u003C\u002Ftd>\n\u003Ctd data-label=\"Format\">– (null)\u003C\u002Ftd>\n\u003Ctd data-label=\"Profile\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>A Leitweg-ID is the routing ID of a German public buyer, such as an authority or a municipality. The buyer names it in the order, and it goes into the buyer reference (BT-10). Its last two digits are check digits.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\Party\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">buyerReference\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'04011000-12345-03'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F a Leitweg-ID: XRechnung\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">buyer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Party\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Stadt Beispielstadt'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">electronicAddress\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'04011000-12345-03'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'0204'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">));  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F or the same ID as electronic address (scheme 0204)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>Order numbers shaped like a Leitweg-ID (e.g. \u003Ccode>4711-01\u003C\u002Fcode>) do not switch to XRechnung. A Leitweg-ID with a typo does not either; validation reports it as \u003Ccode>DE-LEITWEG-ID-SUSPECT\u003C\u002Fcode> (info, see \u003Ca href=\"#leitweg-id\">Leitweg-ID\u003C\u002Fa>). Correct it, set the \u003Ccode>0204\u003C\u002Fcode> endpoint as well, or choose the format explicitly (\u003Ccode>-&gt;format('xrechnung-ubl')\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>An explicit \u003Ccode>-&gt;format()\u003C\u002Fcode> or a configured \u003Ccode>quittio.defaults.format\u003C\u002Fcode> always wins.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Everything else follows the \u003Ca href=\"\u002Fdocs\u002Fformats#automatic-choice\">general order of the resolver\u003C\u002Fa>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Domestic business invoices:\u003C\u002Fstrong> the Peppol lookup of the resolver, if one is configured, then \u003Ccode>zugferd\u003C\u002Fcode> with the configured profile (\u003Ccode>en16931\u003C\u002Fcode> by default; EXTENDED when EXTENDED features are used).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Consumers:\u003C\u002Fstrong> \u003Ccode>pdf\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Cross-border invoices:\u003C\u002Fstrong> the e-invoicing obligation of section 14 (2) UStG covers only supplies between businesses established in Germany. Sellers outside the EU invoicing a German business get \u003Ccode>pdf\u003C\u002Fcode> from the resolver, sellers in other member states \u003Ccode>zugferd\u003C\u002Fcode>. Buyers in Büsingen or Heligoland are outside the EU VAT territory and get \u003Ccode>pdf\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>German public buyers\u003C\u002Fstrong> receive XRechnung whatever the seller's country: for cross-border invoices to a buyer in Germany, the rule runs as the rule of the buyer's pack.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A complete invoice to a public buyer is in \u003Ca href=\"\u002Fdocs\u002Fexamples#public-sector\">Examples: Public sector\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4 id=\"e-invoice-obligation\">E-invoice obligation\u003Ca class=\"q-doc-anchor\" href=\"#e-invoice-obligation\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>When an explicit format or profile produces no e-invoice, the German rules check whether one was required (section 14 (1) and (2), section 27 (38) UStG). A run produces an e-invoice when one of its formats writes XML of an EN 16931 profile; MINIMUM, BASIC WL and a plain \u003Ccode>pdf\u003C\u002Fcode> do not. \u003Ccode>xrechnung-cii\u003C\u002Fcode> with \u003Ccode>pdf\u003C\u002Fcode> in one run is an e-invoice with a readable copy. Drafts and previews (watermark) are not checked.\u003C\u002Fp>\n\u003Cp>The obligation applies when seller and buyer are in the German Inland and the buyer is a business. It does not apply to:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>consumers (\u003Ccode>-&gt;consumer()\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>supplies exempt only under section 4 no. 8 to 29 UStG, told by the legal reference (&quot;§ 4 Nr. 14 UStG&quot;) or a VATEX code of Article 132 or 135;\u003C\u002Fli>\n\u003Cli>small amount invoices up to 250 EUR gross (section 33 sentence 4 UStDV), with or without \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>small businesses (section 34a sentence 4 UStDV);\u003C\u002Fli>\n\u003Cli>tickets (section 34 UStDV, \u003Ccode>-&gt;de()-&gt;ticket()\u003C\u002Fcode>, flag \u003Ccode>de.ticket\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>cancellations and corrections of earlier invoices (section 14.11 (1) sentence 9 UStAE).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The supply date decides (\u003Ccode>UstgRules::supplyDate()\u003C\u002Fcode>, otherwise the issue date); for a prepayment invoice the issue date (BMF letter of 15 October 2026, marginal no. 2):\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Supply\u003C\u002Fth>\n\u003Cth>Other invoice (PDF, MINIMUM, BASIC WL)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>before 2025\u003C\u002Ftd>\n\u003Ctd data-label=\"Other invoice (PDF, MINIMUM, BASIC WL)\">no finding\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2025 and 2026\u003C\u002Ftd>\n\u003Ctd data-label=\"Other invoice (PDF, MINIMUM, BASIC WL)\">allowed if issued by 31 December 2026: warning \u003Ccode>DE-EINVOICE-02\u003C\u002Fcode> (a PDF needs the buyer's consent); issued later: error \u003Ccode>DE-EINVOICE-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2027\u003C\u002Ftd>\n\u003Ctd data-label=\"Other invoice (PDF, MINIMUM, BASIC WL)\">prior-year turnover above 800,000 EUR: error \u003Ccode>DE-EINVOICE-01\u003C\u002Fcode>. Otherwise allowed if issued by 31 December 2027: warning \u003Ccode>DE-EINVOICE-02\u003C\u002Fcode>; later: error\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>from 2028\u003C\u002Ftd>\n\u003Ctd data-label=\"Other invoice (PDF, MINIMUM, BASIC WL)\">error \u003Ccode>DE-EINVOICE-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Set the turnover with \u003Ccode>quittio.countries.de.prior_year_turnover_above_800k\u003C\u002Fcode> (core: \u003Ccode>Quittio::create(['countries' =&gt; ['de' =&gt; ['prior_year_turnover_above_800k' =&gt; true]]], …)\u003C\u002Fcode>); the default is \u003Ccode>false\u003C\u002Fcode>. Both findings belong to the BMF error class &quot;Formatfehler&quot; (format error, marginal no. 6a). An other invoice instead of a required e-invoice is no administrative offence (marginal no. 28), but it is no proper invoice, and the buyer may lose the input tax deduction.\u003C\u002Fp>\n\u003Ch4 id=\"mapping-table-of-kosit-and-ferd\">Mapping table of KoSIT and FeRD\u003Ca class=\"q-doc-anchor\" href=\"#mapping-table-of-kosit-and-ferd\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>Which mandatory detail of the UStG goes into which field of an e-invoice is set out in the mapping table of KoSIT and FeRD (Empfehlungen zu Pflichtangaben in einer E-Rechnung, as of 25 July 2025), which the BMF letter of 15 October 2026 recommends (marginal no. 8 f.). The pack follows it: exemption and reverse charge texts in BT-120 with the code in BT-121, the statements of section 14a (6) and (7) UStG also as note, the retention notice and &quot;Gutschrift&quot; as note, vehicle details as item attributes (BG-32), the date of receipt of an advance payment in BT-7, a service month as invoicing period (BG-14). Details such as time sheets may go into an embedded attachment, the type, quantity and kind of the service must be in the structured part (marginal no. 10 to 12).\u003C\u002Fp>\n\u003Ch3 id=\"xrechnung-profiles\">XRechnung profiles\u003Ca class=\"q-doc-anchor\" href=\"#xrechnung-profiles\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>XRechnung is the German e-invoice standard for public buyers: EN 16931 with additional German rules, as an XML file in the CII or UBL syntax (see \u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa>). The pack registers three profiles for it. XRechnung 3.0 is the one you normally use. The extension allows data that XRechnung 3.0 does not, such as sub lines. XRechnung CVD is XRechnung 3.0 for the procurement of road vehicles under the Clean Vehicles Directive (CVD, Directive (EU) 2019\u002F1161). How Quittio writes XRechnung files is described in \u003Ca href=\"\u002Fdocs\u002Fformats#xrechnung\">Formats: XRechnung\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>\u003Ccode>XRechnung30\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>\u003Ccode>XRechnung30Extension\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>\u003Ccode>XRechnung30Cvd\u003C\u002Fcode>\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Key, name\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">\u003Ccode>xrechnung\u003C\u002Fcode>, XRechnung 3.0\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">\u003Ccode>xrechnung-extension\u003C\u002Fcode>, XRechnung 3.0 Extension\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">\u003Ccode>xrechnung-cvd\u003C\u002Fcode>, XRechnung 3.0 CVD\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Specification identifier (BT-24), which names the profile in the XML\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0#conformant#urn:xeinkauf.de:kosit:extension:xrechnung_3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0#compliant#urn:xeinkauf.de:kosit:xrechnung:cvd_0.9\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Level, syntaxes\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">EN 16931; CII and UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">as XRechnung 3.0; sub lines only in UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">as XRechnung 3.0\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Default business process (BT-23)\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">\u003Ccode>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">same\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">same\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Additionally required\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">buyer reference (BT-10), seller electronic address (BT-34), buyer electronic address (BT-49), seller contact (BG-6), payment instructions (BG-16)\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">same\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">as XRechnung 3.0, plus contract reference (BT-12), tender or lot reference (BT-17) and at least one vehicle line (\u003Ccode>BR-DE-CVD-…\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Embedded in a PDF\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">\u003Ccode>xrechnung.xml\u003C\u002Fcode>, XMP conformance level \u003Ccode>XRECHNUNG\u003C\u002Fcode>, \u003Ccode>fx:Version\u003C\u002Fcode> \u003Ccode>3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">same\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">same\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Extras\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30\">VAT rate written in every breakdown, 0 for category \u003Ccode>O\u003C\u002Fcode> (BR-DE-14); cash discounts as \u003Ccode>#SKONTO#\u003C\u002Fcode> lines in the payment terms (BT-20); the \u003Ca href=\"#xrechnung-rules\">XRechnung rules\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Extension\">sub lines, third party payments (BG-DEX-09, UBL invoices only), identifier schemes \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode> in the ICD and EAS code lists\u003C\u002Ftd>\n\u003Ctd data-label=\"XRechnung30Cvd\">the item classification scheme \u003Ccode>CVD\u003C\u002Fcode> (BT-158-1) in the UNTDID 7143 code list; the \u003Ca href=\"#xrechnung-cvd\">CVD rules\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The profiles exist only when the pack is registered. Without it, the formats \u003Ccode>xrechnung-cii\u003C\u002Fcode> and \u003Ccode>xrechnung-ubl\u003C\u002Fcode> cannot be rendered, and incoming XRechnung files are reported as an unknown profile (\u003Ccode>QUITTIO-READER-UNKNOWN-PROFILE\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-ubl'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                                   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F XRechnung 3.0, UBL\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-ubl'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-extension'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F extension\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-cii'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-cvd'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();         \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F Clean Vehicles Directive\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'zugferd'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F PDF\u002FA-3 with xrechnung.xml\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The automatic choice always uses \u003Ccode>xrechnung\u003C\u002Fcode>, also when the invoice carries extension data: the specification identifier never switches by itself. Choose \u003Ccode>xrechnung-extension\u003C\u002Fcode> explicitly for extension data. With \u003Ccode>xrechnung\u003C\u002Fcode>, third party payments fail with \u003Ccode>QUITTIO-PROFILE-XRECHNUNG-EXTENSION-ONLY\u003C\u002Fcode>. The same holds for \u003Ccode>xrechnung-cvd\u003C\u002Fcode>: request it when the buyer asks for an XRechnung CVD.\u003C\u002Fp>\n\u003Ch4 id=\"xrechnung-cvd\">XRechnung CVD\u003Ca class=\"q-doc-anchor\" href=\"#xrechnung-cvd\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A public buyer that procures road vehicles reports them under the Clean Vehicles Directive. The invoice then names the contract and the tender or lot, and every vehicle line carries the vehicle category as item classification with the scheme \u003Ccode>CVD\u003C\u002Fcode> (BT-158, \u003Ccode>M1\u003C\u002Fcode>, \u003Ccode>M2\u003C\u002Fcode>, \u003Ccode>M3\u003C\u002Fcode>, \u003Ccode>N1\u003C\u002Fcode>, \u003Ccode>N2\u003C\u002Fcode> or \u003Ccode>N3\u003C\u002Fcode>) and the vehicle type as item attribute \u003Ccode>cva\u003C\u002Fcode> (BT-160, BT-161: \u003Ccode>clean\u003C\u002Fcode>, \u003Ccode>zero-emission\u003C\u002Fcode> or \u003Ccode>other\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$invoice \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">buyerReference\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'04011000-12345-03'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">contractReference\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'V-2026-0017'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                       \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F BT-12\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">tenderReference\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'LOS-3'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                               \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F BT-17\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($line) => $line\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">name\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Elektro-Kleinbus'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'68000.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Standard\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">classification\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'M2'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'CVD'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F vehicle category (BT-158)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">attribute\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'cva'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'zero-emission'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))                 \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F vehicle type (BT-160, BT-161)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($line) => $line\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">name\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Einweisung'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">2\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'95.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Standard\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F … seller, buyer, payment as for every XRechnung\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-cii'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-cvd'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The constants of \u003Ccode>XRechnung30Cvd\u003C\u002Fcode> hold the values (\u003Ccode>CLASSIFICATION_SCHEME\u003C\u002Fcode>, \u003Ccode>VEHICLE_CATEGORIES\u003C\u002Fcode>, \u003Ccode>ATTRIBUTE\u003C\u002Fcode>, \u003Ccode>ATTRIBUTE_VALUES\u003C\u002Fcode>). Lines without a vehicle, such as services, need neither. Credit notes are possible in both syntaxes.\u003C\u002Fp>\n\u003Ch3 id=\"xrechnung-rules\">XRechnung rules\u003Ca class=\"q-doc-anchor\" href=\"#xrechnung-rules\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Rules\\XRechnungRules\u003C\u002Fcode> (level L3) are the business rules of the XRechnung profiles, with codes \u003Ccode>BR-DE-…\u003C\u002Fcode>. They apply whenever the profile is \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode> or \u003Ccode>xrechnung-cvd\u003C\u002Fcode>, whatever the seller's country; the rules \u003Ccode>BR-DE-CVD-…\u003C\u002Fcode> only with the specification identifier of XRechnung CVD.\u003C\u002Fp>\n\u003Cp>The severity follows the flags of the official Schematron, the rule file of the official validator. Rules flagged \u003Ccode>fatal\u003C\u002Fcode> (&quot;muss&quot;, must) are errors, rules flagged \u003Ccode>warning\u003C\u002Fcode> (&quot;soll&quot;, should) are warnings, and \u003Ccode>BR-DE-TMP-32\u003C\u002Fcode> (flagged \u003Ccode>information\u003C\u002Fcode>) is an info. The KoSIT validator (the official XRechnung validator) remains authoritative (see \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rule\u003C\u002Fth>\n\u003Cth>Severity\u003C\u002Fth>\n\u003Cth>Reported when\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">no payment instructions (BG-16)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-2\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">no seller contact (BG-6)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-3\u003C\u002Fcode>, \u003Ccode>BR-DE-4\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">seller city (BT-37) or postcode (BT-38) missing\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-5\u003C\u002Fcode>, \u003Ccode>BR-DE-6\u003C\u002Fcode>, \u003Ccode>BR-DE-7\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">seller contact without name (BT-41), phone (BT-42) or e-mail (BT-43)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-8\u003C\u002Fcode>, \u003Ccode>BR-DE-9\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">buyer city (BT-52) or postcode (BT-53) missing\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-10\u003C\u002Fcode>, \u003Ccode>BR-DE-11\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">a deliver-to address (BG-15) without city (BT-77) or postcode (BT-78)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-15\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">no buyer reference (BT-10); for public buyers this is the Leitweg-ID\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-16\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">a category other than \u003Ccode>O\u003C\u002Fcode> is used and the seller has no VAT identifier (BT-31), tax number (BT-32) or tax representative (BG-11)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-17\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">type code (BT-3) not one of 326, 380, 384, 389, 381, 875, 876, 877\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-18\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">a line of the payment terms text (BT-20) starts with \u003Ccode>#\u003C\u002Fcode> but does not match \u003Ccode>#SKONTO#TAGE=n#PROZENT=n.nn#\u003C\u002Fcode> (optionally \u003Ccode>BASISBETRAG=n.nn#\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-19\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">SEPA credit transfer (58) with an invalid IBAN (BT-84)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-20\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">SEPA direct debit (59) with an invalid debited IBAN (BT-91)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-22\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">attachment file names (BT-125-2) not unique\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-23-a\u003C\u002Fcode>, \u003Ccode>BR-DE-23-b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">credit transfer (30, 58) without credit transfer data (BG-17), or with card (BG-18) or direct debit (BG-19) data\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-24-a\u003C\u002Fcode>, \u003Ccode>BR-DE-24-b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">card payment (48, 54, 55) without card data (BG-18), or with BG-17 or BG-19 data\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-25-a\u003C\u002Fcode>, \u003Ccode>BR-DE-25-b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">direct debit (59) without direct debit data (BG-19), or with BG-17 or BG-18 data\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-26\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">corrected invoice (384) without preceding invoice reference (BG-3)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-27\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">seller phone (BT-42) with fewer than three digits\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-28\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">seller e-mail (BT-43) without exactly one \u003Ccode>@\u003C\u002Fcode> surrounded by at least two characters\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-30\u003C\u002Fcode>, \u003Ccode>BR-DE-31\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">direct debit (BG-19) without creditor identifier (BT-90) or debited account (BT-91)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-TMP-32\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">info (flag \u003Ccode>information\u003C\u002Fcode> in the Schematron)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">no delivery date (BT-72), invoicing period (BG-14) or period on every line (BG-26)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">not checked\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">guaranteed by \u003Ccode>MimeType\u003C\u002Fcode>: its codes are exactly those the extension allows; \u003Ccode>BR-CL-24\u003C\u002Fcode> accepts \u003Ccode>MimeType::Xml\u003C\u002Fcode> (application\u002Fxml) only in the extension\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: the net amount of a line (BT-131) with sub lines is not the sum of the net amounts of its direct sub lines; replaces \u003Ccode>QUITTIO-SUBLINES\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-03\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">not checked\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">guaranteed by the data model: every sub line has exactly one \u003Ccode>LineVat\u003C\u002Fcode>, which the UBL writer writes as one VAT information (BG-DEX-06)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-04\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension: scheme of a seller (BT-29-1), buyer (BT-46-1) or payee (BT-60-1) identifier neither in ISO\u002FIEC 6523 nor \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>; \u003Ccode>SEPA\u003C\u002Fcode> is accepted for seller and payee, except in CII; replaces \u003Ccode>BR-CL-10\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-05\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension: scheme of a legal registration identifier (BT-30-1, BT-47-1, BT-61-1) neither in ISO\u002FIEC 6523 nor \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>; replaces \u003Ccode>BR-CL-11\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-06\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension: scheme of an item standard identifier (BT-157-1) neither in ISO\u002FIEC 6523 nor \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>; replaces \u003Ccode>BR-CL-21\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-07\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension: scheme of an electronic address (BT-34-1, BT-49-1) neither in the EAS code list nor \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>; replaces \u003Ccode>BR-CL-25\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-08\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension: scheme of the delivery location identifier (BT-71-1) neither in ISO\u002FIEC 6523 nor \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>; replaces \u003Ccode>BR-CL-26\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-09\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: amount due (BT-115) is not BT-112 − BT-113 + BT-114 + the third party payment amounts (BT-DEX-002); replaces \u003Ccode>BR-CO-16\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-10\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: a third party payment (BG-DEX-09) without type (BT-DEX-001)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-11\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">not checked\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">guaranteed by the data model: \u003Ccode>ThirdPartyPayment\u003C\u002Fcode> requires an amount (BT-DEX-002), and the reader skips payments without one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-12\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: a third party payment (BG-DEX-09) without description (BT-DEX-003)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-13\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: a third party payment amount (BT-DEX-002) with more than two decimals; amounts created with \u003Ccode>Amount::of()\u003C\u002Fcode> always have two, and a \u003Ccode>Money\u003C\u002Fcode> with more cannot be written\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-14\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">extension, UBL: a third party payment amount (BT-DEX-002) in another currency than the invoice currency (BT-5)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DEX-15\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">sub lines in XRechnung CII (sub lines need the extension in UBL)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-XRECHNUNG-EXT-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">a credit note in profile \u003Ccode>xrechnung-extension\u003C\u002Fcode> with syntax UBL; the official validator configuration has no scenario for it. Cancel with the strategy \u003Ccode>negative_invoice\u003C\u002Fcode> (type code 380, negative amounts).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-CVD-01\u003C\u002Fcode>, \u003Ccode>BR-DE-CVD-02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">XRechnung CVD without contract reference (BT-12) or tender or lot reference (BT-17)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-CVD-03\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">XRechnung CVD without a line that has an item classification (BT-158) with scheme \u003Ccode>CVD\u003C\u002Fcode> and an item attribute \u003Ccode>cva\u003C\u002Fcode> (BT-160)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-CVD-04\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">an item classification with scheme \u003Ccode>CVD\u003C\u002Fcode> that is not \u003Ccode>M1\u003C\u002Fcode>, \u003Ccode>M2\u003C\u002Fcode>, \u003Ccode>M3\u003C\u002Fcode>, \u003Ccode>N1\u003C\u002Fcode>, \u003Ccode>N2\u003C\u002Fcode> or \u003Ccode>N3\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-CVD-05\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">an item attribute \u003Ccode>cva\u003C\u002Fcode> whose value (BT-161) is not \u003Ccode>clean\u003C\u002Fcode>, \u003Ccode>zero-emission\u003C\u002Fcode> or \u003Ccode>other\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BR-DE-CVD-06-a\u003C\u002Fcode>, \u003Ccode>BR-DE-CVD-06-b\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">error\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">a line with a \u003Ccode>CVD\u003C\u002Fcode> classification that has not exactly one \u003Ccode>cva\u003C\u002Fcode> attribute, or a line with a \u003Ccode>cva\u003C\u002Fcode> attribute that has not exactly one \u003Ccode>CVD\u003C\u002Fcode> classification\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The \u003Ccode>BR-DEX-…\u003C\u002Fcode> rules apply only to the profile \u003Ccode>xrechnung-extension\u003C\u002Fcode>; those marked UBL are skipped when the XML is written in CII, where the official Schematron does not have them. As in the official validator configuration, where the replaced rules are only an information, the extension replaces \u003Ccode>BR-CL-10\u003C\u002Fcode>, \u003Ccode>-11\u003C\u002Fcode>, \u003Ccode>-21\u003C\u002Fcode>, \u003Ccode>-25\u003C\u002Fcode> and \u003Ccode>-26\u003C\u002Fcode> with \u003Ccode>BR-DEX-04\u003C\u002Fcode> to \u003Ccode>BR-DEX-08\u003C\u002Fcode> and, in UBL, \u003Ccode>BR-CO-16\u003C\u002Fcode> with \u003Ccode>BR-DEX-09\u003C\u002Fcode> and \u003Ccode>QUITTIO-SUBLINES\u003C\u002Fcode> with \u003Ccode>BR-DEX-02\u003C\u002Fcode> (\u003Ccode>XRechnung30Extension::replacedRules()\u003C\u002Fcode>), so a violation is reported once, with the official code.\u003C\u002Fp>\n\u003Cp>\u003Ccode>#SKONTO#\u003C\u002Fcode> lines state a cash discount (Skonto) in a form software can read: \u003Ccode>TAGE\u003C\u002Fcode> is the number of days, \u003Ccode>PROZENT\u003C\u002Fcode> the percentage and \u003Ccode>BASISBETRAG\u003C\u002Fcode> the base amount. Quittio writes structured cash discounts itself (\u003Ccode>#SKONTO#TAGE=7#PROZENT=2.00#\u003C\u002Fcode>), so \u003Ccode>BR-DE-18\u003C\u002Fcode> only concerns lines you put into the payment terms text yourself.\u003C\u002Fp>\n\u003Ch3 id=\"small-amount-invoices\">Small amount invoices\u003Ca class=\"q-doc-anchor\" href=\"#small-amount-invoices\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>German law allows a simplified invoice for small amounts (section 33 UStDV). \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode> marks an invoice of at most 250.00 EUR gross as such a small amount invoice. The gross total counts, including exempt or non-taxable parts (section 14.6 (4) UStAE). The limit of the supply date applies (\u003Ccode>TaxTables::SMALL_AMOUNT_LIMIT\u003C\u002Fcode>: 150.00 EUR from 2007, 250.00 EUR from 2017; the raise applies to supplies from 1 January 2017), or of the issue date if the invoice states no supply date. As long as no reverse charge (\u003Ccode>AE\u003C\u002Fcode>) or intra-community supply (\u003Ccode>K\u003C\u002Fcode>) is involved, it relaxes:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>DE-USTG-01\u003C\u002Fcode>: the buyer's address is not required (the seller's still is);\u003C\u002Fli>\n\u003Cli>\u003Ccode>DE-USTG-02\u003C\u002Fcode>: no tax number or VAT identifier is required;\u003C\u002Fli>\n\u003Cli>\u003Ccode>DE-USTG-03\u003C\u002Fcode>: no service date is required;\u003C\u002Fli>\n\u003Cli>the mandatory PDF output for the tax number and the service date;\u003C\u002Fli>\n\u003Cli>the format: \u003Ccode>pdf\u003C\u002Fcode> instead of \u003Ccode>zugferd\u003C\u002Fcode> when seller and buyer are in the German Inland. A Leitweg-ID still leads to XRechnung (see \u003Ca href=\"#format-choice\">Format choice\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ccode>DE-USTG-08\u003C\u002Fcode> enforces the limit. \u003Ccode>DE-USTG-12\u003C\u002Fcode> excludes reverse charge and intra-community supplies (section 33 sentence 3 UStDV): such invoices need all mandatory information and are not rendered as plain PDF. Possible distance sales (goods sent to a consumer in another member state, section 3c UStG) keep the simplifications, with a warning.\u003C\u002Fp>\n\u003Ch3 id=\"builder-macros\">Builder macros\u003Ca class=\"q-doc-anchor\" href=\"#builder-macros\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Builder\\GermanInvoiceMacros\u003C\u002Fcode> adds methods for German special cases to \u003Ccode>InvoiceBuilder\u003C\u002Fcode>, and so to \u003Ccode>Quittio::invoice()\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Macro\u003C\u002Fth>\n\u003Cth>Use it for\u003C\u002Fth>\n\u003Cth>Writes into the invoice\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>smallAmount()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">an invoice of up to 250 € gross (\u003Ca href=\"#small-amount-invoices\">Small amount invoices\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">flag \u003Ccode>de.small_amount\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>propertyRelatedService(string $locale = 'de')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a service in connection with a property for a non-business buyer, who must keep the invoice for two years\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">flag \u003Ccode>de.property_related_service\u003C\u002Fcode> and the note \u003Ccode>LegalTexts::PROPERTY_RETENTION\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>newVehicle(string $locale = 'de')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">the intra-community supply of a new vehicle\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">flag \u003Ccode>de.new_vehicle\u003C\u002Fcode> and the note \u003Ccode>LegalTexts::NEW_VEHICLE\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>). The vehicle details are your line attributes (\u003Ccode>DE-USTG-07\u003C\u002Fcode>). The vehicle lines use \u003Ccode>VatPreset::IntraCommunitySupply\u003C\u002Fcode> (\u003Ccode>DE-USTG-13\u003C\u002Fcode>), also for small businesses (\u003Ccode>DE-USTG-14\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>selfBilled(string $locale = 'de')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a self-billed invoice (\u003Ca href=\"#self-billing-gutschrift\">Self-billing\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">type code 389 and the note \u003Ccode>LegalTexts::SELF_BILLING\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>deductAdvance(InvoiceData $advance, string $locale = 'de', $received = null, string $style = 'prepaid')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a final invoice that deducts an advance invoice (\u003Ca href=\"#final-invoices-deductadvance\">Final invoices\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">preceding invoice (BG-3), prepaid amount (BT-113) and the note \u003Ccode>LegalTexts::ADVANCE_DEDUCTION\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>); with \u003Ccode>style: 'remainder'\u003C\u002Fcode> negative lines and \u003Ccode>LegalTexts::ADVANCE_DEDUCTION_REMAINDER\u003C\u002Fcode> instead of BT-113\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>advance($expectedService, $receivedOn = null, string $locale = 'de')\u003C\u002Fcode> (only as \u003Ccode>-&gt;de()-&gt;advance()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a prepayment invoice (\u003Ca href=\"#prepayment-invoices\">Prepayment invoices\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">type code 386, the note \u003Ccode>LegalTexts::PREPAYMENT\u003C\u002Fcode> or \u003Ccode>PREPAYMENT_MONTH\u003C\u002Fcode> (or \u003Ccode>SERVICE_DATE_OPEN\u003C\u002Fcode> without a date), with \u003Ccode>$receivedOn\u003C\u002Fcode> the VAT point date BT-7 and the note \u003Ccode>PREPAYMENT_RECEIVED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>consumerDefaultNotice(string $locale = 'de')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">the notice that a consumer is in default 30 days after the due date (section 286 (3) BGB)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">the note \u003Ccode>LegalTexts::CONSUMER_DEFAULT\u003C\u002Fcode> (subject \u003Ccode>PMT\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>discountAgreement(string $agreement, string $locale = 'de')\u003C\u002Fcode> (only as \u003Ccode>-&gt;de()-&gt;discountAgreement()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">an agreed bonus, rebate or other reduction whose amount is not known yet (section 14 (4) no. 7 UStG); naming the agreement is enough (section 14.5 (19) UStAE)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">the note \u003Ccode>LegalTexts::DISCOUNT_AGREEMENT\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>smallBusinessId(string $id)\u003C\u002Fcode> (only as \u003Ccode>-&gt;de()-&gt;smallBusinessId()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a small business that states its small business identification number (suffix \u003Ccode>EX\u003C\u002Fcode>) instead of the tax number (\u003Ca href=\"#small-businesses\">Small businesses\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">the number as the seller's tax number (BT-32) and the flag \u003Ccode>small_business\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>serviceDateOpen(string $locale = 'de')\u003C\u002Fcode> (only as \u003Ccode>-&gt;de()-&gt;serviceDateOpen()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Use it for\">a prepayment invoice (386) whose date of the service is not agreed yet (section 14.8 (4) sentence 5 UStAE)\u003C\u002Ftd>\n\u003Ctd data-label=\"Writes into the invoice\">flag \u003Ccode>de.service_date_open\u003C\u002Fcode> and the note \u003Ccode>LegalTexts::SERVICE_DATE_OPEN\u003C\u002Fcode> (subject \u003Ccode>REG\u003C\u002Fcode>); no \u003Ccode>DE-USTG-03\u003C\u002Fcode> warning\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The notes and their texts are listed in \u003Ca href=\"#legal-texts\">Legal texts\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Macros are invisible to IDEs and static analysis. The pack ships a stub with their signatures, \u003Ccode>stubs\u002FInvoiceBuilder.stub.php\u003C\u002Fcode>; it is never loaded at runtime. Add it to PHPStan (\u003Ccode>vendor\u002Fquittio\u002Fquittio\u002Fpackages\u002Fcountry-de\u002Fstubs\u002F…\u003C\u002Fcode> with the complete package):\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>yaml\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#7EE787\">parameters\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#7EE787\">    stubFiles\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        - \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">vendor\u002Fquittio\u002Fcountry-de\u002Fstubs\u002FInvoiceBuilder.stub.php\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>The \u003Ccode>$locale\u003C\u002Fcode> parameter selects the language of the note. It is independent of the invoice locale.\u003C\u002Fli>\n\u003Cli>A locale with a region uses the text of its language (\u003Ccode>en_GB\u003C\u002Fcode> → English). Locales without a text of the pack get the German text (\u003Ccode>LegalTexts::text()\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>Notes with subject \u003Ccode>REG\u003C\u002Fcode> (regulatory information) are listed in the PDF's legal notes (\u003Ccode>legalNotes\u003C\u002Fcode>). Notes with subject \u003Ccode>PMT\u003C\u002Fcode> (payment information) appear with the other notes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"prepayment-invoices\">Prepayment invoices\u003Ca class=\"q-doc-anchor\" href=\"#prepayment-invoices\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A prepayment invoice (Anzahlungsrechnung, type code 386) must show that it invoices an advance payment, e.g. by the expected date or month of the service (section 14.8 (1) and (4) UStAE). \u003Ccode>-&gt;de()-&gt;advance()\u003C\u002Fcode> sets the type code and the note:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$advance \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">de\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">advance\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2027-03'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                     \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F \"Anzahlungsrechnung. Die Leistung wird voraussichtlich im März 2027 erbracht.\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Website relaunch, advance payment'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1000.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">LumpSum\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$paid \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">de\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">advance\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2027-03-15'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">receivedOn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-10-01'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F \"… am 15.03.2027 erbracht. Die Anzahlung wurde am 01.10.2026 vereinnahmt.\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Website relaunch, advance payment'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1000.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">LumpSum\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">prepaid\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1190.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Ccode>$expectedService\u003C\u002Fcode> is a date or a month (\u003Ccode>&quot;2027-03&quot;\u003C\u002Fcode>). \u003Ccode>null\u003C\u002Fcode> states that the date is not agreed yet (\u003Ccode>serviceDateOpen()\u003C\u002Fcode>, section 14.8 (4) sentence 5 UStAE). Either way \u003Ccode>DE-USTG-03\u003C\u002Fcode> does not warn.\u003C\u002Fli>\n\u003Cli>\u003Ccode>$receivedOn\u003C\u002Fcode> is the date a payment was already received. It is stated as VAT point date (BT-7), to which the mapping table of KoSIT and FeRD assigns the date of receipt, and in a note (section 14 (4) sentence 1 no. 6 UStG). A prepayment invoice with a prepaid amount but no BT-7 gets \u003Ccode>DE-USTG-17\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>XRechnung warns about type code 386 (\u003Ccode>BR-DE-17\u003C\u002Fcode>): its list names 326 and 380 but not 386. The mapping table of KoSIT and FeRD prescribes 386 for prepayment invoices all the same, so the warning is to be accepted.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"final-invoices-deductadvance\">Final invoices (\u003Ccode>deductAdvance\u003C\u002Fcode>)\u003Ca class=\"q-doc-anchor\" href=\"#final-invoices-deductadvance\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>A final invoice (Schlussrechnung, section 14 (5) sentence 2 UStG) states the full service with its full VAT and deducts the advance payments received. \u003Ccode>-&gt;de()-&gt;deductAdvance(InvoiceData $advance, string $locale = 'de', $received = null, string $style = GermanInvoice::PREPAID)\u003C\u002Fcode> does this for one advance invoice:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Builder\\GermanInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$advance \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $advanceResult\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">data\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                 \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F the rendered advance invoice, already calculated\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$final \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F number, dates, buyer, payment …\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Website'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'3000.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Piece\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">vat\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Standard\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">de\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">deductAdvance\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($advance, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">received\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">GermanInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">RECEIVED_IN_FULL\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The advance invoice must be calculated. The data of a rendered invoice (\u003Ccode>$result-&gt;data()\u003C\u002Fcode>) already is; calculate data you built yourself with \u003Ccode>(new En16931Calculator)-&gt;calculate($advanceInvoice)\u003C\u002Fcode> (\u003Ccode>Quittio\\Core\\Calculation\\En16931Calculator\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>With an advance invoice RE-2026-0040 of 1,000.00 EUR net plus 19 % VAT, the final invoice shows a gross total of 3,570.00 EUR, VAT 570.00 EUR, prepaid 1,190.00 EUR and an amount due of 2,380.00 EUR, with the note:\u003C\u002Fp>\n\u003Cblockquote class=\"q-doc-note\">\n\u003Cp>Abzüglich Anzahlung gemäß Rechnung RE-2026-0040 vom 01.09.2026: Entgelt 1.000,00 € zzgl. 19 % Umsatzsteuer 190,00 € (§ 14 Abs. 5 Satz 2 UStG).\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>With \u003Ccode>-&gt;de()-&gt;deductAdvance($advance, 'en')\u003C\u002Fcode> the note is in English: &quot;Less advance payment according to invoice RE-2026-0040 of 01\u002F09\u002F2026: net 1,000.00 € plus 19% VAT 190.00 € (section 14 (5) sentence 2 UStG).&quot;\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Checks.\u003C\u002Fstrong> The advance invoice must be calculated (\u003Ccode>totals\u003C\u002Fcode> set), have a positive gross total and be in the currency of the final invoice. Otherwise an \u003Ccode>InvalidArgumentException\u003C\u002Fcode> is thrown. Set \u003Ccode>-&gt;currency()\u003C\u002Fcode> before calling the macro.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Accepted documents.\u003C\u002Fstrong> Only documents that can be advance invoices are accepted (\u003Ccode>GermanInvoiceMacros::ADVANCE_TYPES\u003C\u002Fcode>): type codes 380 (commercial invoice), 386 (prepayment invoice), 326 (partial invoice), 875 (partial construction invoice) and 389 (self-billed invoice). Credit notes, debit notes, corrected invoices (384), final invoices (876, 877) and cancellations by negative invoice are rejected.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Amount received.\u003C\u002Fstrong> Only advance payments actually received are deducted (section 14 (5) sentence 2 UStG). Pass what you received as \u003Ccode>received:\u003C\u002Fcode>: \u003Ccode>GermanInvoice::RECEIVED_IN_FULL\u003C\u002Fcode> (or the full amount) deducts the advance invoice's gross total plus its cash rounding (BT-114). A smaller amount, e.g. \u003Ccode>received: '595.00'\u003C\u002Fcode> for half of the example, deducts that amount: it is distributed over the VAT rows of the advance invoice in proportion to their gross amounts, and the VAT is taken out of each part at its rate (section 14.8 (5) UStAE). The note then names these amounts. Zero or more than the advance invoice throws an \u003Ccode>InvalidArgumentException\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Unconfirmed amount.\u003C\u002Fstrong> Without \u003Ccode>received:\u003C\u002Fcode> the advance invoice is deducted in full as before, but the flag \u003Ccode>de.advance_receipt_unconfirmed\u003C\u002Fcode> is set and \u003Ccode>DE-USTG-20\u003C\u002Fcode> warns. Deducting an advance that was not paid states too little VAT; not deducting one that was paid makes you owe its VAT twice (section 14.8 (10) UStAE).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Unpaid advance invoices.\u003C\u002Fstrong> Do not deduct them. The advance invoice need not be cancelled (section 14.8 (2) UStAE); you may cancel it for clarity in your accounts.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Remainder invoice.\u003C\u002Fstrong> \u003Ccode>style: GermanInvoice::REMAINDER\u003C\u002Fcode> adds instead a line &quot;Abzüglich Anzahlung gemäß Rechnung … vom …&quot; per VAT row with quantity −1 and the net amount received, and the note \u003Ccode>LegalTexts::ADVANCE_DEDUCTION_REMAINDER\u003C\u002Fcode> (&quot;Restrechnung: Abgezogen ist die vereinnahmte Anzahlung gemäß Rechnung …&quot;). The invoice then shows only the VAT of the remainder (section 14.8 (11) UStAE), which the buyer's system cannot deduct twice. The default \u003Ccode>PREPAID\u003C\u002Fcode> (BT-113 with the itemisation in BT-22) is the variant the BMF letter of 15 October 2026 (marginal no. 3) explicitly accepts until 30 June 2030.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Itemisation.\u003C\u002Fstrong> Every VAT row of the advance invoice is itemised. Standard rated rows read &quot;Entgelt … zzgl. … Umsatzsteuer …&quot; (&quot;net … plus … VAT …&quot;, \u003Ccode>LegalTexts::ADVANCE_DEDUCTION_TAXED\u003C\u002Fcode>), other rows &quot;Entgelt … ohne Umsatzsteuer&quot; (&quot;net … without VAT&quot;, \u003Ccode>LegalTexts::ADVANCE_DEDUCTION_UNTAXED\u003C\u002Fcode>). Rows are separated by semicolons.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Language.\u003C\u002Fstrong> The whole note is in one language: the language of \u003Ccode>$locale\u003C\u002Fcode> if the pack has it (\u003Ccode>de\u003C\u002Fcode>, \u003Ccode>en\u003C\u002Fcode>), otherwise German. Amounts and dates are formatted in \u003Ccode>$locale\u003C\u002Fcode> when the note is in its language (e.g. \u003Ccode>de_AT\u003C\u002Fcode>). Otherwise they are formatted in the language of the note: \u003Ccode>fr\u003C\u002Fcode> gives the German note with German formatting.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Several advance invoices.\u003C\u002Fstrong> Call the macro once per advance invoice; the prepaid amounts add up.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Self-billed advances.\u003C\u002Fstrong> An advance settled by self-billing (389) must be deducted as well. If the final invoice is no self-billed invoice, \u003Ccode>DE-USTG-19\u003C\u002Fcode> notes the change of the way of invoicing.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Review in 2030.\u003C\u002Fstrong> The acceptance of BT-113 with the itemisation in BT-22 ends on 30 June 2030 (BMF letter of 15 October 2026, marginal no. 3); the default will be reviewed then.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A complete example with the advance invoice is in \u003Ca href=\"\u002Fdocs\u002Fexamples#advance-payment-and-final-invoice\">Examples: Advance payment and final invoice\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"self-billing-gutschrift\">Self-billing (Gutschrift)\u003Ca class=\"q-doc-anchor\" href=\"#self-billing-gutschrift\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>In self-billing, the buyer issues the invoice for the seller's supply. German law requires the word &quot;Gutschrift&quot; on such an invoice (section 14 (4) no. 10 UStG). Quittio uses &quot;Gutschrift&quot; only for self-billing; commercial credit notes and cancellations carry other titles.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>-&gt;de()-&gt;selfBilled()\u003C\u002Fcode> sets type code 389 and adds the note &quot;Gutschrift&quot; (English variant: &quot;Gutschrift (self-billed invoice)&quot;).\u003C\u002Fli>\n\u003Cli>The PDF is titled &quot;Gutschrift&quot; in German and &quot;Self-billed invoice (Gutschrift)&quot; in English, and shows the buyer as issuer.\u003C\u002Fli>\n\u003Cli>\u003Ccode>DE-USTG-04\u003C\u002Fcode> requires the label on every self-billed type code (389, 261, 527); in an e-invoice the type code is label enough, so there it is a warning.\u003C\u002Fli>\n\u003Cli>The mandatory output requires the title and the &quot;Gutschrift&quot; note in the PDF.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>What Quittio cannot check, and you must make sure of:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Prior agreement.\u003C\u002Fstrong> Self-billing must be agreed before the first self-billed invoice (section 14 (2) sentence 2 UStG), best in writing, e.g. in the framework contract with the supplier. Without the agreement the document is no invoice, and the issuer loses the input tax deduction. The agreement is not stated on the document, so Quittio does not ask for it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Objection.\u003C\u002Fstrong> The supplier may object to a self-billed invoice (section 14 (2) sentence 6 UStG). It then loses its effect as invoice, for the future only (BFH XI R 41\u002F20), and the supplier issues an invoice of its own. An objection is no cancellation; do not issue a cancellation for it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Corrections and cancellations\u003C\u002Fstrong> of a self-billed invoice come from its issuer, the buyer (section 14.11 (2) sentence 2 UStAE). \u003Ccode>Quittio::cancellation()\u003C\u002Fcode> keeps the document self-billed (261, or 389 negative for XRechnung).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A complete example is in \u003Ca href=\"\u002Fdocs\u002Fexamples#self-billing\">Examples: Self-billing\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"cancellations-and-corrections\">Cancellations and corrections\u003Ca class=\"q-doc-anchor\" href=\"#cancellations-and-corrections\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>CountryDE::correctionPolicy()\u003C\u002Fcode> sets how invoices of a German seller are cancelled and corrected (see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#cancellations-and-corrections\">Building invoices: cancellations and corrections\u003C\u002Fa>):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Cancellation strategy \u003Ccode>credit_note\u003C\u002Fcode>:\u003C\u002Fstrong> a cancellation is a credit note (type code 381) with positive amounts.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Correction strategy \u003Ccode>cancel_and_reissue\u003C\u002Fcode>:\u003C\u002Fstrong> the Managed layer corrects an invoice by cancelling it and issuing a new one.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Both cancellation strategies are permitted in Germany. Change them with \u003Ccode>quittio.corrections.cancellation_strategy\u003C\u002Fcode> and \u003Ccode>quittio-managed.correction.strategy\u003C\u002Fcode>. For the XRechnung extension in UBL use \u003Ccode>negative_invoice\u003C\u002Fcode> (\u003Ccode>DE-XRECHNUNG-EXT-01\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>A self-billed invoice (389) with a Leitweg-ID (BT-10), i.e. sent as XRechnung, is cancelled by a negative self-billed invoice (389) instead of a self-billed credit note (261): XRechnung lists 261 not among its type codes and warns (\u003Ccode>BR-DE-17\u003C\u002Fcode>). Receiving portals of public buyers may treat that warning strictly. An explicit \u003Ccode>$strategy\u003C\u002Fcode> or \u003Ccode>corrections.cancellation_strategy\u003C\u002Fcode> still wins. ZUGFeRD keeps 261.\u003C\u002Fp>\n\u003Cp>A corrected invoice (384) should state that it corrects and replaces the original (\u003Ccode>DE-USTG-18\u003C\u002Fcode>); \u003Ccode>Quittio::correction()\u003C\u002Fcode> adds the note. A price reduction (\u003Ccode>Quittio::priceReduction()\u003C\u002Fcode>) is titled &quot;Entgeltminderung&quot;.\u003C\u002Fp>\n\u003Cp>What a correction does for the parties (for your users' information, not checked by Quittio):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Seller.\u003C\u002Fstrong> VAT shown too high (section 14c (1) UStG) is corrected in the period of the correction (section 17 (1) sentence 7 UStG), whichever way you correct.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Buyer.\u003C\u002Fstrong> A correction, also by cancellation and new invoice, takes effect back to the original invoice if it had the minimum details of seller, buyer, supply, consideration and VAT and the correction refers to it specifically (BFH V R 26\u002F15, XI R 10\u002F17; BMF letter of 18 September 2020). Quittio refers by number and date (BG-3) and the note.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Procedure.\u003C\u002Fstrong> A correction is no retroactive event under section 175 (1) sentence 1 no. 2 and section 233a (2a) AO (section 14 (4) sentence 4 UStG).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Double invoices.\u003C\u002Fstrong> If an invoice was issued twice, cancel the second one: its VAT is owed under section 14c (1) UStG until it is corrected.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The policy also sets the document titles:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Kind\u003C\u002Fth>\n\u003Cth>German\u003C\u002Fth>\n\u003Cth>English\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cancellation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Stornorechnung\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Cancellation invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cancellation_self_billed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Storno-Gutschrift\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Cancellation of the self-billed invoice (Storno-Gutschrift)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>correction\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Rechnungskorrektur\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Corrected invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>price_reduction\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Entgeltminderung\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Price reduction\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>self_billed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Gutschrift\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Self-billed invoice (Gutschrift)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Ccode>cancellation\u003C\u002Fcode> and \u003Ccode>cancellation_self_billed\u003C\u002Fcode> title the documents of \u003Ccode>Quittio::cancellation()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>correction\u003C\u002Fcode> titles a corrected invoice (384) of \u003Ccode>Quittio::correction()\u003C\u002Fcode> and of the Managed layer.\u003C\u002Fli>\n\u003Cli>\u003Ccode>price_reduction\u003C\u002Fcode> titles the documents of \u003Ccode>Quittio::priceReduction()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>self_billed\u003C\u002Fcode> titles self-billed invoices (389, 261, 527) unless the presentation sets a title. Locales without a title of their own fall back to English (&quot;Self-billed invoice (Gutschrift)&quot;), which keeps the word &quot;Gutschrift&quot; required by section 14 (4) no. 10 UStG.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"dunning-law\">Dunning law\u003Ca class=\"q-doc-anchor\" href=\"#dunning-law\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>When a customer pays late, German law (section 288 BGB) gives the seller default interest (Verzugszinsen) and, from business debtors, a flat rate of 40 EUR. The pack provides these values and a calculator for the interest. Quittio's documents do not apply them by themselves: calculate the interest with \u003Ca href=\"#default-interest\">\u003Ccode>DefaultInterest\u003C\u002Fcode>\u003C\u002Fa> and pass the results to a payment reminder (see \u003Ca href=\"\u002Fdocs\u002Fdocuments#payment-reminders\">Documents: payment reminders\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>CountryDE::dunningLaw()\u003C\u002Fcode> returns these values:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Value\u003C\u002Fth>\n\u003Cth>Germany\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Interest for business debtors\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">base rate plus 9 percentage points\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Interest for consumers\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">base rate plus 5 percentage points\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Flat rate for business debtors\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">40.00 EUR\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Day count\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">actual\u002Factual (\u003Ccode>null\u003C\u002Fcode>): 365 days, 366 in a leap year\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Consumer default\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">30 days after due date and receipt of the invoice, if the invoice points this out (added to invoices for consumers automatically, see below)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Reference rate\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">&quot;Basiszinssatz (§ 247 BGB)&quot;, the base rate of section 247 BGB\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch4 id=\"default-interest\">Default interest\u003Ca class=\"q-doc-anchor\" href=\"#default-interest\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Dunning\\DefaultInterest\u003C\u002Fcode> calculates the default interest on an open amount:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>__construct(?BaseRateTable $rates = null, ?DunningLaw $law = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">Without a table, \u003Ccode>BaseRates::table()\u003C\u002Fcode> is used (shipped and registered rates). Without a law, \u003Ccode>CountryDE::dunningLaw()\u003C\u002Fcode> (points, flat rate and day count).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>calculate(Money $amount, Date $from, Date $until, bool $consumer = false, string $locale = 'de'): list&lt;InterestCharge&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">One charge per base rate period, from \u003Ccode>$from\u003C\u002Fcode> (first day with interest) to \u003Ccode>$until\u003C\u002Fcode> (exclusive). Rate = base rate + 9 points, or + 5 points with \u003Ccode>$consumer\u003C\u002Fcode>. Empty for a non-positive amount or when \u003Ccode>$until\u003C\u002Fcode> is not after \u003Ccode>$from\u003C\u002Fcode>. \u003Ccode>InvalidArgumentException\u003C\u002Fcode> for days the \u003Ca href=\"#base-rate-table\">base rate table\u003C\u002Fa> does not cover.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>flatRate(string $currency = 'EUR'): ?Money\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">The flat rate of 40.00 for business debtors (section 288 (5) BGB), once per claim\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Brick\\Money\\Money\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Support\\Amount\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Support\\Date\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Dunning\\DefaultInterest\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$interest \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> DefaultInterest\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$reminder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">paymentReminder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">1\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                          \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F first reminder (\"1. Mahnung\"); seller and bank account from the config\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">number\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'M-2026-0003'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">buyer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($buyer)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">openItem\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'RE-2026-0042'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-06-01'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1190.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">dueDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-06-15'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F first day with interest: the day after the due date; 2026-10-04 is the first day without interest\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">foreach\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($interest\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">calculate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Money\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">of\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1190.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'EUR'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">), \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Date\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">parse\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-06-16'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">), \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Date\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">parse\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-10-04'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)) \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">as\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $charge) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    $reminder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">interest\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Amount\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">base), $charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">ratePercent, $charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">from, $charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">until, $charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">description, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">dayCount\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: $charge\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">dayCount);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$reminder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">flatRate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'RE-2026-0042'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 40.00 EUR for this claim, \"Pauschale für Beitreibungskosten (§ 288 Abs. 5 BGB), Forderung RE-2026-0042\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>\u003Cstrong>Descriptions.\u003C\u002Fstrong> They name the rate, the base rate, the points and the last day with interest. With the locale \u003Ccode>de\u003C\u002Fcode> (the default) a description reads &quot;Verzugszinsen 10,27 % p. a. (Basiszinssatz 1,27 % + 9,00 Prozentpunkte) vom 16.06.2026 bis 30.06.2026&quot;. Any other locale gives &quot;Default interest 10.27 % p.a. (base rate 1.27 % + 9.00 points) from 2026-06-16 to 2026-06-30&quot;.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Day count.\u003C\u002Fstrong> The charges use the day count of the dunning law (\u003Ccode>InterestCharge::$dayCount\u003C\u002Fcode>). \u003Ccode>CountryDE::dunningLaw()\u003C\u002Fcode> counts actual\u002Factual: the days of each calendar year are divided by its length, 366 in a leap year, as the statutory day count conventions do (annex to section 16 PAngV). No federal court has decided the question for section 288 BGB; the fixed basis of 365 days would overstate the interest of a leap year slightly. Pass the day count to \u003Ccode>interest()\u003C\u002Fcode> as above (\u003Ccode>dayCount: $charge-&gt;dayCount\u003C\u002Fcode>), or use \u003Ccode>interestCharge()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Periods.\u003C\u002Fstrong> A charge covers a whole period with the same base rate. Interest from 1 December 2025 to 28 February 2026 is one charge, although the table has an entry for 1 January 2026.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Flat rate.\u003C\u002Fstrong> \u003Ccode>DocumentBuilder::flatRate($claim)\u003C\u002Fcode> adds it as a fee of kind \u003Ccode>DunningFeeKind::FlatRate\u003C\u002Fcode> for one claim (invoice or instalment). It is due for every late payment, also of instalments and of recurring payments under one contract (section 288 (5) sentence 2 BGB; CJEU C-370\u002F21), only from businesses, and counts towards the costs of legal pursuit (sentence 3): reminder fees of your own are recovery costs and may be claimed beside it only in so far as they exceed 40 EUR (CJEU C-287\u002F17, C-131\u002F18). The builder rejects a second flat rate for the same claim in one reminder and a flat rate for a consumer; a flat rate together with reminder fees gets the notice \u003Ccode>QUITTIO-DUNNING-FLAT-RATE-FEES\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fdocuments#payment-reminders\">Documents: payment reminders\u003C\u002Fa>). Which claims already carried it in earlier reminders is up to your application or the Managed layer. A creditor who brings about the conditions of the flat rate abusively loses it (CJEU C-209\u002F25).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Reminder fees.\u003C\u002Fstrong> The reminder that puts the debtor in default is part of the creditor's own receivables management; its costs are not damages (BGH VIII ZR 138\u002F23, marginal no. 77). Quittio has no default fee. Fee clauses towards consumers are subject to section 309 no. 5 BGB.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>No VAT.\u003C\u002Fstrong> Default interest, reminder costs and the flat rate are damages, not consideration (section 1.3 (6) UStAE). Interest agreed for a deferral of payment (e.g. in an instalment agreement) is consideration for a service of its own, possibly exempt under section 4 no. 8 (a) UStG; Quittio does not cover it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Consumers.\u003C\u002Fstrong> Without an agreed date, a debtor is in default only after a reminder, or 30 days after due date and receipt of the invoice; a consumer only if the invoice points this out (section 286 (3) BGB). A due date the seller sets on the invoice alone does not put the buyer in default (BGH VIII ZR 215\u002F15). The pack therefore adds the notice to every invoice for a consumer (\u003Ccode>CountryDE::complete()\u003C\u002Fcode>, see below); \u003Ccode>-&gt;de()-&gt;consumerDefaultNotice()\u003C\u002Fcode> adds it explicitly.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A complete reminder is in \u003Ca href=\"\u002Fdocs\u002Fexamples#payment-reminder\">Examples: Payment reminder\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch4 id=\"vat-identifiers-on-invoices-of-category-o\">VAT identifiers on invoices of category O\u003Ca class=\"q-doc-anchor\" href=\"#vat-identifiers-on-invoices-of-category-o\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>EN 16931 allows no VAT identifiers of seller (BT-31), buyer (BT-48) or tax representative (BT-63) on an invoice of supplies not subject to VAT (category \u003Ccode>O\u003C\u002Fcode>, rule BR-O-02), and such an invoice has no other VAT category (BR-O-11). In Laravel the seller's VAT identifier comes from the configuration, so every such invoice would fail. \u003Ccode>CountryDE::complete()\u003C\u002Fcode> therefore leaves out the VAT identifiers of seller and buyer when:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>every line is of category \u003Ccode>O\u003C\u002Fcode> (\u003Ccode>VatPreset::NotTaxableInGermany\u003C\u002Fcode>, \u003Ccode>BusinessTransfer\u003C\u002Fcode> or your own),\u003C\u002Fli>\n\u003Cli>the seller has a tax number (BT-32), which satisfies section 14 (4) sentence 1 no. 2 UStG instead,\u003C\u002Fli>\n\u003Cli>and there is no tax representative: EN 16931 requires its VAT identifier (BR-56) and forbids it here, so such an invoice cannot be issued at all.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The invoice gets the flag \u003Ccode>de.vat_ids_omitted\u003C\u002Fcode> and the info \u003Ccode>DE-CATEGORY-O-01\u003C\u002Fcode>. The rendered data (\u003Ccode>$result-&gt;data()\u003C\u002Fcode>), XML and PDF are without the VAT identifiers; the builder keeps them. Without a tax number or with a tax representative nothing changes: \u003Ccode>BR-O-02\u003C\u002Fcode> stays an error, and the info \u003Ccode>DE-CATEGORY-O-02\u003C\u002Fcode> names what is missing. Switch the completion off with \u003Ccode>quittio.countries.de.omit_vat_ids_for_category_o = false\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch4 id=\"default-notice-for-consumers\">Default notice for consumers\u003Ca class=\"q-doc-anchor\" href=\"#default-notice-for-consumers\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>\u003Ccode>CountryDE\u003C\u002Fcode> completes invoices before they are calculated and rendered (\u003Ccode>Quittio\\Core\\Countries\\Capabilities\\CompletesInvoices\u003C\u002Fcode>): an invoice for a consumer (\u003Ccode>-&gt;consumer()\u003C\u002Fcode> on the buyer) gets the note \u003Ccode>LegalTexts::CONSUMER_DEFAULT\u003C\u002Fcode> with subject \u003Ccode>PMT\u003C\u002Fcode>, &quot;Sie kommen spätestens in Verzug, wenn Sie nicht innerhalb von 30 Tagen nach Fälligkeit und Zugang dieser Rechnung zahlen (§ 286 Abs. 3 BGB).&quot; in the language of the invoice. Credit notes and invoices that already have such a note (a note containing &quot;286&quot;) are left alone. The note is part of the rendered data (\u003Ccode>$result-&gt;data()\u003C\u002Fcode>), not of the builder.\u003C\u002Fp>\n\u003Cp>Switch it off with the setting \u003Ccode>consumer_default_notice\u003C\u002Fcode> of the pack: \u003Ccode>quittio.countries.de.consumer_default_notice = false\u003C\u002Fcode> in Laravel, \u003Ccode>Quittio::create(['countries' =&gt; ['de' =&gt; ['consumer_default_notice' =&gt; false]]], …)\u003C\u002Fcode> in the core.\u003C\u002Fp>\n\u003Ch4 id=\"base-rate-table\">Base rate table\u003Ca class=\"q-doc-anchor\" href=\"#base-rate-table\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>The base rate (Basiszinssatz, section 247 BGB) changes on 1 January and 1 July. \u003Ccode>Quittio\\Country\\DE\\Dunning\\BaseRateTable\u003C\u002Fcode> holds the rates. Quittio ships these (\u003Ccode>BaseRateTable::PUBLISHED\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Valid from\u003C\u002Fth>\n\u003Cth>Rate in %\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>2023-01-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">1.62\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2023-07-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">3.12\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2024-01-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">3.62\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2024-07-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">3.37\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2025-01-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">2.27\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2025-07-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">1.27\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2026-01-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">1.27\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>2026-07-01\u003C\u002Ftd>\n\u003Ctd data-label=\"Rate in %\">1.52\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Rates after the last entry are unknown until they are published. Interest for days from 1 January 2027 is therefore rejected instead of silently using the old rate. There are three ways to add new rates without a new Quittio release:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Laravel configuration.\u003C\u002Fstrong> Add the rate to \u003Ccode>quittio.countries.de.base_rates\u003C\u002Fcode> in \u003Ccode>config\u002Fquittio\u002Fcountries\u002Fde.php\u003C\u002Fcode> (publish it with \u003Ccode>php artisan vendor:publish --tag=quittio-de-config\u003C\u002Fcode>; see \u003Ca href=\"\u002Fdocs\u002Fconfiguration#country-pack-germany-quittiocountriesde\">Configuration\u003C\u002Fa>). Up to 0.3 this was \u003Ccode>config\u002Fquittio-de.php\u003C\u002Fcode>, which is still read until 1.0.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#A5D6FF\">'base_rates'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2027-01-01'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '1.77'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Automatic update from the Deutsche Bundesbank (Laravel).\u003C\u002Fstrong> \u003Ccode>php artisan quittio:base-rate:update\u003C\u002Fcode> fetches the series \u003Ccode>BBIN1.M.DE.BBK.BBKBAS2.EUR.ME\u003C\u002Fcode> (&quot;Basiszinssatz gemäß BGB&quot;, the base rate under the BGB) from the Bundesbank's statistics API (\u003Ca href=\"\u002Fdocs\u002Fcommands#quittiobase-rateupdate\">command\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It stores the rates the shipped table does not contain in \u003Ccode>quittio.countries.de.base_rate_file\u003C\u002Fcode> (default \u003Ccode>storage\u002Fapp\u002Fquittio\u002Fbase-rates.json\u003C\u002Fcode>), also those before 2023 for older claims.\u003C\u002Fli>\n\u003Cli>It writes the file only when something changed; \u003Ccode>--dry-run\u003C\u002Fcode> shows the rates without writing.\u003C\u002Fli>\n\u003Cli>A value that differs from the shipped table is reported, and the Bundesbank value is used.\u003C\u002Fli>\n\u003Cli>Without a file (\u003Ccode>base_rate_file\u003C\u002Fcode> set to null) the command fails, except with \u003Ccode>--dry-run\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Schedule it, e.g. weekly, so that the rate of 1 January and 1 July is there as soon as the Bundesbank has published it:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F routes\u002Fconsole.php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Schedule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">command\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio:base-rate:update'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">weekly\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Without Laravel.\u003C\u002Fstrong> Call \u003Ccode>BaseRates::register(['2027-01-01' =&gt; '1.77'])\u003C\u002Fcode> once at start-up, fetch the rates yourself with \u003Ccode>(new BundesbankBaseRates)-&gt;fetch()\u003C\u002Fcode>, or use a table for one calculation:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$rates \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> BaseRateTable\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">withRate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2027-01-01'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'1.77'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$interest \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> DefaultInterest\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($rates);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>\u003Ccode>DefaultInterest\u003C\u002Fcode> without a table uses \u003Ccode>BaseRates::table()\u003C\u002Fcode>: the shipped table, then the rates of the file, then those of \u003Ccode>quittio.countries.de.base_rates\u003C\u002Fcode>. The configuration wins for the same date. The service provider \u003Ccode>Quittio\\Country\\DE\\Laravel\\GermanyServiceProvider\u003C\u002Fcode> registers file and configuration at boot; Laravel discovers it automatically.\u003C\u002Fp>\n\u003Cp>\u003Ccode>BaseRateTable\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>__construct(array $rates = self::PUBLISHED)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">ISO date =&gt; rate in percent, sorted by date\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>withRate(Date|string $from, string $rate): self\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">new table with an additional or replaced rate\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>rateOn(Date $date): BigDecimal\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">rate on a day; \u003Ccode>InvalidArgumentException\u003C\u002Fcode> before the first entry and from \u003Ccode>validUntil()\u003C\u002Fcode> on\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>periods(Date $from, Date $until): list&lt;array{from: Date, until: Date, rate: BigDecimal}&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">periods with a constant rate (start inclusive, end exclusive), split where the rate changes. A table entry that keeps the rate (e.g. 2026-01-01) starts no new period. \u003Ccode>InvalidArgumentException\u003C\u002Fcode> if \u003Ccode>$until\u003C\u002Fcode> is after \u003Ccode>validUntil()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>lastChange(): Date\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">date of the last entry, e.g. to warn when the table is outdated\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validUntil(): Date\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">first day without a known rate: the next 1 January or 1 July after the last entry (with the published table: 2027-01-01)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Dunning\\BaseRates\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>register(array $rates): void\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">adds or replaces rates (ISO date =&gt; percent). Only 1 January and 1 July, and values such as \u003Ccode>'1.77'\u003C\u002Fcode> or \u003Ccode>'-0.88'\u003C\u002Fcode>; otherwise \u003Ccode>InvalidArgumentException\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>table(): BaseRateTable\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the shipped table with the registered rates\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>registered(): array\u003C\u002Fcode> \u002F \u003Ccode>reset(): void\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the registered rates; removes them (tests)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Dunning\\BundesbankBaseRates\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>__construct(?Closure $http = null, int $timeout = 15)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">\u003Ccode>$http\u003C\u002Fcode> receives URL and timeout and returns the response body (for tests or your own HTTP client); default \u003Ccode>file_get_contents()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>fetch(string $since = '2002-01'): array\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the January and July values from the given month on, ISO date =&gt; percent; \u003Ccode>RuntimeException\u003C\u002Fcode> when the API cannot be reached or returns no rates\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>parse(string $csv): array\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">reads the CSV download (\u003Ccode>2026-07;1,52;…\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"din-5008-letter-layouts\">DIN 5008 letter layouts\u003Ca class=\"q-doc-anchor\" href=\"#din-5008-letter-layouts\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>DIN 5008 is the German standard for business letters. It fixes where the address field sits, so that the address shows in the window of a window envelope, and where the fold and punch marks are. \u003Ccode>Quittio\\Country\\DE\\Layouts\\Din5008\u003C\u002Fcode> provides two forms: form A (\u003Ccode>din5008a\u003C\u002Fcode>) with a low letterhead and form B (\u003Ccode>din5008b\u003C\u002Fcode>) with a higher one. Form B is the German default.\u003C\u002Fp>\n\u003Cp>\u003Ccode>Din5008\u003C\u002Fcode> has the methods \u003Ccode>formA()\u003C\u002Fcode>, \u003Ccode>formB()\u003C\u002Fcode> and \u003Ccode>all()\u003C\u002Fcode> (form A, form B and \u003Ccode>free\u003C\u002Fcode>). Values are in millimetres, as in DIN 5008:2020. They are unchanged since the 2011 edition, which enlarged the address field of both forms from 40 to 45 mm and moved the return address line (Rücksendeangabe) into the zone for additional information and notes (Zusatz- und Vermerkzone).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>\u003Ccode>din5008a\u003C\u002Fcode> (\u003Ccode>Din5008::FORM_A\u003C\u002Fcode>)\u003C\u002Fth>\n\u003Cth>\u003Ccode>din5008b\u003C\u002Fcode> (\u003Ccode>Din5008::FORM_B\u003C\u002Fcode>)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Address field from top \u002F left\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">27 \u002F 20\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">45 \u002F 20\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Address field width × height\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">85 × 45\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">85 × 45\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Zone for additional information and notes (Zusatz- und Vermerkzone), above the recipient\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">17.7 (five lines, filled from the bottom); its last 5 mm hold the sender line (Rücksendeangabe)\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">same\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Recipient zone (Anschriftzone, six lines)\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">27.3, from 44.7\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">27.3, from 62.7\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Fold marks\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">87 and 192\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">105 and 210\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Punch mark\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">148.5\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">148.5\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Letterhead height in the default templates (top margin 15)\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008a (Din5008::FORM_A)\">12\u003C\u002Ftd>\n\u003Ctd data-label=\"din5008b (Din5008::FORM_B)\">30\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>The address field keeps its position when the invoice has a logo.\u003C\u002Fli>\n\u003Cli>The default templates print the sender line at the top of the address field and the recipient directly below it, inside the envelope window. The zones above are for your own templates.\u003C\u002Fli>\n\u003Cli>Select a layout per invoice with \u003Ccode>-&gt;presentation(['letterLayout' =&gt; 'din5008a'])\u003C\u002Fcode>, or for all invoices with \u003Ccode>quittio.pdf.layout\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Fold and punch marks are printed unless \u003Ccode>quittio.pdf.fold_marks\u003C\u002Fcode> (core option \u003Ccode>fold_marks\u003C\u002Fcode>) is \u003Ccode>false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>See \u003Ca href=\"\u002Fdocs\u002Ftemplates#letter-layouts\">Templates: letter layouts\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"ustg-rules\">UStG rules\u003Ca class=\"q-doc-anchor\" href=\"#ustg-rules\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Rules\\UstgRules::all()\u003C\u002Fcode> (level L3) checks the mandatory content of an invoice under the German VAT Act (sections 14 (4) and 14a UStG) and the simplifications of sections 33 and 34a UStDV. The rules apply to every invoice of a German seller, in every format including a plain PDF. Messages and hints are in German and English.\u003C\u002Fp>\n\u003Cp>You rarely need this table up front: a failing rule names its code, the field and a hint. Look the code up here when the hint is not enough.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rule\u003C\u002Fth>\n\u003Cth>Severity (BT, path)\u003C\u002Fth>\n\u003Cth>Reported when\u003C\u002Fth>\n\u003Cth>Legal basis\u003C\u002Fth>\n\u003Cth>Fix\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BG-5 \u003Ccode>seller.address\u003C\u002Fcode>, BG-8 \u003Ccode>buyer.address\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">One message per party that names the missing fields. The seller lacks street (address line 1), postcode or city. Or the buyer lacks street or city, or a buyer in \u003Ccode>DE\u003C\u002Fcode> lacks the postcode. The buyer part is skipped for small amount invoices.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) no. 1 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Add street, postcode and city for seller and buyer.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-31 \u003Ccode>seller.vatId\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The seller has neither a VAT identifier (BT-31) nor a tax number (BT-32), and there is no tax representative (BG-11). Skipped for small amount invoices.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) no. 2 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;vatId()\u003C\u002Fcode> or \u003Ccode>-&gt;taxNumber()\u003C\u002Fcode> on the seller.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-03\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-72 \u003Ccode>delivery.actualDeliveryDate\u003C\u002Fcode>); warning for prepayment invoices (386), none with \u003Ccode>-&gt;de()-&gt;serviceDateOpen()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">No delivery date (BT-72), no invoicing period (BG-14), and not every line has a period (BG-26). Skipped for small amount invoices (section 33 UStDV) and small business invoices (section 34a UStDV: the small business flag, or a line with \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) no. 6 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;deliveryDate()\u003C\u002Fcode> (also when it equals the invoice date), \u003Ccode>-&gt;invoicingPeriod()\u003C\u002Fcode> or a \u003Ccode>-&gt;period()\u003C\u002Fcode> on every line.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-04\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-22 \u003Ccode>notes\u003C\u002Fcode>); warning when the XML is written (option \u003Ccode>syntax\u003C\u002Fcode>), as the type code labels an e-invoice (section 14.5 (24) sentence 1 UStAE)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A self-billed type code (389, 261, 527), and no note contains &quot;Gutschrift&quot; or one of: self-billing, self billing, self-billed invoice, autofacturation, autofactura, autofatturazione, autofacturação, zelffacturering, samofakturowanie (case-insensitive).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) no. 10 UStG; other EU languages: section 14.5 (24) UStAE\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;de()-&gt;selfBilled()\u003C\u002Fcode> adds the note.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-05\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-22 \u003Ccode>notes\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The flag \u003Ccode>de.property_related_service\u003C\u002Fcode> is set and no note contains &quot;14b&quot;.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) no. 9 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;de()-&gt;propertyRelatedService()\u003C\u002Fcode> adds the note.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-06\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error per VAT row (BT-120 \u003Ccode>vatBreakdown[i].exemptionReason\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A VAT breakdown row of category \u003Ccode>AE\u003C\u002Fcode> whose exemption reason contains neither &quot;Steuerschuldnerschaft&quot; nor the text of one of the presets \u003Ccode>ReverseChargeDomestic\u003C\u002Fcode>, \u003Ccode>ReverseChargeEu\u003C\u002Fcode> and \u003Ccode>TriangularTransaction\u003C\u002Fcode>. The preset texts count in every locale the pack ships (\u003Ccode>de\u003C\u002Fcode>, \u003Ccode>en\u003C\u002Fcode>), the invoice locale and the validation locale (case-insensitive).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14a (1) and (5) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Use \u003Ccode>ReverseChargeDomestic\u003C\u002Fcode>, \u003Ccode>ReverseChargeEu\u003C\u002Fcode> or \u003Ccode>TriangularTransaction\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-07\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error per line (BG-32 \u003Ccode>lines[i].item.attributes\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The flag \u003Ccode>de.new_vehicle\u003C\u002Fcode> is set and a line has no item attributes.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14a (4) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;attribute('Erstzulassung', …)\u003C\u002Fcode> (first registration), \u003Ccode>-&gt;attribute('Kilometerstand', …)\u003C\u002Fcode> (mileage) on every line.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-08\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-112 \u003Ccode>totals.grossTotal\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The flag \u003Ccode>de.small_amount\u003C\u002Fcode> is set and the gross total exceeds the limit of the supply date (\u003Ccode>UstgRules::supplyDate()\u003C\u002Fcode>, otherwise the issue date): 250.00 EUR from 2017, 150.00 EUR before. Other currencies count with their EUR equivalent: gross total × exchange rate of \u003Ccode>-&gt;taxCurrency('EUR', $rate)\u003C\u002Fcode>. Without that rate the rule always fails.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 33 UStDV\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Remove \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode> and issue a full invoice.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-09\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-151 \u003Ccode>lines\u003C\u002Fcode>, or BT-102 \u003Ccode>charges\u003C\u002Fcode> for document level entries)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A line uses \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> or the invoice has the small business flag, and a line (sub lines included) or a document level allowance or charge has category \u003Ccode>S\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 19 UStG; VAT shown on charges counts too (section 14c (2) UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> on every line, no standard rated charges.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-10\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-6 \u003Ccode>taxCurrency\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The invoice currency is not EUR, the VAT total is not zero, and the VAT accounting currency (BT-6) is not EUR.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">Article 230 VAT Directive, section 16 (6) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;taxCurrency('EUR', $rate, $date)\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-11\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-31 \u003Ccode>seller.vatId\u003C\u002Fcode>, BT-48 \u003Ccode>buyer.vatId\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A line uses \u003Ccode>ReverseChargeEu\u003C\u002Fcode> or \u003Ccode>TriangularTransaction\u003C\u002Fcode>, or a line of category \u003Ccode>AE\u003C\u002Fcode> without preset has a buyer in the VAT territory of another member state (for services Monaco counts as France, and Northern Ireland does not count). Then the VAT identifiers of the seller (or of the tax representative) and of the buyer are required; each missing one is reported. A tax number is not sufficient. A small business (flag or \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode>) needs no VAT identifier of its own (section 19 (1) sentence 2 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14a (1) and (7) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;vatId()\u003C\u002Fcode> for seller and buyer.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-12\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-151 \u003Ccode>lines\u003C\u002Fcode>); warning for possible distance sales\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The flag \u003Ccode>de.small_amount\u003C\u002Fcode> is set and category \u003Ccode>AE\u003C\u002Fcode> or \u003Ccode>K\u003C\u002Fcode> is used (error). Or the buyer is a consumer and the destination lies in another member state (warning: a distance sale only if goods are transported there). The destination is the deliver-to address if it has a country, otherwise the buyer's address.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 33 sentence 3 UStDV; section 3c UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Remove \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode> and issue a full invoice.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-13\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-151 \u003Ccode>lines\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The flag \u003Ccode>de.new_vehicle\u003C\u002Fcode> is set and no line, allowance or charge uses category \u003Ccode>K\u003C\u002Fcode>. A warning, as the exemption may not apply in the individual case.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14a (4) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>VatPreset::IntraCommunitySupply\u003C\u002Fcode> on the vehicle lines, or remove \u003Ccode>-&gt;de()-&gt;newVehicle()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-14\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (BT-151 \u003Ccode>lines\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A line uses \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> or the invoice has the small business flag, a line, allowance or charge uses category \u003Ccode>K\u003C\u002Fcode>, and the flag \u003Ccode>de.new_vehicle\u003C\u002Fcode> is not set.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 19 (1) sentence 2, (6) sentence 1 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode> on the lines; \u003Ccode>-&gt;de()-&gt;newVehicle()\u003C\u002Fcode> for the intra-community supply of a new vehicle.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-15\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-2 \u003Ccode>issueDate\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A line, allowance or charge uses category \u003Ccode>K\u003C\u002Fcode>, or a line uses \u003Ccode>ReverseChargeEu\u003C\u002Fcode> (or category \u003Ccode>AE\u003C\u002Fcode> without preset for a buyer in another member state), and the invoice date is after the 15th of the month following the supply. The supply date is the latest of the delivery date (BT-72), the end of the invoicing period (BG-14) and the ends of the line periods (BG-26). Skipped without a supply date, for the type codes 381, 261, 384 and 386, and for re-issued invoices (BG-3 without a prepaid amount). Final invoices (BG-3 with a prepaid amount BT-113) are checked. A warning, as a late invoice stays valid.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14a (1) sentence 2 and (3) sentence 1 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Issue these invoices by the 15th of the following month.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-16\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-2 \u003Ccode>issueDate\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The invoice date is more than six months after the supply (\u003Ccode>UstgRules::supplyDate()\u003C\u002Fcode>). Only for business buyers and for services in connection with a property (flag \u003Ccode>de.property_related_service\u003C\u002Fcode>), where an invoice is obligatory. Skipped without a supply date and for the same documents as \u003Ccode>DE-USTG-15\u003C\u002Fcode>. A warning, as a late invoice stays valid.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (2) sentences 1 and 2 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Issue invoices within six months of the supply.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-17\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-7 \u003Ccode>taxPointDate\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A prepayment invoice (386) states an amount already paid (BT-113 above zero) but no VAT point date (BT-7). A warning, as a payment received on the issue date needs no date of its own.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (4) sentence 1 no. 6 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>-&gt;taxPointDate($received)\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-18\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-22 \u003Ccode>notes\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A corrected invoice (384) has no note that contains &quot;berichtigt&quot;, &quot;ersetzt&quot;, &quot;korrigiert&quot;, &quot;corrects&quot;, &quot;replaces&quot;, &quot;rectifie&quot; or &quot;remplace&quot;.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 31 (5) UStDV, section 15.2a (7) UStAE\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>Quittio::correction()\u003C\u002Fcode> adds &quot;Diese Rechnung berichtigt und ersetzt die Rechnung … vom …&quot;.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-19\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">info (BT-3 \u003Ccode>typeCode\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">A final invoice deducted an advance settled by self-billing (389, flag \u003Ccode>de.self_billed_advance\u003C\u002Fcode> set by \u003Ccode>deductAdvance()\u003C\u002Fcode>), but is no self-billed invoice. The deduction is required; changing the way of invoicing is allowed but unusual.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (2) sentence 5, (5) sentence 2 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Check with the buyer who settles the final payment.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-USTG-20\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (BT-113 \u003Ccode>prepaidAmount\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">\u003Ccode>deductAdvance()\u003C\u002Fcode> deducted an advance invoice without \u003Ccode>received:\u003C\u002Fcode> (flag \u003Ccode>de.advance_receipt_unconfirmed\u003C\u002Fcode>). Only advance payments actually received are deducted.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (5) sentence 2 UStG, section 14.8 (2), (5) and (10) UStAE\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">\u003Ccode>received: GermanInvoice::RECEIVED_IN_FULL\u003C\u002Fcode> or the amount received.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-EINVOICE-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">error (no field)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The run produces no e-invoice although section 14 (1) and section 27 (38) UStG require one (\u003Ca href=\"#e-invoice-obligation\">E-invoice obligation\u003C\u002Fa>). Only checked while rendering (option \u003Ccode>e_invoice\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 14 (1), (2), section 27 (38) UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Render \u003Ccode>zugferd\u003C\u002Fcode> (EN 16931) or \u003Ccode>xrechnung\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-EINVOICE-02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">warning (no field)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The run produces no e-invoice, and the transition of section 27 (38) UStG still allows an other invoice; a PDF needs the buyer's consent.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">section 27 (38) UStG, section 14 (1) sentence 5 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Get the buyer's consent or render an e-invoice.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-CATEGORY-O-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">info (BT-31 \u003Ccode>seller.vatId\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The VAT identifiers of seller and buyer were left out of an invoice of category \u003Ccode>O\u003C\u002Fcode> only (flag \u003Ccode>de.vat_ids_omitted\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">BR-O-02; section 14 (4) sentence 1 no. 2 UStG\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Nothing to do.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-CATEGORY-O-02\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity (BT, path)\">info (BT-32 \u003Ccode>seller.taxNumber\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">An invoice of category \u003Ccode>O\u003C\u002Fcode> only states a VAT identifier, and Quittio could not leave it out: no tax number of the seller, or a tax representative.\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">BR-O-02, BR-56\u003C\u002Ftd>\n\u003Ctd data-label=\"Fix\">Set the seller's tax number.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Helpers used by the rules and available to you:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>UstgRules::isSmallAmountInvoice($invoice)\u003C\u002Fcode>: the invoice has the small amount flag and its simplifications apply (no category \u003Ccode>AE\u003C\u002Fcode> or \u003Ccode>K\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>\u003Ccode>UstgRules::isSmallBusinessInvoice($invoice)\u003C\u002Fcode>: the small business flag is set or a line uses \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>\u003Ccode>UstgRules::hasServiceDate($invoice)\u003C\u002Fcode>: delivery date, invoicing period or a period on every line;\u003C\u002Fli>\n\u003Cli>\u003Ccode>UstgRules::supplyDate($invoice)\u003C\u002Fcode>: the latest of the delivery date, the end of the invoicing period and the ends of the line periods, or \u003Ccode>null\u003C\u002Fcode> without any of them;\u003C\u002Fli>\n\u003Cli>\u003Ccode>UstgRules::issuingDeadline($invoice)\u003C\u002Fcode>: the 15th of the month after the supply, or \u003Ccode>null\u003C\u002Fcode> without a supply date.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4 id=\"leitweg-id\">Leitweg-ID\u003Ca class=\"q-doc-anchor\" href=\"#leitweg-id\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>\u003Ccode>UstgRules::plausibility()\u003C\u002Fcode> (level L7) checks buyer references (BT-10 \u003Ccode>buyerReference\u003C\u002Fcode>) that are shaped like a Leitweg-ID but have wrong check digits:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rule\u003C\u002Fth>\n\u003Cth>Severity\u003C\u002Fth>\n\u003Cth>Reported when\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-LEITWEG-ID\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The buyer is a public buyer: the profile is \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode> or \u003Ccode>xrechnung-cvd\u003C\u002Fcode>, or the buyer's electronic address (BT-49) uses scheme \u003Ccode>0204\u003C\u002Fcode>. Message: &quot;The check digits of the Leitweg-ID &quot;:value&quot; (BT-10) are wrong.&quot;\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-LEITWEG-ID-SUSPECT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">info\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">Any other buyer in Germany (country \u003Ccode>DE\u003C\u002Fcode> or none) that is not a consumer. Message: &quot;The buyer reference &quot;:value&quot; (BT-10) is shaped like a Leitweg-ID, but its check digits are wrong. It is not treated as a Leitweg-ID, so the invoice is not issued as XRechnung automatically.&quot;\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>So a mistyped Leitweg-ID does not lead to ZUGFeRD unnoticed. An order number of the same shape (e.g. \u003Ccode>4711-01\u003C\u002Fcode>) gets the same info, which you may ignore. Neither finding changes the format.\u003C\u002Fp>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Support\\LeitwegId\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>looksLike(?string $value): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the shape: a coarse address of 2 to 12 digits, an optional fine address of up to 30 letters or digits and two check digits, separated by hyphens\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>isValid(?string $value): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">shape and check digits (ISO 7064 Mod 97-10) are correct\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>checkDigits(string $address): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the two check digits for coarse and fine address without hyphens, e.g. \u003Ccode>checkDigits('0401100012345')\u003C\u002Fcode> → \u003Ccode>03\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch4 id=\"tax-number\">Tax number\u003Ca class=\"q-doc-anchor\" href=\"#tax-number\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh4>\n\u003Cp>\u003Ccode>UstgRules::plausibility()\u003C\u002Fcode> also checks the tax number (Steuernummer, BT-32) of a seller in Germany. The local tax office issues this number; it is not the VAT identifier.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Rule\u003C\u002Fth>\n\u003Cth>Severity\u003C\u002Fth>\n\u003Cth>Reported when\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Severity\">warning (BT-32 \u003Ccode>seller.taxNumber\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Reported when\">The seller's country is \u003Ccode>DE\u003C\u002Fcode>, and the tax number is not a valid 13-digit ELSTER number, a 12-digit federal number or the notation of a federal state, or its check digit is wrong. Also reported when a VAT identifier (\u003Ccode>DE…\u003C\u002Fcode>) was given as tax number. A Bavarian notation without the tax office number (\u003Ccode>815\u002F08152\u003C\u002Fcode>) cannot be checked and is accepted. So is the small business identification number of a small business (suffix \u003Ccode>EX\u003C\u002Fcode>, section 34a UStDV).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The checks follow the document &quot;Prüfung der Steuer- und Steueridentifikationsnummer&quot; (checking tax numbers and tax identification numbers) of ELSTER, the online service of the German tax authorities, published by the Bavarian State Office for Taxes (Bayerisches Landesamt für Steuern):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Format.\u003C\u002Fstrong> The 13-digit ELSTER format is \u003Ccode>FFFF0BBBUUUUP\u003C\u002Fcode> (NRW: \u003Ccode>FFFF0BBBBUUUP\u003C\u002Fcode>), with the 0 at the 5th position.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Excluded districts.\u003C\u002Fstrong> 000, 998 and 999; below 100 in the Bavarian group; in NRW 0000, 0998 and 0999, and \u003Ccode>UUUP\u003C\u002Fcode> must be above 0009.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Check digit.\u003C\u002Fstrong> Each state has its procedure: the modified 11 procedure (Rhineland-Palatinate), the 2 procedure (Baden-Württemberg, Hesse, Schleswig-Holstein), or the 11 procedure with the factors of the state (all others; Berlin with the variants A and B by tax office and district).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Not checked:\u003C\u002Fstrong> whether the tax office exists.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Notation without state.\u003C\u002Fstrong> A notation without the state (e.g. \u003Ccode>93\u002F815\u002F08150\u003C\u002Fcode>) is valid when it is valid for any state that uses this notation.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Support\\TaxNumber\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TaxNumber::parse(string $value, ?string $state = null): ?TaxNumber\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the valid number in any notation (\u003Ccode>198\u002F815\u002F08152\u003C\u002Fcode>, \u003Ccode>9198081508152\u003C\u002Fcode>, \u003Ccode>919881508152\u003C\u002Fcode>, \u003Ccode>053 815 08158\u003C\u002Fcode> …), or null. \u003Ccode>$state\u003C\u002Fcode> (ISO 3166-2:DE, e.g. \u003Ccode>BY\u003C\u002Fcode>) restricts a state notation to that state.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TaxNumber::validate(string $value, ?string $state = null): ?bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">\u003Ccode>true\u003C\u002Fcode> valid, \u003Ccode>false\u003C\u002Fcode> invalid, \u003Ccode>null\u003C\u002Fcode> plausible but not checkable\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TaxNumber::looksLikeVatId(string $value): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">a VAT identifier (\u003Ccode>DE\u003C\u002Fcode> + 9 digits)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>-&gt;elster\u003C\u002Fcode>, \u003Ccode>-&gt;state\u003C\u002Fcode>, \u003Ccode>-&gt;formatted()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">13-digit ELSTER format, state, notation on tax notices (e.g. \u003Ccode>198\u002F815\u002F08152\u003C\u002Fcode>, \u003Ccode>400\u002F8150\u002F8159\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"mandatory-pdf-output\">Mandatory PDF output\u003Ca class=\"q-doc-anchor\" href=\"#mandatory-pdf-output\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>After rendering, the mandatory field guard checks that the PDF shows certain values (see \u003Ca href=\"\u002Fdocs\u002Ftemplates#mandatory-field-guard\">Templates: mandatory field guard\u003C\u002Fa>). \u003Ccode>CountryDE::mandatoryOutput()\u003C\u002Fcode> adds these German values to the base fields. Paths without a value are skipped. The legal basis is the value Quittio reports, in German citation form.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Condition\u003C\u002Fth>\n\u003Cth>Access key\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003Cth>Legal basis\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>not a small amount invoice, and the seller has a VAT identifier or tax number, or a tax representative with VAT identifier\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>seller.vatId|seller.taxNumber|taxRepresentative.vatId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">tax number or VAT identifier of the seller\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14 Abs. 4 Nr. 2 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>not a small amount or small business invoice, with BT-72 or BG-14\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>servicePeriod|deliveryDate|delivery.date\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">date of the supply or service\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14 Abs. 4 Nr. 6 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>the same, without BT-72 and BG-14\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>servicePeriod|lineGroups[*].lines[*].period|lines[*].period\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">date of the supply or service\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14 Abs. 4 Nr. 6 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>self-billed type code\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>title\u003C\u002Fcode>, and the path of the first note containing &quot;Gutschrift&quot;\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">label and note &quot;Gutschrift&quot;\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14 Abs. 4 Nr. 10 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>flag \u003Ccode>de.property_related_service\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">path of the retention note (its text or a note containing &quot;14b&quot;)\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">retention notice for property related services\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14 Abs. 4 Nr. 9 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>each VAT row of category \u003Ccode>AE\u003C\u002Fcode> or \u003Ccode>K\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>vatRows[i].label\u003C\u002Fcode> or the legal note with its BT-120 text\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">reverse charge or exemption note\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14a UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>category \u003Ccode>AE\u003C\u002Fcode> or \u003Ccode>K\u003C\u002Fcode> used\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>buyer.vatId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">VAT identifier of the buyer\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14a Abs. 1 und 3 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>category \u003Ccode>K\u003C\u002Fcode> used, or \u003Ccode>AE\u003C\u002Fcode> with a buyer country different from the seller's\u003C\u002Ftd>\n\u003Ctd data-label=\"Access key\">\u003Ccode>seller.vatId|taxRepresentative.vatId\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">VAT identifier of the seller\u003C\u002Ftd>\n\u003Ctd data-label=\"Legal basis\">§ 14a Abs. 1 und 3 UStG\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The default templates print all of them.\u003C\u002Fp>\n\u003Ch3 id=\"legal-texts\">Legal texts\u003Ca class=\"q-doc-anchor\" href=\"#legal-texts\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Country\\DE\\Texts\\LegalTexts::catalog()\u003C\u002Fcode> (also \u003Ccode>CountryDE::legalTexts()\u003C\u002Fcode>) holds the German notices in German and English. The texts live in the pack's language files \u003Ccode>resources\u002Flang\u002F{de,en}\u002Flegal.php\u003C\u002Fcode> (the exemption reasons in \u003Ccode>tax.php\u003C\u002Fcode>) and are read through the translator, so in Laravel \u003Ccode>lang\u002Fvendor\u002Fquittio-de\u002F{locale}\u002Flegal.php\u003C\u002Fcode> overrides single texts. Its fallback locale is \u003Ccode>de\u003C\u002Fcode> (\u003Ccode>LegalTexts::FALLBACK_LOCALE\u003C\u002Fcode>). Builder macros add some of them; texts marked &quot;–&quot; are for your own notes.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Constant (key)\u003C\u002Fth>\n\u003Cth>German\u003C\u002Fth>\n\u003Cth>English\u003C\u002Fth>\n\u003Cth>Added by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SELF_BILLING\u003C\u002Fcode> (\u003Ccode>self_billing\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Gutschrift\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Gutschrift (self-billed invoice)\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>selfBilled()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PROPERTY_RETENTION\u003C\u002Fcode> (\u003Ccode>property_retention\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Sie sind gesetzlich verpflichtet, diese Rechnung, einen Zahlungsbeleg oder eine andere beweiskräftige Unterlage zwei Jahre lang aufzubewahren (§ 14b Abs. 1 Satz 5 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">You are required by law to keep this invoice, a payment receipt or other conclusive document for two years (section 14b (1) sentence 5 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>propertyRelatedService()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>REVERSE_CHARGE\u003C\u002Fcode> (\u003Ccode>reverse_charge\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerschuldnerschaft des Leistungsempfängers\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Reverse charge, the recipient is liable for VAT\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">– (text of \u003Ccode>VatPreset::ReverseChargeEu\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>INTRA_COMMUNITY_SUPPLY\u003C\u002Fcode> (\u003Ccode>intra_community_supply\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie innergemeinschaftliche Lieferung (§ 4 Nr. 1b i. V. m. § 6a UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt intra-Community supply (section 4 no. 1b in conjunction with section 6a UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">– (text of \u003Ccode>VatPreset::IntraCommunitySupply\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>EXPORT\u003C\u002Fcode> (\u003Ccode>export\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie Ausfuhrlieferung (§ 4 Nr. 1a i. V. m. § 6 UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt export supply (section 4 no. 1a in conjunction with section 6 UStG)\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">– (text of \u003Ccode>VatPreset::Export\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SMALL_BUSINESS\u003C\u002Fcode> (\u003Ccode>small_business\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuerfreie Leistung nach § 19 Abs. 1 UStG (Steuerbefreiung für Kleinunternehmer).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT-exempt supply under section 19 (1) UStG (small business exemption).\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">– (text of \u003Ccode>VatPreset::SmallBusiness\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_DATE_OPEN\u003C\u002Fcode> (\u003Ccode>service_date_open\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Der Zeitpunkt der Leistung ist noch nicht vereinbart.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">The date of the service has not been agreed yet.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>serviceDateOpen()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PREPAYMENT\u003C\u002Fcode> (\u003Ccode>prepayment\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Anzahlungsrechnung. Die Leistung wird voraussichtlich am :date erbracht.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Advance invoice. The service is expected to be performed on :date.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>advance()\u003C\u002Fcode> with a date\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PREPAYMENT_MONTH\u003C\u002Fcode> (\u003Ccode>prepayment_month\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Anzahlungsrechnung. Die Leistung wird voraussichtlich im :month erbracht.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Advance invoice. The service is expected to be performed in :month.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>advance()\u003C\u002Fcode> with a month\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PREPAYMENT_RECEIVED\u003C\u002Fcode> (\u003Ccode>prepayment_received\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Die Anzahlung wurde am :date vereinnahmt.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">The advance payment was received on :date.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>advance()\u003C\u002Fcode> with \u003Ccode>$receivedOn\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_DEDUCTION\u003C\u002Fcode> (\u003Ccode>advance_deduction\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Abzüglich Anzahlung gemäß Rechnung :number vom :date: :amounts (§ 14 Abs. 5 Satz 2 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Less advance payment according to invoice :number of :date: :amounts (section 14 (5) sentence 2 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>deductAdvance()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_DEDUCTION_REMAINDER\u003C\u002Fcode> (\u003Ccode>advance_deduction_remainder\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Restrechnung: Abgezogen ist die vereinnahmte Anzahlung gemäß Rechnung :number vom :date: :amounts (§ 14 Abs. 5 Satz 2 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Remainder invoice: less the advance payment received according to invoice :number of :date: :amounts (section 14 (5) sentence 2 UStG).\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>deductAdvance()\u003C\u002Fcode> with \u003Ccode>style: 'remainder'\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_DEDUCTION_LINE\u003C\u002Fcode> (\u003Ccode>advance_deduction_line\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Abzüglich Anzahlung gemäß Rechnung :number vom :date\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Less advance payment according to invoice :number of :date\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">item name of the negative lines of a remainder invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_DEDUCTION_TAXED\u003C\u002Fcode> (\u003Ccode>advance_deduction_taxed\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Entgelt :net zzgl. :rate Umsatzsteuer :vat\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">net :net plus :rate VAT :vat\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>deductAdvance()\u003C\u002Fcode>, part of \u003Ccode>:amounts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_DEDUCTION_UNTAXED\u003C\u002Fcode> (\u003Ccode>advance_deduction_untaxed\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Entgelt :net ohne Umsatzsteuer\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">net :net without VAT\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>deductAdvance()\u003C\u002Fcode>, part of \u003Ccode>:amounts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CONSUMER_DEFAULT\u003C\u002Fcode> (\u003Ccode>consumer_default\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Sie kommen spätestens in Verzug, wenn Sie nicht innerhalb von 30 Tagen nach Fälligkeit und Zugang dieser Rechnung zahlen (§ 286 Abs. 3 BGB).\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">You will be in default at the latest if you do not pay within 30 days of the due date and receipt of this invoice (section 286 (3) BGB).\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>consumerDefaultNotice()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DEFAULT_INTEREST\u003C\u002Fcode> (\u003Ccode>default_interest\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Verzugszinsen :rate % p. a. (Basiszinssatz :base_rate % + :points Prozentpunkte) vom :from bis :until\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Default interest :rate % p.a. (base rate :base_rate % + :points points) from :from to :until\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>DefaultInterest\u003C\u002Fcode> (interest lines of payment reminders; German numbers and dates for every German locale)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DISCOUNT_AGREEMENT\u003C\u002Fcode> (\u003Ccode>discount_agreement\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Etwaige Minderungen des Entgelts (Boni, Rabatte) ergeben sich aus :agreement.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Any reductions of the consideration (bonuses, rebates) follow from :agreement.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>discountAgreement()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ZERO_RATED_PV\u003C\u002Fcode> (\u003Ccode>zero_rated_pv\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Steuersatz 0 % nach § 12 Abs. 3 UStG.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">VAT rate 0 % under section 12 (3) UStG.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>VatPreset::ZeroRatedPv\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>NEW_VEHICLE\u003C\u002Fcode> (\u003Ccode>new_vehicle\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"German\">Innergemeinschaftliche Lieferung eines neuen Fahrzeugs (§ 14a Abs. 4 UStG); die Fahrzeugmerkmale nach § 1b Abs. 2 und 3 UStG sind bei der Position angegeben.\u003C\u002Ftd>\n\u003Ctd data-label=\"English\">Intra-Community supply of a new means of transport (section 14a (4) UStG); the vehicle details under section 1b (2) and (3) UStG are stated with the line.\u003C\u002Ftd>\n\u003Ctd data-label=\"Added by\">\u003Ccode>newVehicle()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Ccode>REVERSE_CHARGE\u003C\u002Fcode>, \u003Ccode>INTRA_COMMUNITY_SUPPLY\u003C\u002Fcode>, \u003Ccode>EXPORT\u003C\u002Fcode> and \u003Ccode>SMALL_BUSINESS\u003C\u002Fcode> are the exemption reasons of the named \u003Ca href=\"#tax-presets\">tax presets\u003C\u002Fa>, in every locale the pack ships (\u003Ccode>CountryDE::locales()\u003C\u002Fcode>). So a notice has one wording in BT-120 and in your notes, including overrides of \u003Ccode>tax.php\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Validation and rendering add no text. The builder adds the notes of the presets that require one (\u003Ccode>StatesInvoiceNote\u003C\u002Fcode>, see \u003Ca href=\"#tax-presets\">Tax presets\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>LegalTexts::text($key, $locale, $replace)\u003C\u002Fcode> returns a text in the language of \u003Ccode>$locale\u003C\u002Fcode> (\u003Ccode>en_GB\u003C\u002Fcode> → English) or in German. \u003Ccode>LegalTexts::localeOf($key, $locale)\u003C\u002Fcode> names the catalog locale it uses.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A text for your own note, here on a prepayment invoice (386), which names the expected date of the service:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\NoteSubjectCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\Texts\\LegalTexts\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">type\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'386'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">note\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#79C0FF\">    LegalTexts\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">catalog\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">get\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">LegalTexts\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">PREPAYMENT\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'date'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '01.11.2026'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">]),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#79C0FF\">    NoteSubjectCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">RegulatoryInformation\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>-&gt;de()-&gt;advance()\u003C\u002Fcode> adds this note itself (\u003Ca href=\"#prepayment-invoices\">Prepayment invoices\u003C\u002Fa>). Prepayment invoices (386) without a service date get a \u003Ccode>DE-USTG-03\u003C\u002Fcode> warning instead of an error, unless \u003Ccode>advance()\u003C\u002Fcode> named the expected date or \u003Ccode>-&gt;de()-&gt;serviceDateOpen()\u003C\u002Fcode> states that it is not agreed yet. A prepayment invoice for a payment already received (BT-113) states the date of receipt as VAT point date (\u003Ccode>-&gt;taxPointDate()\u003C\u002Fcode>, BT-7) if it differs from the issue date (\u003Ccode>DE-USTG-17\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3 id=\"meta-flags\">Meta flags\u003Ca class=\"q-doc-anchor\" href=\"#meta-flags\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The pack marks German special cases with meta flags on the invoice (\u003Ccode>InvoiceData::$meta-&gt;flags\u003C\u002Fcode>). The builder macros set them, and the rules read them. \u003Ccode>Quittio\\Country\\DE\\Support\\Flags\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Constant\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003Cth>Set by\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SMALL_AMOUNT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.small_amount\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>smallAmount()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">small amount invoice: relaxed rules, PDF format, \u003Ccode>DE-USTG-08\u003C\u002Fcode>, \u003Ccode>DE-USTG-12\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>PROPERTY_RELATED_SERVICE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.property_related_service\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>propertyRelatedService()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>DE-USTG-05\u003C\u002Fcode>, mandatory output\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>NEW_VEHICLE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.new_vehicle\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>newVehicle()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>DE-USTG-07\u003C\u002Fcode>, \u003Ccode>DE-USTG-13\u003C\u002Fcode>, \u003Ccode>DE-USTG-14\u003C\u002Fcode> (exception)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SERVICE_DATE_OPEN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.service_date_open\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>serviceDateOpen()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">no \u003Ccode>DE-USTG-03\u003C\u002Fcode> warning for a prepayment invoice without service date\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SELF_BILLED_ADVANCE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.self_billed_advance\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>deductAdvance()\u003C\u002Fcode> of a self-billed advance (389)\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>DE-USTG-19\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>EXPECTED_SERVICE_DATE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.expected_service_date\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>advance()\u003C\u002Fcode> with a date or month\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">no \u003Ccode>DE-USTG-03\u003C\u002Fcode> warning for a prepayment invoice without service date\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>TICKET\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.ticket\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>ticket()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">ticket for the carriage of passengers (section 34 UStDV): no \u003Ccode>DE-EINVOICE-*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>VAT_IDS_OMITTED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.vat_ids_omitted\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>CountryDE::complete()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>DE-CATEGORY-O-01\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ADVANCE_RECEIPT_UNCONFIRMED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>de.advance_receipt_unconfirmed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">\u003Ccode>deductAdvance()\u003C\u002Fcode> without \u003Ccode>received:\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>DE-USTG-20\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SMALL_BUSINESS\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>small_business\u003C\u002Fcode> (\u003Ccode>Meta::FLAG_SMALL_BUSINESS\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">seller configuration, Managed issuer, \u003Ccode>-&gt;flag()\u003C\u002Fcode>, \u003Ccode>smallBusinessId()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">small business invoice (section 34a UStDV): \u003Ccode>DE-USTG-03\u003C\u002Fcode>, \u003Ccode>DE-USTG-09\u003C\u002Fcode>, \u003Ccode>DE-USTG-11\u003C\u002Fcode>, \u003Ccode>DE-USTG-14\u003C\u002Fcode>, \u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode>, mandatory output\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SMALL_AMOUNT_LIMIT\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>250.00\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Set by\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">deprecated: the limit depends on the supply date, see \u003Ccode>TaxTables::smallAmountLimitOn()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"retention\">Retention\u003Ca class=\"q-doc-anchor\" href=\"#retention\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>CountryDE::retention()\u003C\u002Fcode> returns \u003Ccode>new RetentionRule(8, fromEndOfCalendarYear: true)\u003C\u002Fcode>: invoices are kept for 8 years from the end of the calendar year of issue (section 14b UStG, section 147 AO as amended in 2025). An invoice issued on 3 October 2026 is kept until 31 December 2034. The Managed layer stores this date (\u003Ccode>retention_until\u003C\u002Fcode>); \u003Ccode>quittio-managed.retention.years\u003C\u002Fcode> may only lengthen it.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Suspension.\u003C\u002Fstrong> Section 147 (3) AO stays unaffected: documents that matter for taxes not yet time-barred, e.g. during a tax audit or an objection, must not be deleted after the 8 years. The Managed layer keeps them with a legal hold (\u003Ccode>legal_hold\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Files.\u003C\u002Fstrong> Keep every invoice in the format it was issued in: ZUGFeRD as the PDF with its embedded XML, XRechnung as the XML. At least the structured part must stay unchanged (section 14b.1 (1) UStAE). Keep a PDF sent with an XRechnung as well, and the validation report as evidence (BMF letter of 15 October 2025, marginal no. 35a). \u003Ccode>RenderedInvoice::save()\u003C\u002Fcode> stores the main output only; save the siblings with \u003Ccode>-&gt;as('pdf')-&gt;save()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Supervised institutions.\u003C\u002Fstrong> For credit and financial services institutions, insurers and investment firms the 8 years apply only to invoices whose 10-year period had not expired on 1 January 2026 (section 27 (40) sentence 2 UStG); for everybody else, to invoices whose period was still running on 31 December 2024.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"bmf-error-classes\">BMF error classes\u003Ca class=\"q-doc-anchor\" href=\"#bmf-error-classes\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>In its letter of 15 October 2025, the German Federal Ministry of Finance (BMF) sorts errors in e-invoices into three classes. \u003Ccode>Quittio\\Country\\DE\\Rules\\BmfErrorClass\u003C\u002Fcode> maps Quittio's findings to these classes (&quot;Rz.&quot; is the marginal number in the letter):\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Case\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003Cth>Findings\u003C\u002Fth>\n\u003Cth>\u003Ccode>label('de')\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>\u003Ccode>label('en')\u003C\u002Fcode>\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Findings\">levels L1, L2, L4, L6\u003C\u002Ftd>\n\u003Ctd data-label=\"label('de')\">Formatfehler (Rz. 6a)\u003C\u002Ftd>\n\u003Ctd data-label=\"label('en')\">Format error (marginal no. 6a)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>BusinessRule\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>business_rule\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Findings\">levels L3, L5\u003C\u002Ftd>\n\u003Ctd data-label=\"label('de')\">Geschäftsregelfehler (Rz. 6b)\u003C\u002Ftd>\n\u003Ctd data-label=\"label('en')\">Business rule error (marginal no. 6b)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Content\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>content\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Findings\">every \u003Ccode>DE-USTG-*\u003C\u002Fcode> finding and level L7\u003C\u002Ftd>\n\u003Ctd data-label=\"label('de')\">Inhaltsfehler (Rz. 35a)\u003C\u002Ftd>\n\u003Ctd data-label=\"label('en')\">Content error (marginal no. 35a)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Ccode>BmfErrorClass::of(ValidationMessage $message)\u003C\u002Fcode> classifies one finding.\u003C\u002Fli>\n\u003Cli>\u003Ccode>label()\u003C\u002Fcode> returns German for \u003Ccode>de\u003C\u002Fcode> and English otherwise.\u003C\u002Fli>\n\u003Cli>\u003Ccode>voidsEInvoice()\u003C\u002Fcode> is true for \u003Ccode>Format\u003C\u002Fcode> only: the document is then not an e-invoice but an &quot;other invoice&quot; (sonstige Rechnung).\u003C\u002Fli>\n\u003Cli>\u003Ccode>(new CountryDE)-&gt;errorClassification($result)\u003C\u002Fcode> groups the errors and warnings of a \u003Ccode>ValidationResult\u003C\u002Fcode> by class value:\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\CountryDE\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$classes \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CountryDE\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">errorClassification\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($result);   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F ['format' => [...], 'business_rule' => [...], 'content' => [...]]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The validation levels are described in \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>; see also \u003Ca href=\"\u002Fdocs\u002Fvalidation#germany-bmf-error-classes\">Validation: Germany: BMF error classes\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"translations\">Translations\u003Ca class=\"q-doc-anchor\" href=\"#translations\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The pack ships German and English catalogs in \u003Ccode>resources\u002Flang\u002F{de,en}\u002F\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>rules.php\u003C\u002Fcode>: message and hint of every rule (\u003Ccode>BR-DE-*\u003C\u002Fcode>, \u003Ccode>BR-DEX-*\u003C\u002Fcode>, \u003Ccode>DE-XRECHNUNG-EXT-01\u003C\u002Fcode>, \u003Ccode>DE-USTG-*\u003C\u002Fcode>, \u003Ccode>DE-LEITWEG-ID\u003C\u002Fcode>, \u003Ccode>DE-LEITWEG-ID-SUSPECT\u003C\u002Fcode>, \u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>\u003Ccode>tax.php\u003C\u002Fcode>: the exemption reason texts of the presets, including \u003Ccode>de.exempt\u003C\u002Fcode> for \u003Ccode>VatPreset::exempt()\u003C\u002Fcode> (placeholder \u003Ccode>:paragraph\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>They are registered as the namespace \u003Ccode>quittio-de\u003C\u002Fcode> (e.g. \u003Ccode>quittio-de::rules.DE-USTG-03.message\u003C\u002Fcode>). \u003Ccode>CountryDE::registerTranslations()\u003C\u002Fcode> registers them lazily, so presets work without a \u003Ccode>Quittio\u003C\u002Fcode> instance. Other locales fall back to English. With Laravel, Laravel's translator is used, so the usual override files apply: \u003Ccode>lang\u002Fvendor\u002Fquittio-de\u002F{locale}\u002Frules.php\u003C\u002Fcode> and \u003Ccode>tax.php\u003C\u002Fcode>, also for additional locales.\u003C\u002Fp>\n\u003Cp>\u003Ccode>CountryDE::locales()\u003C\u002Fcode> lists the locales the pack ships (the directories of \u003Ccode>resources\u002Flang\u003C\u002Fcode>). Texts defined in PHP cannot be translated through files:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the legal texts (German and English, fallback German; the four notices taken from the presets follow \u003Ccode>tax.php\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>the correction policy titles (fallback English);\u003C\u002Fli>\n\u003Cli>the BMF labels and the default interest descriptions (German for \u003Ccode>de\u003C\u002Fcode>, English otherwise).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"the-german-packs-hooks\">The German pack's hooks\u003Ca class=\"q-doc-anchor\" href=\"#the-german-packs-hooks\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>For pack authors, this is how \u003Ccode>CountryDE\u003C\u002Fcode> fills the \u003Ca href=\"#the-countrypack-contract\">\u003Ccode>CountryPack\u003C\u002Fcode> contract\u003C\u002Fa>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Hook\u003C\u002Fth>\n\u003Cth>Germany\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaults()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">currency \u003Ccode>EUR\u003C\u002Fcode>, time zone \u003Ccode>Europe\u002FBerlin\u003C\u002Fcode>, locale \u003Ccode>de\u003C\u002Fcode>, paper \u003Ccode>A4\u003C\u002Fcode>, letter layout \u003Ccode>din5008b\u003C\u002Fcode>, profile \u003Ccode>en16931\u003C\u002Fcode>, payment QR \u003Ccode>girocode\u003C\u002Fcode>, default VAT presets \u003Ccode>de.standard\u003C\u002Fcode> and \u003Ccode>de.small_business\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profiles()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#xrechnung-profiles\">\u003Ccode>XRechnung30\u003C\u002Fcode>, \u003Ccode>XRechnung30Extension\u003C\u002Fcode>, \u003Ccode>XRechnung30Cvd\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>taxPresets()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">every case of \u003Ca href=\"#tax-presets\">\u003Ccode>VatPreset\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>rules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">the \u003Ca href=\"#ustg-rules\">UStG rules\u003C\u002Fa> \u003Ccode>DE-USTG-01\u003C\u002Fcode> to \u003Ccode>DE-USTG-15\u003C\u002Fcode>, the \u003Ca href=\"#leitweg-id\">Leitweg-ID checks\u003C\u002Fa> \u003Ccode>DE-LEITWEG-ID\u003C\u002Fcode> and \u003Ccode>DE-LEITWEG-ID-SUSPECT\u003C\u002Fcode>, and the \u003Ca href=\"#tax-number\">tax number check\u003C\u002Fa> \u003Ccode>DE-TAX-NUMBER\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>buyerCountryRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">none\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formatRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#format-choice\">\u003Ccode>GermanFormatRule\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mandatoryOutput()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#mandatory-pdf-output\">mandatory PDF output\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>legalTexts()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#legal-texts\">\u003Ccode>LegalTexts::catalog()\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>numberingRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">pattern \u003Ccode>RE-{Y}-{seq:4}\u003C\u002Fcode>, reset \u003Ccode>yearly\u003C\u002Fcode>, resets \u003Ccode>never\u003C\u002Fcode>, \u003Ccode>yearly\u003C\u002Fcode>, \u003Ccode>monthly\u003C\u002Fcode>, gapless\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>retention()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#retention\">8 years from the end of the calendar year\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>dunningLaw()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#dunning-law\">section 288 BGB values\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>correctionPolicy()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#cancellations-and-corrections\">credit note, cancel and reissue, German titles\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>letterLayouts()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#din-5008-letter-layouts\">\u003Ccode>din5008a\u003C\u002Fcode>, \u003Ccode>din5008b\u003C\u002Fcode>, \u003Ccode>free\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paymentQr()\u003C\u002Fcode>, \u003Ccode>addressFormatter()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">defaults: EPC GiroCode, international address format\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>translationPath()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ccode>resources\u002Flang\u003C\u002Fcode> of the package\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>errorClassification()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Germany\">\u003Ca href=\"#bmf-error-classes\">BMF error classes\u003C\u002Fa> (additional method)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"known-limitations\">Known limitations\u003Ca class=\"q-doc-anchor\" href=\"#known-limitations\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>The legal wording, references and defaults reflect the law and administrative practice of October 2026, when a tax adviser confirmed them (see the legal review and the disclaimer in the README). Later changes of the law need a new release.\u003C\u002Fli>\n\u003Cli>Final invoices: the EN 16931 variants of \u003Ccode>deductAdvance()\u003C\u002Fcode> (prepaid amount or remainder invoice) exist; the EXTENDED variant does not. The tax review found it unnecessary.\u003C\u002Fli>\n\u003Cli>The shipped base rate table ends with 1 July 2026. Later rates come from \u003Ccode>quittio.countries.de.base_rates\u003C\u002Fcode> or \u003Ccode>php artisan quittio:base-rate:update\u003C\u002Fcode> (see \u003Ca href=\"#base-rate-table\">Base rate table\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The documents layer checks the section 288 (5) BGB flat rate within one reminder (once per claim, not for consumers); across reminders the application or the Managed layer must track it.\u003C\u002Fli>\n\u003Cli>Distance sales (section 3c UStG) cannot be told from the data; \u003Ccode>DE-USTG-12\u003C\u002Fcode> only warns about possible ones.\u003C\u002Fli>\n\u003Cli>Tax numbers are checked for format and check digit, not against the list of tax offices. Territories without a distinct postcode cannot be detected.\u003C\u002Fli>\n\u003Cli>The pack defines no buyer country rules, exporters (e.g. DATEV) or readers yet.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"other-countries\">Other countries\u003Ca class=\"q-doc-anchor\" href=\"#other-countries\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>These packs are released with the same version as the rest of Quittio, but are not part of \u003Ccode>quittio\u002Fquittio\u003C\u002Fcode>. Their legal wording, rules and defaults have \u003Cstrong>not been reviewed by a tax adviser\u003C\u002Fstrong> of the country yet: check the mentions and rates of your invoices before you rely on them. Each page describes the presets, rules, formats, defaults and what is not included yet.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Package\u003C\u002Fth>\n\u003Cth>Country\u003C\u002Fth>\n\u003Cth>Covers\u003C\u002Fth>\n\u003Cth>Page\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio\u002Fcountry-at\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Country\">Austria (\u003Ccode>AT\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Covers\">mandatory fields of the UStG 1994, tax presets, CIUS-AT profiles, ebInterface, default interest (UGB, ABGB)\u003C\u002Ftd>\n\u003Ctd data-label=\"Page\">\u003Ca href=\"\u002Fdocs\u002Fcountry-at\">Austria\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio\u002Fcountry-be\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Country\">Belgium (\u003Ccode>BE\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Covers\">mandatory fields of Royal Decree No. 1, tax presets, Peppol BIS, language regions, default interest (law of 2 August 2002)\u003C\u002Ftd>\n\u003Ctd data-label=\"Page\">\u003Ca href=\"\u002Fdocs\u002Fcountry-be\">Belgium\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio\u002Fcountry-ch\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Country\">Switzerland (\u003Ccode>CH\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Covers\">mandatory fields of the MWSTG, tax presets, QR bill, rounding to 5 Rappen, default interest (Art. 104 OR)\u003C\u002Ftd>\n\u003Ctd data-label=\"Page\">\u003Ca href=\"\u002Fdocs\u002Fcountry-ch\">Switzerland\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio\u002Fcountry-fr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Country\">France (\u003Ccode>FR\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Covers\">mentions of the CGI (CIBS from 2027) and the Code de commerce, the e-invoicing reform, SIREN, late payment penalties\u003C\u002Ftd>\n\u003Ctd data-label=\"Page\">\u003Ca href=\"\u002Fdocs\u002Fcountry-fr\">France\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>bash\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FFA657\">composer\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> require\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> quittio\u002Fcountry-fr\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The packs declare themselves in their \u003Ccode>composer.json\u003C\u002Fcode>, so Laravel finds them after the installation; without Laravel, pass them to \u003Ccode>Quittio::create()\u003C\u002Fcode>, e.g. \u003Ccode>Quittio::create(['country' =&gt; 'FR'], [new CountryFR])\u003C\u002Fcode> (\u003Ca href=\"#registering-packs\">Registering packs\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"how-a-pack-is-selected\">How a pack is selected\u003Ca class=\"q-doc-anchor\" href=\"#how-a-pack-is-selected\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>This and the following sections are for authors of country packs, and for readers who want to know how Quittio picks a pack. A country pack implements \u003Ccode>Quittio\\Core\\Countries\\CountryPack\u003C\u002Fcode>, usually by extending \u003Ccode>Quittio\\Core\\Countries\\AbstractCountryPack\u003C\u002Fcode>, which supplies neutral defaults for every hook (every method of the contract). A pack may only add or tighten rules; it never relaxes EN 16931.\u003C\u002Fp>\n\u003Cp>\u003Ccode>DefaultCountryResolver\u003C\u002Fcode> picks the packs for every run: render, check, prepare, documents, cancellations and the validation of incoming files.\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Leading pack (seller side).\u003C\u002Fstrong> Quittio takes the first of these values that is set:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the country passed to the run (\u003Ccode>-&gt;country('AT')\u003C\u002Fcode> on the pending invoice, \u003Ccode>RenderOptions::$country\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>the seller's country code (BT-40);\u003C\u002Fli>\n\u003Cli>the configured default country (\u003Ccode>quittio.defaults.country\u003C\u002Fcode>, core config key \u003Ccode>country\u003C\u002Fcode>);\u003C\u002Fli>\n\u003Cli>otherwise \u003Ccode>XX\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The registry returns the installed pack for that code. A country without a pack of its own takes the pack of the country whose VAT territory it belongs to (\u003Ca href=\"#vatterritory\">\u003Ccode>VatTerritory::vatCountry()\u003C\u002Fcode>\u003C\u002Fa>): a seller in Monaco the French pack, a seller in Liechtenstein the Swiss pack. Otherwise Quittio uses a generic pack (\u003Ccode>CountryGeneric\u003C\u002Fcode>).\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Buyer pack.\u003C\u002Fstrong> If the buyer's country code (BT-55) is set and differs from the leading pack's code, the installed pack of the buyer's country (or of the country whose VAT territory it belongs to) is added, unless it is the leading pack. No generic pack is created for the buyer.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">country\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'DE'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F force the leading pack\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>What each side contributes:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Hook\u003C\u002Fth>\n\u003Cth>Leading pack\u003C\u002Fth>\n\u003Cth>Buyer pack (cross-border only)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>rules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">applied\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>buyerCountryRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">applied\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formatRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">domestic invoices\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">cross-border business invoices (see \u003Ca href=\"\u002Fdocs\u002Fformats#automatic-choice\">automatic format choice\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mandatoryOutput()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">merged with the base fields of the mandatory field guard\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaults()\u003C\u002Fcode> (locale, paper, letter layout), \u003Ccode>letterLayouts()\u003C\u002Fcode>, \u003Ccode>addressFormatter()\u003C\u002Fcode>, \u003Ccode>paymentQr()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">locale fallback and PDF\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>correctionPolicy()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">used for cancellations (\u003Ccode>Quittio::cancellation()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>translationPath()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Leading pack\">registered\u003C\u002Ftd>\n\u003Ctd data-label=\"Buyer pack (cross-border only)\">registered\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>&quot;Domestic&quot; means that seller and buyer lie in the same VAT territory (see \u003Ca href=\"#vatterritory\">\u003Ccode>VatTerritory\u003C\u002Fcode>\u003C\u002Fa>), or that the buyer has no country code. A buyer in a territory excluded from the seller's VAT territory (e.g. Büsingen for Germany) is cross-border. Without a buyer pack of its own, the format rules of the leading pack still apply to it.\u003C\u002Fp>\n\u003Cp>Without a pack for the seller's country, \u003Ccode>CountryGeneric\u003C\u002Fcode> applies: EN 16931 rules only, international formatting and neutral defaults. Validation then reports the warning \u003Ccode>QUITTIO-GENERIC-COUNTRY\u003C\u002Fcode> (L3, BT-40): &quot;No country pack is installed for the seller country :value. Only EN 16931 rules are checked; national mandatory information is not validated.&quot; \u003Ccode>ResolvedCountries::isGeneric()\u003C\u002Fcode> and \u003Ccode>CountryGeneric::isGeneric()\u003C\u002Fcode> tell this case apart.\u003C\u002Fp>\n\u003Cp>With the Managed layer, the issuer's country selects the pack for numbering and retention. The leading pack of an issued invoice is stored with it (\u003Ccode>country_pack\u003C\u002Fcode>) and used again for re-rendering and corrections (see \u003Ca href=\"\u002Fdocs\u002Fmanaged\">Managed layer\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"registering-packs\">Registering packs\u003Ca class=\"q-doc-anchor\" href=\"#registering-packs\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>A pack must be registered before Quittio can use it. The German pack registers itself in Laravel.\u003C\u002Fp>\n\u003Ch3 id=\"laravel\">Laravel\u003Ca class=\"q-doc-anchor\" href=\"#laravel\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Laravel finds packs in three places. All of them are instantiated through the container, so constructors may use dependency injection:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Composer metadata.\u003C\u002Fstrong> Every installed package and the root \u003Ccode>composer.json\u003C\u002Fcode> of your application may declare packs. \u003Ccode>quittio\u002Fcountry-de\u003C\u002Fcode> declares itself this way, so \u003Ccode>composer require quittio\u002Fcountry-de\u003C\u002Fcode> (or \u003Ccode>quittio\u002Fquittio\u003C\u002Fcode>, which contains it) is all you need. Classes that do not exist are skipped.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>json\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#A5D6FF\">\"extra\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: { \u003C\u002Fspan>\u003Cspan style=\"color:#7EE787\">\"quittio\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: { \u003C\u002Fspan>\u003Cspan style=\"color:#7EE787\">\"country-packs\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">\"Acme\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">\\\\\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">CountryAT\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">\\\\\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">CountryAT\"\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">] } }\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Configuration.\u003C\u002Fstrong> \u003Ccode>quittio.countries\u003C\u002Fcode> lists further pack classes; keys are ignored (see \u003Ca href=\"\u002Fdocs\u002Fconfiguration#country-packs\">Configuration\u003C\u002Fa>). Arrays under lower-case codes are the settings of a pack, not classes (\u003Ca href=\"#settings-of-your-pack\">Settings of your pack\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#A5D6FF\">'countries'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#A5D6FF\">    'AT'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> \\Acme\\CountryAT\\CountryAT\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::class\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>At runtime.\u003C\u002Fstrong> Call \u003Ccode>Quittio::registerCountry(new CountryAT)\u003C\u002Fcode> (facade \u003Ccode>Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fcode>), e.g. in a service provider. Packs registered this way win over packs with the same code from the other two sources.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>A class from the first two sources that is not a country pack throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Packs are keyed by \u003Ccode>code()\u003C\u002Fcode>. Of two packs with the same code, the one registered last wins. Discovered packs come first, then the configured classes, then packs registered at runtime. So a subclass of \u003Ccode>CountryDE\u003C\u002Fcode> in \u003Ccode>quittio.countries\u003C\u002Fcode> replaces the discovered \u003Ccode>CountryDE\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Ccode>php artisan quittio:countries\u003C\u002Fcode> lists the installed packs with code, class, profiles, number of rules and format rules, and the defaults (currency, locale, profile). Without any pack it prints a warning (see \u003Ca href=\"\u002Fdocs\u002Fcommands#quittiocountries\">Artisan commands\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"without-laravel\">Without Laravel\u003Ca class=\"q-doc-anchor\" href=\"#without-laravel\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Country\\DE\\CountryDE\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$quittio \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">create\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'country'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'DE'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], [\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CountryDE\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">]);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">registerCountry\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CountryAT\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F further packs at any time\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Registering a pack does three things:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>it adds the pack to the \u003Ccode>CountryRegistry\u003C\u002Fcode> under its upper-case code;\u003C\u002Fli>\n\u003Cli>it registers the pack's \u003Ccode>profiles()\u003C\u002Fcode> in the profile registry, so that formats, \u003Ccode>-&gt;profile('xrechnung')\u003C\u002Fcode> and the reader know them;\u003C\u002Fli>\n\u003Cli>it registers \u003Ccode>translationPath()\u003C\u002Fcode> as the translation namespace \u003Ccode>quittio-{code}\u003C\u002Fcode> (lower case, e.g. \u003Ccode>quittio-de\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ccode>$quittio-&gt;countries()\u003C\u002Fcode> returns the registry: \u003Ccode>has($code)\u003C\u002Fcode>, \u003Ccode>get($code)\u003C\u002Fcode> (installed pack or null), \u003Ccode>getOrGeneric($code)\u003C\u002Fcode>, \u003Ccode>all()\u003C\u002Fcode> (array keyed by code) and \u003Ccode>taxPreset($key)\u003C\u002Fcode> (the preset with this key from any installed pack, or null). Codes are case-insensitive.\u003C\u002Fp>\n\u003Ch2 id=\"writing-your-own-country-pack\">Writing your own country pack\u003Ca class=\"q-doc-anchor\" href=\"#writing-your-own-country-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Col>\n\u003Cli>Create a Composer package that requires \u003Ccode>quittio\u002Fcore\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Extend \u003Ccode>AbstractCountryPack\u003C\u002Fcode> and override only what differs. \u003Ccode>code()\u003C\u002Fcode> is the one required method.\u003C\u002Fli>\n\u003Cli>Add tax presets, rules, format rules, mandatory output, layouts and texts as needed, and national output formats with \u003Ccode>formats()\u003C\u002Fcode> (\u003Ca href=\"#formats-of-your-pack\">Formats of your pack\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>Ship translations in \u003Ccode>resources\u002Flang\u002F{locale}\u002Frules.php\u003C\u002Fcode> and return the directory from \u003Ccode>translationPath()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Declare the pack in \u003Ccode>composer.json\u003C\u002Fcode> (\u003Ccode>extra.quittio.country-packs\u003C\u002Fcode>), so that the Laravel integration finds it.\nIf the pack has Laravel settings, keep them under \u003Ccode>quittio.countries.{code}\u003C\u002Fcode> (\u003Ca href=\"#settings-of-your-pack\">Settings of your pack\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>Test it with example invoices and, where they exist, the official validation artefacts of the country. Have the legal content reviewed by a local tax adviser.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>A minimal pack (values for illustration only):\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">namespace\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> Acme\\CountryAT\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Countries\\AbstractCountryPack\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Countries\\CountryDefaults\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Countries\\MandatoryField\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Countries\\MandatoryFieldList\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Countries\\RetentionRule\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Data\\InvoiceData\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\VatCategory\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Tax\\CustomTaxPreset\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Tax\\TaxPresetCollection\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Validation\\Rules\\CallbackRule\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Validation\\Rules\\Inspect\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Validation\\Rules\\RuleReporter\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">final\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> CountryAT\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> AbstractCountryPack\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> code\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> string\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'AT'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> defaults\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CountryDefaults\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CountryDefaults\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">currency\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'EUR'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">timezone\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Europe\u002FVienna'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> taxPresets\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> TaxPresetCollection\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> TaxPresetCollection\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#79C0FF\">            CustomTaxPreset\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'at.standard_20'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">VatCategory\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">StandardRate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'20'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        ]);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> rules\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> array\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#79C0FF\">            CallbackRule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">l3\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'ACME-AT-01'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'The seller VAT identifier (BT-31) must be stated.'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceData\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $i, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">RuleReporter\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $report)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> void\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:18ch;text-indent:-18ch\">\u003Cspan style=\"color:#FF7B72\">                if\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">!\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Inspect\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">filled\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($i\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">seller\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">vatId)) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:22ch;text-indent:-22ch\">\u003Cspan style=\"color:#E6EDF3\">                    $report\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">error\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'BT-31'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'seller.vatId'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:18ch;text-indent:-18ch\">\u003Cspan style=\"color:#E6EDF3\">                }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#E6EDF3\">            }, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio-at'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        ];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> formatRules\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> array\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> ConsumerPdfRule\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">];\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> mandatoryOutput\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceData\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> MandatoryFieldList\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> MandatoryFieldList\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> MandatoryField\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'seller.vatId'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'VAT identifier of the seller'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)]);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> retention\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> RetentionRule\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> RetentionRule\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">7\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> translationPath\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> string\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> dirname\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">__DIR__\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'\u002Fresources\u002Flang'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The format rule of the example sends invoices to consumers as PDF:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Data\\InvoiceData\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Formats\\FormatChoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Formats\\FormatRegistry\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Formats\\FormatRule\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">final\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> ConsumerPdfRule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> implements\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> FormatRule\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> resolve\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceData\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> ?\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">FormatChoice\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $invoice\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">buyer\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">isConsumer\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#FF7B72\">            ?\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> FormatChoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">FormatRegistry\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">PDF\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Invoice to a consumer.'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#FF7B72\">            :\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F null: the next rule or the default choice decides\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The German translation of the rule, in \u003Ccode>resources\u002Flang\u002Fde\u002Frules.php\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F \"The seller's VAT identifier (UID, BT-31) must be stated.\" \u002F \"Set ->vatId() on the seller.\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#A5D6FF\">    'ACME-AT-01'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#A5D6FF\">        'message'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'Die UID des Verkäufers (BT-31) muss angegeben sein.'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#A5D6FF\">        'hint'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'Setzen Sie ->vatId() beim Verkäufer.'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    ],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">];\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch3 id=\"presets-of-your-pack\">Presets of your pack\u003Ca class=\"q-doc-anchor\" href=\"#presets-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A preset implements \u003Ccode>Quittio\\Core\\Tax\\TaxPreset\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Returns\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>key(): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">stable key prefixed with the country code, e.g. \u003Ccode>at.standard_20\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>category(): VatCategory\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">VAT category (BT-151)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>rate(): ?BigDecimal\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">rate in percent, null for category O\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exemptionReasonCode(): VatExemptionReasonCode|RawCode|null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">VATEX code (BT-121)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exemptionReason(?string $locale = null): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">exemption reason text (BT-120), shown in XML and PDF\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cul>\n\u003Cli>\u003Ccode>CustomTaxPreset::make(string $key, VatCategory $category, BigDecimal|int|string|null $rate = null, VatExemptionReasonCode|RawCode|string|null $code = null, array|string|null $reason = null)\u003C\u002Fcode> builds a preset ad hoc. \u003Ccode>$reason\u003C\u002Fcode> is a text or locale =&gt; text. A plain string counts as English; without a locale the English text is used.\u003C\u002Fli>\n\u003Cli>For many presets a backed enum is convenient, as \u003Ccode>Quittio\\Country\\DE\\Tax\\VatPreset\u003C\u002Fcode> shows.\u003C\u002Fli>\n\u003Cli>\u003Ccode>TaxPresetCollection\u003C\u002Fcode> offers \u003Ccode>add()\u003C\u002Fcode>, \u003Ccode>has($key)\u003C\u002Fcode>, \u003Ccode>get($key)\u003C\u002Fcode> (throws \u003Ccode>InvalidArgumentException\u003C\u002Fcode> for unknown keys), \u003Ccode>count()\u003C\u002Fcode> and iteration.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A preset is applied per line with \u003Ccode>-&gt;vat($preset)\u003C\u002Fcode>. The line stores category, rate, reason, code and the preset key (\u003Ccode>LineVat::$presetKey\u003C\u002Fcode>), so that rules can recognise it (see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#tax-presets\">Building invoices: tax presets\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"rules-of-your-pack\">Rules of your pack\u003Ca class=\"q-doc-anchor\" href=\"#rules-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A rule implements \u003Ccode>Quittio\\Core\\Validation\\Rule\u003C\u002Fcode> (\u003Ccode>code()\u003C\u002Fcode>, \u003Ccode>level()\u003C\u002Fcode>, \u003Ccode>check(InvoiceData, ValidationContext): iterable&lt;ValidationMessage&gt;\u003C\u002Fcode>). \u003Ccode>CallbackRule::l3($code, $fallback, $check, $namespace)\u003C\u002Fcode> (business rules) and \u003Ccode>CallbackRule::l7(...)\u003C\u002Fcode> (plausibility) cover most cases. The closure receives the invoice and a \u003Ccode>RuleReporter\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>error(?string $bt = null, ?string $path = null, array $replace = [])\u003C\u002Fcode>, \u003Ccode>warning(...)\u003C\u002Fcode> and \u003Ccode>info(...)\u003C\u002Fcode> add a finding with business term and data path;\u003C\u002Fli>\n\u003Cli>\u003Ccode>context()\u003C\u002Fcode> returns the \u003Ccode>ValidationContext\u003C\u002Fcode>: \u003Ccode>profile\u003C\u002Fcode>, \u003Ccode>countryPacks\u003C\u002Fcode> (leading pack first), \u003Ccode>locale\u003C\u002Fcode>, \u003Ccode>option($key)\u003C\u002Fcode> (e.g. \u003Ccode>option('syntax')\u003C\u002Fcode> with the \u003Ccode>Syntax\u003C\u002Fcode> that will be written), \u003Ccode>profileIs(...$keys)\u003C\u002Fcode>, \u003Ccode>leadingCountry()\u003C\u002Fcode>, \u003Ccode>hasCountry($code)\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Messages:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>They come from the catalog key \u003Ccode>{namespace}::rules.{code}\u003C\u002Fcode> with the entries \u003Ccode>message\u003C\u002Fcode> and \u003Ccode>hint\u003C\u002Fcode>, in the validation locale or English. Without an entry, the English \u003Ccode>$fallback\u003C\u002Fcode> is used.\u003C\u002Fli>\n\u003Cli>\u003Ccode>:name\u003C\u002Fcode> placeholders are replaced from \u003Ccode>$replace\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Use the namespace \u003Ccode>quittio-{code}\u003C\u002Fcode> that registration gives your \u003Ccode>translationPath()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The rules of a pack run in every format, also for a plain PDF. Profile specific rules belong to a profile class (see \u003Ca href=\"\u002Fdocs\u002Fformats\">Formats and profiles\u003C\u002Fa>). See \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa> for levels and results.\u003C\u002Fp>\n\u003Ch3 id=\"format-rules-of-your-pack\">Format rules of your pack\u003Ca class=\"q-doc-anchor\" href=\"#format-rules-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Core\\Formats\\FormatRule::resolve(InvoiceData $invoice): ?FormatChoice\u003C\u002Fcode> returns a \u003Ccode>FormatChoice(string $format, ?string $profile = null, ?string $reason = null)\u003C\u002Fcode> or null.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Rules run in order; the first non-null choice wins.\u003C\u002Fli>\n\u003Cli>The resolver consults the leading pack for domestic invoices and the buyer's pack for cross-border invoices to businesses.\u003C\u002Fli>\n\u003Cli>An explicit format always wins.\u003C\u002Fli>\n\u003Cli>A choice of \u003Ccode>zugferd\u003C\u002Fcode> or \u003Ccode>cii\u003C\u002Fcode> is upgraded to EXTENDED when EXTENDED features are used.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"formats-of-your-pack\">Formats of your pack\u003Ca class=\"q-doc-anchor\" href=\"#formats-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>AbstractCountryPack\u003C\u002Fcode> implements \u003Ccode>Quittio\\Core\\Countries\\Capabilities\\ProvidesFormats\u003C\u002Fcode> with empty defaults. \u003Ccode>Quittio::registerCountry()\u003C\u002Fcode> registers what a pack returns:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>formats()\u003C\u002Fcode>: \u003Ccode>list&lt;OutputFormat&gt;\u003C\u002Fcode>, e.g. a national format with its syntax and allowed profiles; a format with the key of a registered one replaces it.\u003C\u002Fli>\n\u003Cli>\u003Ccode>formatAliases()\u003C\u002Fcode>: further names, e.g. \u003Ccode>['xrechnung' =&gt; 'xrechnung-cii']\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>serializers()\u003C\u002Fcode>: \u003Ccode>list&lt;XmlSerializer&gt;\u003C\u002Fcode> for syntaxes the core does not write; a serializer replaces the one of its syntax.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Germany brings XRechnung this way (\u003Ccode>Quittio\\Country\\DE\\Formats\\XRechnungFormats\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3 id=\"capabilities-of-your-profiles\">Capabilities of your profiles\u003Ca class=\"q-doc-anchor\" href=\"#capabilities-of-your-profiles\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Profiles declare what they can transmit with interfaces in \u003Ccode>Quittio\\Core\\Profiles\\Capabilities\u003C\u002Fcode>, instead of the core checking profile keys:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Capability\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SupportsSubLines\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">sub lines are allowed (no \u003Ccode>QUITTIO-PROFILE-SUBLINES\u003C\u002Fcode>) and the invoice is not upgraded to EXTENDED\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SupportsExtensionFields\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>extensions()\u003C\u002Fcode> names the extensions whose fields the profile carries, e.g. \u003Ccode>['xrechnung']\u003C\u002Fcode> for the fields of \u003Ccode>XRechnungExtensionData\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>SupportsThirdPartyPayments\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">UBL invoices of the profile may carry third party payments (BG-DEX-09)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DescribesEmbeddedXml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">XMP description and version of the embedded XML\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ReplacesRules\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>replacedRules(?Syntax $syntax)\u003C\u002Fcode> names built-in rules the profile replaces with its own; the PHP rules driver does not run them for the profile\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>RequiresVatBreakdownRate\u003C\u002Fcode>, \u003Ccode>StructuredCashDiscountText\u003C\u002Fcode>, \u003Ccode>ExtendsCodeLists\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">rate in every VAT breakdown, structured cash discount texts, additional codes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"builder-macros-of-your-pack\">Builder macros of your pack\u003Ca class=\"q-doc-anchor\" href=\"#builder-macros-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A pack that offers builder helpers registers one macro named after its code, which returns an object with the helpers: \u003Ccode>InvoiceBuilder::macro('at', fn () =&gt; new AustrianInvoice($this))\u003C\u002Fcode>, used as \u003Ccode>-&gt;at()-&gt;…\u003C\u002Fcode>. Germany uses \u003Ccode>-&gt;de()\u003C\u002Fcode> (\u003Ca href=\"#germany-quittiocountry-de\">\u003Ccode>GermanInvoice\u003C\u002Fcode>\u003C\u002Fa>). Ship an IDE stub for the macro, as \u003Ccode>packages\u002Fcountry-de\u002Fstubs\u002FInvoiceBuilder.stub.php\u003C\u002Fcode> does.\u003C\u002Fp>\n\u003Ch3 id=\"other-hooks-of-your-pack\">Other hooks of your pack\u003Ca class=\"q-doc-anchor\" href=\"#other-hooks-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>\u003Ccode>paymentQr()\u003C\u002Fcode>: a \u003Ccode>Quittio\\Core\\Pdf\\Qr\\PaymentQrGenerator\u003C\u002Fcode> (\u003Ccode>key()\u003C\u002Fcode>, \u003Ccode>supports(InvoiceData)\u003C\u002Fcode>, \u003Ccode>payload(InvoiceData, array $options = []): ?string\u003C\u002Fcode>) for the QR mode \u003Ccode>auto\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>addressFormatter()\u003C\u002Fcode>: a \u003Ccode>Quittio\\Core\\View\\AddressFormatter\u003C\u002Fcode> (\u003Ccode>format(Address $address, array $nameLines = [], ?string $senderCountry = null, ?string $locale = null): list&lt;string&gt;\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>profiles()\u003C\u002Fcode>: national profiles, usually extending \u003Ccode>Quittio\\Core\\Profiles\\AbstractProfile\u003C\u002Fcode>. They are registered with the pack.\u003C\u002Fli>\n\u003Cli>\u003Ccode>referenceRates()\u003C\u002Fcode> (capability \u003Ccode>ProvidesReferenceRates\u003C\u002Fcode>): the reference interest rate of the late payment law, so that \u003Ccode>Quittio\\Core\\Dunning\\DefaultInterest::forCountry($pack)\u003C\u002Fcode> calculates default interest (\u003Ca href=\"#dunninglaw\">DunningLaw\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>\u003Ccode>complete()\u003C\u002Fcode> (capability \u003Ccode>CompletesInvoices\u003C\u002Fcode>): adds what the law of the country expects to an invoice before it is rendered, e.g. a notice for consumers. It receives the settings of the pack (\u003Ccode>quittio.countries.{code}\u003C\u002Fcode>, core: \u003Ccode>Quittio::create(['countries' =&gt; ['{code}' =&gt; [...]]])\u003C\u002Fcode>). Germany adds the default notice for consumers (\u003Ca href=\"#default-notice-for-consumers\">Default notice for consumers\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"settings-of-your-pack\">Settings of your pack\u003Ca class=\"q-doc-anchor\" href=\"#settings-of-your-pack\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A pack that needs settings in Laravel (rates, credentials of a national portal, …) keeps them under \u003Ccode>quittio.countries.{code}\u003C\u002Fcode> with its lower-case code, as the German pack does with \u003Ccode>quittio.countries.de\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration#settings-of-a-pack-quittiocountriescode\">Configuration\u003C\u002Fa>). Do not add a top-level configuration such as \u003Ccode>quittio-at\u003C\u002Fcode>. In the pack's service provider:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">namespace\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> Acme\\CountryAT\\Laravel\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Illuminate\\Support\\ServiceProvider\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">final\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> AustriaServiceProvider\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> ServiceProvider\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> register\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> void\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#8B949E\">        \u002F\u002F Defaults; the keys of config\u002Fquittio\u002Fcountries\u002Fat.php or of 'countries' => ['at' => […]] win.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#79C0FF\">        $this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">mergeConfigFrom\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">__DIR__\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'\u002F..\u002F..\u002Fconfig\u002Fcountries\u002Fat.php'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio.countries.at'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> boot\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> void\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">app\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">runningInConsole\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#8B949E\">            \u002F\u002F quittio:install publishes every tag quittio-{code}-config.\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#79C0FF\">            $this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">publishes\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">__DIR__\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'\u002F..\u002F..\u002Fconfig\u002Fcountries\u002Fat.php'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> $this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">app\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">configPath\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio\u002Fcountries\u002Fat.php'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)], \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio-at-config'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>Ship the defaults as \u003Ccode>config\u002Fcountries\u002F{code}.php\u003C\u002Fcode> and publish them to \u003Ccode>config\u002Fquittio\u002Fcountries\u002F{code}.php\u003C\u002Fcode>; Laravel loads that file as \u003Ccode>quittio.countries.{code}\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Name the publish tag \u003Ccode>quittio-{code}-config\u003C\u002Fcode>, so that \u003Ccode>php artisan quittio:install\u003C\u002Fcode> publishes it with \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Read the settings with \u003Ccode>config('quittio.countries.at.…')\u003C\u002Fcode>, and only in Laravel code (the service provider, commands); the pack class itself takes its values as constructor arguments or through \u003Ccode>Quittio\\Core\u003C\u002Fcode> contracts, so it works without Laravel.\u003C\u002Fli>\n\u003Cli>Declare the provider in \u003Ccode>composer.json\u003C\u002Fcode> (\u003Ccode>extra.laravel.providers\u003C\u002Fcode>), as \u003Ccode>quittio\u002Fcountry-de\u003C\u002Fcode> does with \u003Ccode>GermanyServiceProvider\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"the-countrypack-contract\">The \u003Ccode>CountryPack\u003C\u002Fcode> contract\u003Ca class=\"q-doc-anchor\" href=\"#the-countrypack-contract\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Every method of \u003Ccode>Quittio\\Core\\Countries\\CountryPack\u003C\u002Fcode>, its default in \u003Ccode>AbstractCountryPack\u003C\u002Fcode> and where Quittio uses it:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Returns\u003C\u002Fth>\n\u003Cth>Default in \u003Ccode>AbstractCountryPack\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>Used by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>code()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">ISO 3166-1 alpha-2 code, e.g. \u003Ccode>DE\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">– (abstract)\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">registry key, translation namespace \u003Ccode>quittio-{code}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaults()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#countrydefaults\">\u003Ccode>CountryDefaults\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>new CountryDefaults\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">locale fallback, paper size, default letter layout\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>taxPresets()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>TaxPresetCollection\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">empty\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">lookup of presets by key; presets are never applied automatically\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>rules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;Rule&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">validation, when the pack leads\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>buyerCountryRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;Rule&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">validation, when the pack is the buyer's pack of a cross-border invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profiles()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;Profile&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">profile registry (national CIUS, i.e. national rule sets on top of EN 16931 such as XRechnung)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formatRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;FormatRule&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">automatic format choice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mandatoryOutput(InvoiceData $invoice)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#mandatory-output\">\u003Ccode>MandatoryFieldList\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">empty\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">mandatory field guard (leading pack only)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>legalTexts()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#legaltextcatalog\">\u003Ccode>LegalTextCatalog\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">empty\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">the pack's own helpers and your code; Quittio itself does not read it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>numberingRules()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#numberingrules\">\u003Ccode>NumberingRules\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>new NumberingRules\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">Managed numbering\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>retention()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#retentionrule\">\u003Ccode>RetentionRule\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>new RetentionRule(10)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">Managed retention\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>dunningLaw()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#dunninglaw\">\u003Ccode>DunningLaw\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>new DunningLaw\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>Dunning\\DefaultInterest::forCountry()\u003C\u002Fcode>; reminders take fees and interest explicitly\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>correctionPolicy()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ca href=\"#correctionpolicy\">\u003Ccode>CorrectionPolicy\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>new CorrectionPolicy\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>Quittio::cancellation()\u003C\u002Fcode>, Managed corrections\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paymentQr()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>?PaymentQrGenerator\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">payment QR code of the QR mode \u003Ccode>auto\u003C\u002Fcode>, after a generator registered with \u003Ccode>setPaymentQrGenerator()\u003C\u002Fcode> and unless \u003Ccode>CountryDefaults::$paymentQr\u003C\u002Fcode> is \u003Ccode>none\u003C\u002Fcode>; null falls back to the EPC GiroCode for \u003Ccode>girocode\u003C\u002Fcode> (see \u003Ca href=\"#countrydefaults\">\u003Ccode>CountryDefaults\u003C\u002Fcode>\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addressFormatter()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>AddressFormatter\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>InternationalAddressFormatter\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">address lines of the view model\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>letterLayouts()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>array&lt;string, LetterLayout&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>['free' =&gt; LetterLayout::free()]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">position of the address field and marks\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>exporters()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;Exporter&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">declared for accounting exports of the Managed layer (\u003Ccode>Exporter::key()\u003C\u002Fcode>); not read in this release\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>readers()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>list&lt;FormatReader&gt;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">readers for national formats. \u003Ccode>read()\u003C\u002Fcode>, \u003Ccode>readFile()\u003C\u002Fcode> and \u003Ccode>validateFile()\u003C\u002Fcode> try them after the built-in CII and UBL readers, for every registered pack.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Optional capabilities (the interface gets new methods only in a major release, new abilities come as capabilities):\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Capability\u003C\u002Fth>\n\u003Cth>Methods\u003C\u002Fth>\n\u003Cth>Default in \u003Ccode>AbstractCountryPack\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>Used by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Capabilities\\ProvidesFormats\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Methods\">\u003Ccode>formats()\u003C\u002Fcode>, \u003Ccode>formatAliases()\u003C\u002Fcode>, \u003Ccode>serializers()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">implemented, empty\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>Quittio::registerCountry()\u003C\u002Fcode> (\u003Ca href=\"#formats-of-your-pack\">Formats of your pack\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Capabilities\\ProvidesReferenceRates\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Methods\">\u003Ccode>referenceRates(): Dunning\\ReferenceRates\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">not implemented\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>Dunning\\DefaultInterest::forCountry()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Capabilities\\CompletesInvoices\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Methods\">\u003Ccode>complete(InvoiceData $invoice, array $settings): InvoiceData\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">not implemented\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">the render pipeline, for the leading pack, before calculation and validation; \u003Ccode>$settings\u003C\u002Fcode> are \u003Ccode>Config::$countrySettings[code]\u003C\u002Fcode> (\u003Ccode>quittio.countries.{code}\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>translationPath()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Methods\">\u003Ccode>?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default in AbstractCountryPack\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">directory with \u003Ccode>{locale}\u002F{group}.php\u003C\u002Fcode> files, registered as namespace \u003Ccode>quittio-{code}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"countrydefaults\">CountryDefaults\u003Ca class=\"q-doc-anchor\" href=\"#countrydefaults\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>new CountryDefaults(currency: 'EUR', timezone: 'UTC', locale: 'en', paper: 'A4', letterLayout: 'free', profile: 'en16931', requiredLocales: [], paymentQr: 'girocode', vatPreset: null, smallBusinessVatPreset: null)\u003C\u002Fcode>\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>en\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Last fallback for the render and validation locale: run option, invoice locale (\u003Ccode>-&gt;locale()\u003C\u002Fcode>), \u003Ccode>quittio.defaults.locale\u003C\u002Fcode>, then this value.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paper\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>A4\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Paper size unless the presentation or \u003Ccode>pdf.paper\u003C\u002Fcode> sets one.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>letterLayout\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>free\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Key of \u003Ccode>letterLayouts()\u003C\u002Fcode> used when the presentation sets none (\u003Ccode>pdf.layout\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>currency\u003C\u002Fcode>, \u003Ccode>profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>EUR\u003C\u002Fcode>, \u003Ccode>en16931\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Shown by \u003Ccode>quittio:countries\u003C\u002Fcode>; not applied to invoices.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>timezone\u003C\u002Fcode>, \u003Ccode>requiredLocales\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>UTC\u003C\u002Fcode>, \u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Informational metadata for applications; not applied by the core. Set the time zone of dates with \u003Ccode>-&gt;timezone()\u003C\u002Fcode> on the builder.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paymentQr\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>girocode\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">What the QR mode \u003Ccode>auto\u003C\u002Fcode> prints when no generator is registered with \u003Ccode>setPaymentQrGenerator()\u003C\u002Fcode>: \u003Ccode>girocode\u003C\u002Fcode> = the pack's \u003Ccode>paymentQr()\u003C\u002Fcode> generator, otherwise the EPC GiroCode; \u003Ccode>none\u003C\u002Fcode> = no code; another type (e.g. \u003Ccode>swiss-qr-bill\u003C\u002Fcode>) = the pack's generator, otherwise no code. See \u003Ca href=\"\u002Fdocs\u002Ftemplates#payment-qr-codes\">Templates: payment QR codes\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>vatPreset\u003C\u002Fcode>, \u003Ccode>smallBusinessVatPreset\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>, \u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Keys of presets of \u003Ccode>taxPresets()\u003C\u002Fcode> for invoice lines without VAT treatment: the usual rate, and the rate of small business invoices (\u003Ccode>Meta::FLAG_SMALL_BUSINESS\u003C\u002Fcode>). Used by \u003Ccode>CountryDefaultVat\u003C\u002Fcode> for the seller's country (\u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#default-vat\">Default VAT\u003C\u002Fa>). Germany: \u003Ccode>de.standard\u003C\u002Fcode> and \u003Ccode>de.small_business\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"correctionpolicy\">CorrectionPolicy\u003Ca class=\"q-doc-anchor\" href=\"#correctionpolicy\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The default handling of cancellations and corrections (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#cancellations-and-corrections\">Managed: cancellations and corrections\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Member\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CANCELLATION_CREDIT_NOTE\u003C\u002Fcode> = \u003Ccode>credit_note\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">cancel with type code 381 and positive amounts\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CANCELLATION_NEGATIVE_INVOICE\u003C\u002Fcode> = \u003Ccode>negative_invoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">cancel with type code 380 and negative amounts\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CORRECTION_CANCEL_AND_REISSUE\u003C\u002Fcode> = \u003Ccode>cancel_and_reissue\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">correct by cancelling and issuing a new invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>CORRECTION_CORRECTED_INVOICE\u003C\u002Fcode> = \u003Ccode>corrected_invoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">correct with a corrected invoice (type code 384)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>__construct(string $cancellationStrategy = 'credit_note', string $correctionStrategy = 'cancel_and_reissue', array $titles = [])\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">\u003Ccode>$titles\u003C\u002Fcode>: document kind =&gt; [locale =&gt; title]\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>title(string $kind, string $locale = 'en'): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">title in the locale, else English, else null\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cancellationTitle(bool $selfBilled, string $locale = 'en'): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">\u003Ccode>cancellation_self_billed\u003C\u002Fcode> for self-billed originals if defined, otherwise \u003Ccode>cancellation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The kinds Quittio reads:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>cancellation\u003C\u002Fcode> and \u003Ccode>cancellation_self_billed\u003C\u002Fcode>: the title of \u003Ccode>Quittio::cancellation()\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>\u003Ccode>correction\u003C\u002Fcode>: the title of a Managed corrected invoice;\u003C\u002Fli>\n\u003Cli>\u003Ccode>self_billed\u003C\u002Fcode>: the PDF\u002FHTML title and file name of self-billed invoices, after a title set in the presentation.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The sign strategy of a cancellation comes from the call, then \u003Ccode>quittio.corrections.cancellation_strategy\u003C\u002Fcode>, then the pack. The correction strategy comes from \u003Ccode>quittio-managed.correction.strategy\u003C\u002Fcode>, then the pack.\u003C\u002Fp>\n\u003Ch3 id=\"dunninglaw\">DunningLaw\u003Ca class=\"q-doc-anchor\" href=\"#dunninglaw\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Statutory late payment values; amounts and percentage points are decimal strings.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>b2bInterestPoints\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>8.00\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">points above the reference rate for business debtors\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>b2cInterestPoints\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>0.00\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">points above the reference rate for consumers\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>b2bFlatRate\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>40.00\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">flat rate for business debtors (null = none)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>dayCount\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>365\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">day count basis: 365, 360 or \u003Ccode>null\u003C\u002Fcode> for actual\u002Factual (Germany)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>consumerDefaultAfterDays\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">days after which a consumer is in default\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>referenceRateName\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">name of the reference rate\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>b2cFixedRate\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">fixed rate in percent for consumers instead of the reference rate plus \u003Ccode>b2cInterestPoints\u003C\u002Fcode>, e.g. \u003Ccode>4.00\u003C\u002Fcode> in Austria (section 1000 (1) ABGB); \u003Ccode>DefaultInterest\u003C\u002Fcode> then charges it for the whole time\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>b2bFixedRate\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">fixed rate in percent for business debtors instead of the reference rate plus \u003Ccode>b2bInterestPoints\u003C\u002Fcode>, e.g. \u003Ccode>5.00\u003C\u002Fcode> in Switzerland (Art. 104 OR)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Quittio's documents do not read these values. \u003Ccode>Quittio\\Core\\Dunning\\DefaultInterest\u003C\u002Fcode> calculates default interest from them and the reference rates of a pack that implements \u003Ccode>Countries\\Capabilities\\ProvidesReferenceRates\u003C\u002Fcode> (\u003Ccode>referenceRates(): Dunning\\ReferenceRates\u003C\u002Fcode> with \u003Ccode>rateOn()\u003C\u002Fcode> and \u003Ccode>periods()\u003C\u002Fcode>): \u003Ccode>DefaultInterest::forCountry($pack)-&gt;calculate($amount, $from, $until)\u003C\u002Fcode>. A pack without reference rates works only when its law fixes both rates (\u003Ccode>DunningLaw::hasFixedRates()\u003C\u002Fcode>, e.g. Switzerland); otherwise \u003Ccode>forCountry()\u003C\u002Fcode> throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>. Germany provides the Basiszinssatz this way (\u003Ca href=\"#default-interest\">\u003Ccode>DefaultInterest\u003C\u002Fcode>\u003C\u002Fa>); a pack of another country implements \u003Ccode>ReferenceRates\u003C\u002Fcode>, e.g. for the ECB main refinancing rate, on top of \u003Ccode>Quittio\\Core\\Support\\DatedValues\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"numberingrules\">NumberingRules\u003Ca class=\"q-doc-anchor\" href=\"#numberingrules\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Used by Managed numbering (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#numbering\">Managed: numbering\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaultPattern\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>INV-{Y}-{seq:4}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">pattern when neither the issuer nor the configuration sets one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaultReset\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>yearly\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">reset when none is configured\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>allowedResets\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>['never', 'yearly', 'monthly']\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">other resets are rejected with a \u003Ccode>ConfigurationException\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>gapless\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">declared; not read in this release (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#gapless-numbers\">gapless numbers\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>numberConsumedOnRejection\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">declared; not read in this release\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"retentionrule\">RetentionRule\u003Ca class=\"q-doc-anchor\" href=\"#retentionrule\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>new RetentionRule(int $years, bool $fromEndOfCalendarYear = true)\u003C\u002Fcode>. \u003Ccode>until(Date $issueDate): Date\u003C\u002Fcode> returns the last day of the retention period: 31 December of the issue year plus \u003Ccode>$years\u003C\u002Fcode>, or, with \u003Ccode>fromEndOfCalendarYear: false\u003C\u002Fcode>, the issue date plus \u003Ccode>$years\u003C\u002Fcode>. The Managed layer stores this date with every issued invoice; \u003Ccode>quittio-managed.retention.years\u003C\u002Fcode> may only lengthen it.\u003C\u002Fp>\n\u003Ch3 id=\"legaltextcatalog\">LegalTextCatalog\u003Ca class=\"q-doc-anchor\" href=\"#legaltextcatalog\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>new LegalTextCatalog(array $texts = [], string $fallbackLocale = 'en')\u003C\u002Fcode> with \u003Ccode>$texts\u003C\u002Fcode> as key =&gt; [locale =&gt; text].\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>has(string $key): bool\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>get(string $key, ?string $locale = null, array $replace = []): ?string\u003C\u002Fcode>: the text in \u003Ccode>$locale\u003C\u002Fcode>, else in the fallback locale, else the first variant; null for unknown keys. \u003Ccode>:name\u003C\u002Fcode> placeholders are replaced from \u003Ccode>$replace\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"mandatory-output\">Mandatory output\u003Ca class=\"q-doc-anchor\" href=\"#mandatory-output\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>mandatoryOutput()\u003C\u002Fcode> names values the rendered PDF must show for one invoice, in addition to the base fields every PDF needs. After rendering, the mandatory field guard checks that the template printed them (see \u003Ca href=\"\u002Fdocs\u002Ftemplates#mandatory-field-guard\">Templates: mandatory field guard\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>new MandatoryField(string $accessKey, string $description, ?string $legalBasis = null)\u003C\u002Fcode>. The access key is a view model path:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>|\u003C\u002Fcode> separates alternatives, \u003Ccode>&amp;\u003C\u002Fcode> combines paths that must all be printed;\u003C\u002Fli>\n\u003Cli>\u003Ccode>[*]\u003C\u002Fcode> stands for every index, e.g. \u003Ccode>vatRows[*].amount\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>a path counts only where the view model has a value: null values and empty lists are not required, and a field whose alternatives all have no value is skipped.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ccode>MandatoryFieldList::merge()\u003C\u002Fcode> combines two lists; for equal access keys the later field wins. \u003Ccode>MandatoryFieldGuard::notePath($invoice, $matches)\u003C\u002Fcode> returns the view model path of the first note that matches a callback (\u003Ccode>legalNotes[i]\u003C\u002Fcode> for regulatory, legal and tax notes, \u003Ccode>notes[i].content|notes[i].html\u003C\u002Fcode> otherwise), so that a pack can require a specific note.\u003C\u002Fp>\n\u003Ch3 id=\"letter-layouts\">Letter layouts\u003Ca class=\"q-doc-anchor\" href=\"#letter-layouts\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>letterLayouts()\u003C\u002Fcode> returns \u003Ccode>Quittio\\Core\\View\\LetterLayout\u003C\u002Fcode> objects by name. \u003Ccode>CountryDefaults::$letterLayout\u003C\u002Fcode> names the default; the presentation property \u003Ccode>letterLayout\u003C\u002Fcode> (Laravel: \u003Ccode>pdf.layout\u003C\u002Fcode>) selects another one. \u003Ccode>free\u003C\u002Fcode> is always available; an unknown name throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>. Values are millimetres from the top left corner of the first page:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Property\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">layout key\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addressTop\u003C\u002Fcode>, \u003Ccode>addressLeft\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">45.0, 20.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">position of the address field\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addressWidth\u003C\u002Fcode>, \u003Ccode>addressHeight\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">85.0, 45.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">size of the address field\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>senderLineHeight\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">5.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">height of the sender line above the recipient\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>addressZoneTop\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">17.7\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">distance of the recipient address from the top of the field\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>foldMarks\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">distances of the fold marks from the top edge\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>punchMark\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">null\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">distance of the punch mark\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>letterheadHeight(float $pageMarginTop)\u003C\u002Fcode> returns the space above the address field: \u003Ccode>addressTop\u003C\u002Fcode> minus the top page margin (15 mm on the first page in the default templates). See \u003Ca href=\"\u002Fdocs\u002Ftemplates#letter-layouts\">Templates: letter layouts\u003C\u002Fa> for how the default templates use them; the German layouts are in \u003Ca href=\"#din-5008-letter-layouts\">DIN 5008 letter layouts\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"vatterritory\">VatTerritory\u003Ca class=\"q-doc-anchor\" href=\"#vatterritory\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Core\\Countries\\VatTerritory\u003C\u002Fcode> tells the EU VAT territory (Art. 5 to 7 of Directive 2006\u002F112\u002FEC) from a country code and a postcode. The format resolver, the German rules and the core plausibility checks use it; packs can use it in their own rules.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method \u002F constant\u003C\u002Fth>\n\u003Cth>Result\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>EU_MEMBER_STATES\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the 27 member states (Greece is \u003Ccode>GR\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>NORTHERN_IRELAND\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">\u003Ccode>XI\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>vatCountry(string $country): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">the country whose VAT territory a country belongs to: \u003Ccode>MC\u003C\u002Fcode> → \u003Ccode>FR\u003C\u002Fcode>, \u003Ccode>IM\u003C\u002Fcode> → \u003Ccode>GB\u003C\u002Fcode>, \u003Ccode>EL\u003C\u002Fcode> → \u003Ccode>GR\u003C\u002Fcode>; outside the EU \u003Ccode>LI\u003C\u002Fcode> → \u003Ccode>CH\u003C\u002Fcode> (one area of application of the Swiss and Liechtenstein VAT)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>isEuMemberState(string $country): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">member state after \u003Ccode>vatCountry()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>excludedTerritory(string $country, ?string $postcode): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">name of an excluded territory the address lies in, or null\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>isEuVatTerritory(string $country, ?string $postcode = null, bool $goods = true): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">address inside the EU VAT territory\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>memberState(string $country, ?string $postcode = null, bool $goods = true): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">member state of the address (\u003Ccode>XI\u003C\u002Fcode> for Northern Ireland and goods), null outside\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>sameVatTerritory(string $country, ?string $postcode, string $otherCountry, ?string $otherPostcode): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">same VAT territory, e.g. \u003Ccode>FR\u003C\u002Fcode> and \u003Ccode>MC\u003C\u002Fcode>, but not \u003Ccode>DE\u003C\u002Fcode> and Büsingen\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>isNorthernIreland(string $country, ?string $postcode = null): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">\u003Ccode>XI\u003C\u002Fcode>, or \u003Ccode>GB\u003C\u002Fcode> with a \u003Ccode>BT\u003C\u002Fcode> postcode\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>memberStateOfVatId(string $vatId): ?string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Result\">member state of a VAT identifier prefix (\u003Ccode>EL\u003C\u002Fcode> → \u003Ccode>GR\u003C\u002Fcode>, \u003Ccode>XI\u003C\u002Fcode> stays \u003Ccode>XI\u003C\u002Fcode>), null otherwise (also for the prefix \u003Ccode>GR\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Northern Ireland belongs to the territory for goods only (\u003Ccode>$goods = false\u003C\u002Fcode> excludes it). Territories that are excluded and recognised by postcode:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Germany: Büsingen am Hochrhein (78266) and Heligoland (27498);\u003C\u002Fli>\n\u003Cli>Spain: the Canary Islands (35xxx, 38xxx), Ceuta (51xxx) and Melilla (52xxx);\u003C\u002Fli>\n\u003Cli>Italy: Livigno (23041) and Campione d'Italia (22061);\u003C\u002Fli>\n\u003Cli>Finland: the Åland Islands (22xxx);\u003C\u002Fli>\n\u003Cli>Greece: Mount Athos (63086);\u003C\u002Fli>\n\u003Cli>France: the overseas territories (97xxx, 981xx to 989xx; Monaco 980xx stays France).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Territories without a distinct postcode (e.g. the part of Cyprus not controlled by the government) cannot be detected.\u003C\u002Fp>\n",[111,115,119,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188,190,193,196,199,202,205,208,211,214,217,220,223,226,229,232,235,238,241,244,247],{"id":112,"text":113,"level":114},"germany-quittiocountry-de","Germany (quittio\u002Fcountry-de)",2,{"id":116,"text":117,"level":118},"tax-presets","Tax presets",3,{"id":120,"text":121,"level":118},"small-businesses","Small businesses",{"id":123,"text":124,"level":118},"reverse-charge-intra-community-supplies-and-vat-identifiers","Reverse charge, intra-community supplies and VAT identifiers",{"id":126,"text":127,"level":118},"format-choice","Format choice",{"id":129,"text":130,"level":118},"xrechnung-profiles","XRechnung profiles",{"id":132,"text":133,"level":118},"xrechnung-rules","XRechnung rules",{"id":135,"text":136,"level":118},"small-amount-invoices","Small amount invoices",{"id":138,"text":139,"level":118},"builder-macros","Builder macros",{"id":141,"text":142,"level":118},"self-billing-gutschrift","Self-billing (Gutschrift)",{"id":144,"text":145,"level":118},"cancellations-and-corrections","Cancellations and corrections",{"id":147,"text":148,"level":118},"dunning-law","Dunning law",{"id":150,"text":151,"level":118},"din-5008-letter-layouts","DIN 5008 letter layouts",{"id":153,"text":154,"level":118},"ustg-rules","UStG rules",{"id":156,"text":157,"level":118},"mandatory-pdf-output","Mandatory PDF output",{"id":159,"text":160,"level":118},"legal-texts","Legal texts",{"id":162,"text":163,"level":118},"meta-flags","Meta flags",{"id":165,"text":166,"level":118},"retention","Retention",{"id":168,"text":169,"level":118},"bmf-error-classes","BMF error classes",{"id":171,"text":172,"level":118},"translations","Translations",{"id":174,"text":175,"level":118},"the-german-packs-hooks","The German pack's hooks",{"id":177,"text":178,"level":118},"known-limitations","Known limitations",{"id":180,"text":181,"level":114},"other-countries","Other countries",{"id":183,"text":184,"level":114},"how-a-pack-is-selected","How a pack is selected",{"id":186,"text":187,"level":114},"registering-packs","Registering packs",{"id":61,"text":189,"level":118},"Laravel",{"id":191,"text":192,"level":118},"without-laravel","Without Laravel",{"id":194,"text":195,"level":114},"writing-your-own-country-pack","Writing your own country pack",{"id":197,"text":198,"level":118},"presets-of-your-pack","Presets of your pack",{"id":200,"text":201,"level":118},"rules-of-your-pack","Rules of your pack",{"id":203,"text":204,"level":118},"format-rules-of-your-pack","Format rules of your pack",{"id":206,"text":207,"level":118},"formats-of-your-pack","Formats of your pack",{"id":209,"text":210,"level":118},"capabilities-of-your-profiles","Capabilities of your profiles",{"id":212,"text":213,"level":118},"builder-macros-of-your-pack","Builder macros of your pack",{"id":215,"text":216,"level":118},"other-hooks-of-your-pack","Other hooks of your pack",{"id":218,"text":219,"level":118},"settings-of-your-pack","Settings of your pack",{"id":221,"text":222,"level":114},"the-countrypack-contract","The CountryPack contract",{"id":224,"text":225,"level":118},"countrydefaults","CountryDefaults",{"id":227,"text":228,"level":118},"correctionpolicy","CorrectionPolicy",{"id":230,"text":231,"level":118},"dunninglaw","DunningLaw",{"id":233,"text":234,"level":118},"numberingrules","NumberingRules",{"id":236,"text":237,"level":118},"retentionrule","RetentionRule",{"id":239,"text":240,"level":118},"legaltextcatalog","LegalTextCatalog",{"id":242,"text":243,"level":118},"mandatory-output","Mandatory output",{"id":245,"text":246,"level":118},"letter-layouts","Letter layouts",{"id":248,"text":249,"level":118},"vatterritory","VatTerritory","https:\u002F\u002Fgithub.com\u002FQuittio\u002Fquittio\u002Fedit\u002Fmaster\u002Fdocs\u002Fcountry-packs.md","\u002Fdocs\u002Fcountry-packs.md",{"slug":70,"title":71},{"slug":76,"title":77}]