[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs:formats":3},{"versions":4,"version":26,"nav":28,"path":46,"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":47,"description":108,"html":109,"headings":110,"editUrl":188,"markdownUrl":189,"prev":190,"next":191},"This page explains what Quittio produces from an invoice: a PDF with embedded XML, XML only, a plain PDF, HTML or JSON.","\u003Ch1 id=\"formats-and-profiles\">Formats and profiles\u003C\u002Fh1>\n\u003Cp>This page explains what Quittio produces from an invoice: a PDF with embedded XML, XML only, a plain PDF, HTML or JSON. It shows how Quittio chooses the output by itself, how you request a specific one, and lists every format and profile with its details.\u003C\u002Fp>\n\u003Cp>If the words format, profile, CII or UBL are new to you, read \u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa> and \u003Ca href=\"\u002Fdocs\u002Fconcepts#profiles\">Profiles\u003C\u002Fa> in the E-invoicing basics first. Field numbers such as BT-10 are explained in \u003Ca href=\"\u002Fdocs\u002Fconcepts#en-16931-and-business-terms\">EN 16931 and business terms\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Two settings decide the output of a render run:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The \u003Cstrong>format\u003C\u002Fstrong> decides what is produced: PDF, XML, HTML or JSON. For XML it also decides the syntax, CII or UBL (\u003Ca href=\"\u002Fdocs\u002Fconcepts#syntaxes-cii-and-ubl\">Syntaxes\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The \u003Cstrong>profile\u003C\u002Fstrong> decides which fields and rules the XML follows, for example EN 16931, XRechnung, Peppol or a Factur-X level.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Storage, downloads, queues and events are described in \u003Ca href=\"\u002Fdocs\u002Flaravel\">Laravel integration\u003C\u002Fa>, all configuration keys in \u003Ca href=\"\u002Fdocs\u002Fconfiguration\">Configuration\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"you-usually-do-not-choose-a-format\">You usually do not choose a format\u003Ca class=\"q-doc-anchor\" href=\"#you-usually-do-not-choose-a-format\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Without \u003Ccode>format()\u003C\u002Fcode>, Quittio chooses format and profile for each invoice. It uses data you provide anyway: the countries of seller and buyer, whether the buyer is a consumer, and the buyer reference. For a German seller:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A business customer gets ZUGFeRD: a PDF that people can read, with the XML for accounting software embedded (profile EN 16931).\u003C\u002Fli>\n\u003Cli>A German public authority gets XRechnung as CII XML. Quittio recognises it by the Leitweg-ID (the routing ID of a German public buyer) in the buyer reference (BT-10).\u003C\u002Fli>\n\u003Cli>A consumer gets a PDF without XML. So do a customer outside the EU and a small amount invoice up to 250 € that you mark with \u003Ccode>-&gt;de()-&gt;smallAmount()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ca href=\"\u002Fdocs\u002Fconcepts#which-format-do-i-need\">Which format do I need?\u003C\u002Fa> shows all cases in a table, \u003Ca href=\"#automatic-choice\">Automatic choice\u003C\u002Fa> the exact rules. The result tells you what Quittio chose:\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:#E6EDF3\">$result \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\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\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 no format: automatic choice\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                                 \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F e.g. \"zugferd\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">?->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">key\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F e.g. \"en16931\"\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\">$prepared \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\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">prepare\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();    \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F the same decision, without rendering\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$prepared\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">format\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                               \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F e.g. \"zugferd\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$prepared\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">profile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">?->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">key\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F e.g. \"en16931\"\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch2 id=\"requesting-a-format\">Requesting a format\u003Ca class=\"q-doc-anchor\" href=\"#requesting-a-format\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>When a customer requires a specific format, name it. Every format has a default profile, so you rarely need \u003Ccode>profile()\u003C\u002Fcode> 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\\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:#8B949E\">\u002F\u002F At the end of the builder chain\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \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\">buyer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($customer)\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 Leitweg-ID, required by 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\">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\">'120.00'\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\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'xrechnung-cii'\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 For invoice data you built before\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \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\">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\">render\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\">$result \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\">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\">'extended'\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>\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 Several formats from one calculation; the first one is the main result\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \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\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">formats\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'zugferd'\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\">render\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\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">as\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\">xml\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>The format keys are listed in \u003Ca href=\"#output-formats\">Output formats\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>Use \u003Ccode>profile()\u003C\u002Fcode> when a recipient asks for a Factur-X level such as \u003Ccode>basic\u003C\u002Fcode>, or for the XRechnung extension. Which profile applies without it is described in \u003Ca href=\"#which-profile-is-used\">Which profile is used\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>To use one format for every invoice, set \u003Ccode>defaults.format\u003C\u002Fcode> in \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (without Laravel: \u003Ccode>format\u003C\u002Fcode>). The default \u003Ccode>null\u003C\u002Fcode> means automatic choice (\u003Ca href=\"#output-configuration\">Output configuration\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>Without Laravel, the same methods exist on \u003Ccode>$quittio-&gt;make($invoice)\u003C\u002Fcode> (\u003Ca href=\"#rendering-in-the-core\">Rendering in the core\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"output-formats\">Output formats\u003Ca class=\"q-doc-anchor\" href=\"#output-formats\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>These are the keys for \u003Ccode>render()\u003C\u002Fcode>, \u003Ccode>format()\u003C\u002Fcode> and \u003Ccode>formats()\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Format\u003C\u002Fth>\n\u003Cth>Aliases\u003C\u002Fth>\n\u003Cth>Syntax\u003C\u002Fth>\n\u003Cth>Output\u003C\u002Fth>\n\u003Cth>Profiles\u003C\u002Fth>\n\u003Cth>Default profile\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>zugferd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">\u003Ccode>factur-x\u003C\u002Fcode>, \u003Ccode>facturx\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">PDF\u002FA-3b with embedded XML (and the XML)\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">every CII profile that can be embedded: \u003Ccode>minimum\u003C\u002Fcode>, \u003Ccode>basic-wl\u003C\u002Fcode>, \u003Ccode>basic\u003C\u002Fcode>, \u003Ccode>en16931\u003C\u002Fcode>, \u003Ccode>extended\u003C\u002Fcode>, \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>en16931\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung-cii\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">\u003Ccode>xrechnung\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">XML\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">\u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>xrechnung\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung-ubl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">XML\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">\u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>xrechnung\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cii\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">XML\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">every CII profile\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>en16931\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ubl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">XML\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">every UBL profile: \u003Ccode>en16931\u003C\u002Fcode>, \u003Ccode>peppol\u003C\u002Fcode>, \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>en16931\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>peppol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">XML according to Peppol BIS Billing 3.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">\u003Ccode>peppol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">\u003Ccode>peppol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">PDF without XML (PDF\u002FA-3b by default; optionally with embedded XML, see \u003Ca href=\"#pdf-html-and-json\">PDF, HTML and JSON\u003C\u002Fa>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>html\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">the rendered template\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Aliases\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Output\">the calculated data model\u003C\u002Ftd>\n\u003Ctd data-label=\"Profiles\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Default profile\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>PDF\u002FA-3b is the archiving standard for PDF (PDF\u002FA) in version 3, which allows embedded files, at conformance level b.\u003C\u002Fp>\n\u003Cp>Format and profile keys are case-insensitive. The profiles \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode> and \u003Ccode>xrechnung-cvd\u003C\u002Fcode> and the formats \u003Ccode>xrechnung-cii\u003C\u002Fcode> and \u003Ccode>xrechnung-ubl\u003C\u002Fcode> come with the German country pack (\u003Ccode>Quittio\\Country\\DE\\Formats\\XRechnungFormats\u003C\u002Fcode>); until 1.0 the core registers the two formats as well. Other country packs register their own formats the same way (\u003Ca href=\"\u002Fdocs\u002Fcountry-packs#writing-your-own-country-pack\">Writing your own country pack\u003C\u002Fa>). MINIMUM and BASIC WL carry no invoice lines and do not comply with EN 16931. The validation warns about them with \u003Ccode>QUITTIO-PROFILE-NOT-EINVOICE\u003C\u002Fcode>; use them only when a recipient asks for them.\u003C\u002Fp>\n\u003Ch2 id=\"automatic-choice\">Automatic choice\u003Ca class=\"q-doc-anchor\" href=\"#automatic-choice\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Without a format, and without a configured \u003Ccode>defaults.format\u003C\u002Fcode>, the class \u003Ccode>Quittio\\Core\\Formats\\DefaultFormatResolver\u003C\u002Fcode> decides.\u003C\u002Fp>\n\u003Cp>It first checks whether the invoice is \u003Cstrong>domestic\u003C\u002Fstrong>: seller and buyer lie in the same VAT territory, or the buyer has no country code. The VAT territory follows VAT law, not the map (\u003Ccode>VatTerritory::sameVatTerritory()\u003C\u002Fcode>). Monaco counts as France, and excluded territories such as Büsingen or Heligoland do not count as domestic.\u003C\u002Fp>\n\u003Cp>Then the first step that applies decides:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>Domestic invoice with a country rule.\u003C\u002Fstrong> The format rules of the leading country pack decide only what the country prescribes (\u003Ca href=\"\u002Fdocs\u002Fcountry-packs#format-choice\">German format choice\u003C\u002Fa>). In Germany:\n\u003Cul>\n\u003Cli>A valid Leitweg-ID in the buyer reference (BT-10), or a buyer electronic address with scheme \u003Ccode>0204\u003C\u002Fcode> → \u003Ccode>xrechnung-cii\u003C\u002Fcode> with profile \u003Ccode>xrechnung\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>A small amount invoice (\u003Ccode>smallAmount()\u003C\u002Fcode>) between parties in Germany's domestic territory under VAT law (the &quot;Inland&quot; of the VAT Act, without Büsingen and Heligoland) → \u003Ccode>pdf\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Everything else goes on to the next steps.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Buyer reachable via Peppol.\u003C\u002Fstrong> A buyer that is not a consumer and is reachable via Peppol → \u003Ccode>peppol\u003C\u002Fcode>. This step needs a \u003Ca href=\"#peppol-lookup\">Peppol lookup\u003C\u002Fa>; without one it is skipped.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Consumer\u003C\u002Fstrong> → \u003Ccode>pdf\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Other domestic invoices\u003C\u002Fstrong> → \u003Ccode>zugferd\u003C\u002Fcode> with the configured profile (default \u003Ccode>en16931\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Cross-border invoice.\u003C\u002Fstrong> The format rules of the buyer's country pack decide first. In Germany a Leitweg-ID leads to XRechnung, whatever the seller's country. A buyer in an excluded territory of the seller's country uses the seller's pack. Without a choice, an invoice within the EU VAT territory → \u003Ccode>zugferd\u003C\u002Fcode> with the configured profile.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Seller or buyer outside the EU VAT territory\u003C\u002Fstrong> → \u003Ccode>pdf\u003C\u002Fcode>, e.g. a US seller invoicing a German business.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>\u003Ccode>prepare()\u003C\u002Fcode> shows the choice without rendering (see the \u003Ca href=\"#you-usually-do-not-choose-a-format\">example above\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"upgrade-to-profile-extended\">Upgrade to profile EXTENDED\u003Ca class=\"q-doc-anchor\" href=\"#upgrade-to-profile-extended\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Some data exists only in the profile EXTENDED: sub lines, \u003Ccode>extended()\u003C\u002Fcode> data and line references. When an invoice uses such data, the profile is upgraded:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The automatic choice \u003Ccode>zugferd\u003C\u002Fcode> or \u003Ccode>cii\u003C\u002Fcode> with another profile gets the profile \u003Ccode>extended\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The same applies to a CII format you request without \u003Ccode>-&gt;profile()\u003C\u002Fcode>, e.g. \u003Ccode>-&gt;format('zugferd')\u003C\u002Fcode>, and to a configured profile. It applies only to formats that allow \u003Ccode>extended\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>A profile you request with \u003Ccode>-&gt;profile()\u003C\u002Fcode> is never changed. The validation reports the data it cannot carry.\u003C\u002Fli>\n\u003Cli>With \u003Ccode>auto_upgrade_profile = false\u003C\u002Fcode> (Laravel \u003Ccode>format_resolver.auto_upgrade_profile\u003C\u002Fcode>), such an invoice fails with a \u003Ccode>ConfigurationException\u003C\u002Fcode> instead.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>XRechnung has no EXTENDED profile. \u003Ccode>-&gt;format('xrechnung-cii')\u003C\u002Fcode> keeps the profile \u003Ccode>xrechnung\u003C\u002Fcode>, and the validation reports the sub lines. To render XRechnung with sub lines, use \u003Ccode>-&gt;format('xrechnung-ubl')-&gt;profile('xrechnung-extension')\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"peppol-lookup\">Peppol lookup\u003Ca class=\"q-doc-anchor\" href=\"#peppol-lookup\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Peppol is an international network for delivering e-invoices (\u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa>). The default resolver chooses \u003Ccode>peppol\u003C\u002Fcode> only when a lookup says that the buyer is reachable there. The lookup is a closure that receives the \u003Ccode>BuyerParty\u003C\u002Fcode> and returns \u003Ccode>true\u003C\u002Fcode> or \u003Ccode>false\u003C\u002Fcode>. Quittio ships no lookup; pass your own resolver:\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\\Party\\BuyerParty\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\\DefaultFormatResolver\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\\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\">($config, [\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:#FFA657\">formatResolver\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> DefaultFormatResolver\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FFA657\">    defaultProfile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'en16931'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FFA657\">    autoUpgradeProfile\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">true\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FFA657\">    peppolLookup\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">BuyerParty\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $buyer)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> bool\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> => $directory\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">isRegistered\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($buyer\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">electronicAddress),\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>In Laravel, name an invokable class in \u003Ccode>format_resolver.peppol_lookup\u003C\u002Fcode>. It is resolved from the container, receives the \u003Ccode>BuyerParty\u003C\u002Fcode> and returns a bool. You can also set a callable at runtime; see \u003Ca href=\"\u002Fdocs\u002Flaravel#peppol-lookup\">Peppol lookup\u003C\u002Fa> in the Laravel integration.\u003C\u002Fp>\n\u003Cp>Country rules come first, but they decide only what the country prescribes (in Germany: public buyers and small amount invoices). Domestic business invoices and cross-border invoices reach the lookup.\u003C\u002Fp>\n\u003Ch3 id=\"own-resolver-and-country-rules\">Own resolver and country rules\u003Ca class=\"q-doc-anchor\" href=\"#own-resolver-and-country-rules\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>To replace the whole choice, write a resolver. It implements \u003Ccode>Quittio\\Core\\Formats\\FormatResolver\u003C\u002Fcode> (\u003Ccode>resolve(InvoiceData $invoice, ResolvedCountries $countries): FormatChoice\u003C\u002Fcode>) and returns a \u003Ccode>FormatChoice(string $format, ?string $profile = null, ?string $reason = null)\u003C\u002Fcode>. A \u003Ccode>null\u003C\u002Fcode> profile uses the default profile of the format. Register it:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>without Laravel with \u003Ccode>Quittio::create(formatResolver: …)\u003C\u002Fcode> or \u003Ccode>$quittio-&gt;setFormatResolver(…)\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>in Laravel with \u003Ccode>Quittio::extend('format_resolver', 'mine', fn ($app, array $config) =&gt; new MyResolver)\u003C\u002Fcode> and \u003Ccode>format_resolver.driver = 'mine'\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A country pack contributes its domestic and buyer rules through \u003Ccode>formatRules()\u003C\u002Fcode>. This is a list of \u003Ccode>Quittio\\Core\\Formats\\FormatRule\u003C\u002Fcode> (\u003Ccode>resolve(InvoiceData $invoice): ?FormatChoice\u003C\u002Fcode>, \u003Ccode>null\u003C\u002Fcode> if the rule does not apply). The first rule that returns a choice wins (\u003Ca href=\"\u002Fdocs\u002Fcountry-packs\">Country packs\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"profiles\">Profiles\u003Ca class=\"q-doc-anchor\" href=\"#profiles\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>A profile is a set of fields and rules based on EN 16931 (\u003Ca href=\"\u002Fdocs\u002Fconcepts#profiles\">Profiles\u003C\u002Fa>). Every profile writes its specification identifier (BT-24) into the XML, so that the recipient knows which rules the invoice follows. Some profiles also set a default business process (BT-23), an identifier of the business context in which the invoice is exchanged.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Key\u003C\u002Fth>\n\u003Cth>Name\u003C\u002Fth>\n\u003Cth>Level\u003C\u002Fth>\n\u003Cth>Syntax\u003C\u002Fth>\n\u003Cth>Specification identifier (BT-24)\u003C\u002Fth>\n\u003Cth>Business process (BT-23) default\u003C\u002Fth>\n\u003Cth>Additionally required\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>minimum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">Factur-X\u002FZUGFeRD MINIMUM\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">MINIMUM\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:factur-x.eu:1p0:minimum\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>basic-wl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">Factur-X\u002FZUGFeRD BASIC WL\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">BASIC WL\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:factur-x.eu:1p0:basicwl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>basic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">Factur-X\u002FZUGFeRD BASIC\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">BASIC\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:factur-x.eu:1p0:basic\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>en16931\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII, UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:cen.eu:en16931:2017\u003C\u002Fcode> (\u003Ccode>…:2026\u003C\u002Fcode> with \u003Ccode>standard(StandardVersion::En16931_2026)\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>extended\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">Factur-X\u002FZUGFeRD EXTENDED\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EXTENDED\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:cen.eu:en16931:2017#conformant#urn:factur-x.eu:1p0:extended\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>peppol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">Peppol BIS Billing 3.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">\u003Ccode>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">Electronic addresses of seller and buyer (BT-34, BT-49); Peppol rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">XRechnung 3.0\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII, UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Business process (BT-23) default\">\u003Ccode>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">Buyer reference (BT-10), electronic addresses of seller and buyer (BT-34, BT-49), seller contact (BG-6), payment instructions (BG-16); BR-DE rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung-extension\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">XRechnung 3.0 Extension\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII, UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\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=\"Business process (BT-23) default\">as XRechnung\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">as XRechnung\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">XRechnung 3.0 CVD\u003C\u002Ftd>\n\u003Ctd data-label=\"Level\">EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Syntax\">CII, UBL\u003C\u002Ftd>\n\u003Ctd data-label=\"Specification identifier (BT-24)\">\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\u003Ctd data-label=\"Business process (BT-23) default\">as XRechnung\u003C\u002Ftd>\n\u003Ctd data-label=\"Additionally required\">as XRechnung, plus contract reference (BT-12), tender or lot reference (BT-17) and a vehicle line; BR-DE-CVD rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Aliases: \u003Ccode>basicwl\u003C\u002Fcode> (basic-wl), \u003Ccode>en-16931\u003C\u002Fcode> and \u003Ccode>comfort\u003C\u002Fcode> (en16931), \u003Ccode>peppol-bis-3\u003C\u002Fcode> (peppol). The default business process is written only when the invoice sets none (\u003Ccode>businessProcess()\u003C\u002Fcode>). The registry is available as \u003Ccode>$quittio-&gt;profiles()\u003C\u002Fcode> (\u003Ccode>get()\u003C\u002Fcode>, \u003Ccode>has()\u003C\u002Fcode>, \u003Ccode>all()\u003C\u002Fcode>, \u003Ccode>register()\u003C\u002Fcode>, \u003Ccode>alias()\u003C\u002Fcode>, \u003Ccode>bySpecificationId()\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Ch3 id=\"which-profile-is-used\">Which profile is used\u003Ca class=\"q-doc-anchor\" href=\"#which-profile-is-used\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The profile of a format is the first of these that applies:\u003C\u002Fp>\n\u003Col>\n\u003Cli>The profile you request with \u003Ccode>profile()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The configured profile (\u003Ccode>profile\u003C\u002Fcode>, Laravel \u003Ccode>defaults.profile\u003C\u002Fcode>), if it fits the format: the format allows it, it exists in the syntax of the format, and it can be embedded into the PDF where the format embeds XML.\u003C\u002Fli>\n\u003Cli>The profile of the automatic choice.\u003C\u002Fli>\n\u003Cli>The default profile of the format.\u003C\u002Fli>\n\u003Cli>\u003Ccode>en16931\u003C\u002Fcode> (\u003Ccode>Quittio::DEFAULT_PROFILE\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>A configured profile therefore applies to \u003Ccode>-&gt;format('zugferd')\u003C\u002Fcode> and to formats chosen by a country rule as well. It is skipped where it does not fit, e.g. \u003Ccode>basic\u003C\u002Fcode> for \u003Ccode>xrechnung-cii\u003C\u002Fcode> or \u003Ccode>peppol\u003C\u002Fcode>. Without a configured profile (\u003Ccode>null\u003C\u002Fcode>, the default) the format or the automatic choice decides. The \u003Ca href=\"#upgrade-to-profile-extended\">upgrade to EXTENDED\u003C\u002Fa> comes on top.\u003C\u002Fp>\n\u003Cp>A run fails with a \u003Ccode>ConfigurationException\u003C\u002Fcode> for:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>an unknown format,\u003C\u002Fli>\n\u003Cli>a profile the format does not allow,\u003C\u002Fli>\n\u003Cli>a profile that is not available in the syntax of the format (e.g. \u003Ccode>peppol\u003C\u002Fcode> in \u003Ccode>zugferd\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>a profile that cannot be embedded into a PDF.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>An unknown profile throws an \u003Ccode>InvalidArgumentException\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"what-each-profile-carries\">What each profile carries\u003Ca class=\"q-doc-anchor\" href=\"#what-each-profile-carries\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The writers leave out every field that the profile does not contain. The validation (level L2, see \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>) reports such fields as warning \u003Ccode>QUITTIO-PROFILE-NOT-ALLOWED\u003C\u002Fcode>. A missing mandatory field of a profile is an error (\u003Ccode>QUITTIO-PROFILE-REQUIRED\u003C\u002Fcode>), and so is data of profile EXTENDED or of the XRechnung extension in another profile. The &quot;Level&quot; column of the \u003Ca href=\"\u002Fdocs\u002Ffield-reference\">field reference\u003C\u002Fa> names the lowest level of every field.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Level\u003C\u002Fth>\n\u003Cth>Contains\u003C\u002Fth>\n\u003Cth>Drops\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>MINIMUM\u003C\u002Ftd>\n\u003Ctd data-label=\"Contains\">Number, issue date, type code, currency, buyer reference, purchase order reference, business process, seller name, legal registration, VAT identifier, tax number and country, buyer name and legal registration, total without VAT, VAT total, total with VAT, amount due\u003C\u002Ftd>\n\u003Ctd data-label=\"Drops\">lines, addresses, VAT breakdown, payment data and everything else\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>BASIC WL\u003C\u002Ftd>\n\u003Ctd data-label=\"Contains\">MINIMUM plus postal addresses, identifiers and electronic addresses of seller and buyer, seller trading name, buyer VAT identifier, tax currency, tax point date, due date, contract, despatch advice and accounting references, payment terms text, notes, preceding invoice, payee, tax representative, delivery, invoicing period, payment means with IBAN and direct debit, document allowances and charges, VAT breakdown, all totals\u003C\u002Ftd>\n\u003Ctd data-label=\"Drops\">invoice lines\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>BASIC\u003C\u002Ftd>\n\u003Ctd data-label=\"Contains\">BASIC WL plus lines: identifier, note, quantity and unit, prices (net, list price, discount, base quantity), VAT, item name and standard identifier, line period, line allowances and charges, line amount\u003C\u002Ftd>\n\u003Ctd data-label=\"Drops\">item description, seller and buyer item numbers, classification, origin country, attributes, line object identifier, order line and accounting references, contacts, seller additional legal information, buyer trading name, supporting documents, project, sales order, receiving advice, tender and invoiced object references, payment means text, card, account name and BIC\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Contains\">everything of EN 16931\u003C\u002Ftd>\n\u003Ctd data-label=\"Drops\">data of profile EXTENDED\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>EXTENDED\u003C\u002Ftd>\n\u003Ctd data-label=\"Contains\">EN 16931 plus sub lines (with parent line identifier and line status), \u003Ccode>ExtendedData\u003C\u002Fcode> and \u003Ccode>LineExtendedData\u003C\u002Fcode>, the exchange rate, cash discounts and late fees as structured elements, several cash discount tiers, instalments, further payment instructions, line references, exemption reasons repeated on line and allowance level\u003C\u002Ftd>\n\u003Ctd data-label=\"Drops\">–\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The UBL profiles (\u003Ccode>en16931\u003C\u002Fcode>, \u003Ccode>peppol\u003C\u002Fcode>, \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>) are on level EN 16931. UBL ignores \u003Ccode>extended()\u003C\u002Fcode> data and writes sub lines only for the XRechnung extension.\u003C\u002Fp>\n\u003Ch3 id=\"capabilities\">Capabilities\u003Ca class=\"q-doc-anchor\" href=\"#capabilities\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Profiles can implement marker interfaces in \u003Ccode>Quittio\\Core\\Profiles\\Capabilities\u003C\u002Fcode> that change how the writers work:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Interface\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003Cth>Implemented by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>RequiresVatBreakdownRate\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">The VAT breakdown always carries a rate, 0 for category O, outside the scope of VAT (BR-DE-14).\u003C\u002Ftd>\n\u003Ctd data-label=\"Implemented by\">\u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>StructuredCashDiscountText\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Cash discounts are written to the payment terms (BT-20) in the XRechnung notation \u003Ccode>#SKONTO#TAGE=…#PROZENT=…#\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#payment-terms\">Payment terms\u003C\u002Fa>).\u003C\u002Ftd>\n\u003Ctd data-label=\"Implemented by\">\u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DescribesEmbeddedXml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>xmpDescription()\u003C\u002Fcode> and \u003Ccode>xmpVersion()\u003C\u002Fcode> replace the XMP metadata of the embedded XML (\u003Ccode>Factur-X\u002FZUGFeRD Invoice\u003C\u002Fcode>, \u003Ccode>fx:Version\u003C\u002Fcode> \u003Ccode>1.0\u003C\u002Fcode>), e.g. \u003Ccode>XRechnung Invoice\u003C\u002Fcode> and \u003Ccode>3.0\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003Ctd data-label=\"Implemented by\">\u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode>, \u003Ccode>xrechnung-cvd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ExtendsCodeLists\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>additionalCodes(string $codeList)\u003C\u002Fcode> adds codes to an official code list for the validation.\u003C\u002Ftd>\n\u003Ctd data-label=\"Implemented by\">\u003Ccode>xrechnung-extension\u003C\u002Fcode> (identifier schemes \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode> for the code lists ICD and EAS, checked by \u003Ccode>BR-DEX-04\u003C\u002Fcode> to \u003Ccode>BR-DEX-08\u003C\u002Fcode>), \u003Ccode>xrechnung-cvd\u003C\u002Fcode> (item classification scheme \u003Ccode>CVD\u003C\u002Fcode> for UNTDID 7143)\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 that the PHP rules driver does not run for the profile, because own rules with other codes replace them.\u003C\u002Ftd>\n\u003Ctd data-label=\"Implemented by\">\u003Ccode>xrechnung-extension\u003C\u002Fcode> (\u003Ccode>BR-CL-10\u003C\u002Fcode>, \u003Ccode>-11\u003C\u002Fcode>, \u003Ccode>-21\u003C\u002Fcode>, \u003Ccode>-25\u003C\u002Fcode>, \u003Ccode>-26\u003C\u002Fcode>; in UBL also \u003Ccode>BR-CO-16\u003C\u002Fcode> and \u003Ccode>QUITTIO-SUBLINES\u003C\u002Fcode>, see \u003Ca href=\"\u002Fdocs\u002Fcountry-packs#xrechnung-rules\">XRechnung rules\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"own-profiles-and-formats\">Own profiles and formats\u003Ca class=\"q-doc-anchor\" href=\"#own-profiles-and-formats\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>A profile implements \u003Ccode>Quittio\\Core\\Profiles\\Profile\u003C\u002Fcode>. \u003Ccode>AbstractProfile\u003C\u002Fcode> provides the defaults: syntax CII, EN 16931:2017 only, embedded as \u003Ccode>factur-x.xml\u003C\u002Fcode> with AFRelationship \u003Ccode>Alternative\u003C\u002Fcode>, EN 16931 compliant, no additional rules. Register a profile in a country pack (\u003Ccode>profiles()\u003C\u002Fcode>) or with \u003Ccode>$quittio-&gt;profiles()-&gt;register(new MyProfile)\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Register a format with \u003Ccode>$quittio-&gt;formats()-&gt;register(new OutputFormat(string $key, ?Syntax $syntax = null, bool $pdf = false, bool $embedsXml = false, ?string $defaultProfile = null, array $profiles = [], bool $html = false, bool $json = false))\u003C\u002Fcode> and an alias with \u003Ccode>alias(string $alias, string $key)\u003C\u002Fcode>. An empty \u003Ccode>$profiles\u003C\u002Fcode> allows every profile of the syntax.\u003C\u002Fp>\n\u003Cp>XML is written by one \u003Ccode>XmlSerializer\u003C\u002Fcode> per syntax (\u003Ccode>syntax(): Syntax\u003C\u002Fcode>, \u003Ccode>serialize(InvoiceData $invoice, Profile $profile, SerializationOptions $options = new SerializationOptions): string\u003C\u002Fcode>). \u003Ccode>$quittio-&gt;addSerializer(…)\u003C\u002Fcode> replaces the CII or UBL writer, in Laravel \u003Ccode>Quittio::extend('serializer', …)\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"zugferd-and-factur-x\">ZUGFeRD and Factur-X\u003Ca class=\"q-doc-anchor\" href=\"#zugferd-and-factur-x\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>ZUGFeRD (Germany) and Factur-X (France) are the same standard: a PDF for people with the CII XML embedded for software (\u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa>). The format \u003Ccode>zugferd\u003C\u002Fcode> produces a PDF\u002FA-3b with the CII XML as associated file, an embedded file that PDF\u002FA-3 links to the document. mPDF, the PHP library that renders the PDF, writes it as PDF\u002FA-3b (\u003Ccode>PDFAversion\u003C\u002Fcode> 3-B). The embedded XML is the same as \u003Ccode>xml()\u003C\u002Fcode> of the run, byte for byte.\u003C\u002Fp>\n\u003Cp>The PDF metadata carry:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the title &quot;{title} {number}&quot;, e.g. &quot;Rechnung RE-2026-0042&quot; (&quot;Rechnung&quot; is the German document title &quot;invoice&quot;),\u003C\u002Fli>\n\u003Cli>the seller as author,\u003C\u002Fli>\n\u003Cli>&quot;Quittio&quot; as creator.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The paper size comes from the presentation, then the option \u003Ccode>paper\u003C\u002Fcode> (Laravel \u003Ccode>pdf.paper\u003C\u002Fcode>), then the country pack (Germany: A4).\u003C\u002Fp>\n\u003Ch3 id=\"embedded-files\">Embedded files\u003Ca class=\"q-doc-anchor\" href=\"#embedded-files\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The name of the embedded file and its AFRelationship depend on the profile. The AFRelationship is a PDF\u002FA-3 entry that says how the file relates to the document. The XMP metadata, the metadata block of the PDF, declare conformance level and version, so that software finds the invoice:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Profile\u003C\u002Fth>\n\u003Cth>File name in the PDF\u003C\u002Fth>\n\u003Cth>AFRelationship\u003C\u002Fth>\n\u003Cth>XMP \u003Ccode>fx:ConformanceLevel\u003C\u002Fcode>\u003C\u002Fth>\n\u003Cth>XMP \u003Ccode>fx:Version\u003C\u002Fcode>\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>BASIC, EN 16931, EXTENDED\u003C\u002Ftd>\n\u003Ctd data-label=\"File name in the PDF\">\u003Ccode>factur-x.xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"AFRelationship\">\u003Ccode>Alternative\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:ConformanceLevel\">\u003Ccode>BASIC\u003C\u002Fcode>, \u003Ccode>EN 16931\u003C\u002Fcode>, \u003Ccode>EXTENDED\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:Version\">\u003Ccode>1.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>MINIMUM, BASIC WL\u003C\u002Ftd>\n\u003Ctd data-label=\"File name in the PDF\">\u003Ccode>factur-x.xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"AFRelationship\">\u003Ccode>Data\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:ConformanceLevel\">\u003Ccode>MINIMUM\u003C\u002Fcode>, \u003Ccode>BASIC WL\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:Version\">\u003Ccode>1.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>XRechnung, XRechnung extension\u003C\u002Ftd>\n\u003Ctd data-label=\"File name in the PDF\">\u003Ccode>xrechnung.xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"AFRelationship\">\u003Ccode>Alternative\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:ConformanceLevel\">\u003Ccode>XRECHNUNG\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"XMP fx:Version\">the XRechnung version, \u003Ccode>3.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The embedded file has the MIME type \u003Ccode>text\u002Fxml\u003C\u002Fcode> and the description &quot;Factur-X\u002FZUGFeRD Invoice&quot; or &quot;XRechnung Invoice&quot;. The XMP metadata contain the Factur-X extension schema (namespace \u003Ccode>urn:factur-x:pdfa:CrossIndustryDocument:invoice:1p0#\u003C\u002Fcode>, prefix \u003Ccode>fx\u003C\u002Fcode>) and its PDF\u002FA extension schema description. The schema carries:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>DocumentType\u003C\u002Fcode> \u003Ccode>INVOICE\u003C\u002Fcode>, also for credit notes,\u003C\u002Fli>\n\u003Cli>\u003Ccode>DocumentFileName\u003C\u002Fcode>, \u003Ccode>Version\u003C\u002Fcode> and \u003Ccode>ConformanceLevel\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Peppol cannot be embedded. XRechnung can: \u003Ccode>-&gt;format('zugferd')-&gt;profile('xrechnung')\u003C\u002Fcode> gives a PDF with \u003Ccode>xrechnung.xml\u003C\u002Fcode> (ZUGFeRD profile XRECHNUNG).\u003C\u002Fp>\n\u003Cp>Supporting documents (\u003Ccode>attachment()\u003C\u002Fcode>, BG-24) are part of the XML, base64 encoded. They are not separate files in the PDF: the PDF carries exactly one associated file.\u003C\u002Fp>\n\u003Ch3 id=\"drafts-and-watermarks\">Drafts and watermarks\u003Ca class=\"q-doc-anchor\" href=\"#drafts-and-watermarks\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Drafts and previews carry a watermark (\u003Ccode>Presentation::$watermark\u003C\u002Fcode>, or the option \u003Ccode>watermark\u003C\u002Fcode>). They never produce e-invoice XML, so that a draft cannot look like an issued e-invoice. A run with a watermark and any format with XML throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>. This covers ZUGFeRD\u002FFactur-X, XRechnung, CII, UBL and Peppol, also next to \u003Ccode>pdf\u003C\u002Fcode> in \u003Ccode>formats([...])\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Watermarked PDFs are plain PDF without embedded XML. They are not PDF\u002FA, because PDF\u002FA forbids the transparency of the watermark (\u003Ca href=\"\u002Fdocs\u002Ftemplates#watermark\">Watermark\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:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($draft)\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\">'pdf'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">option\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'watermark'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'ENTWURF'\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 \"Entwurf\" = draft\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch3 id=\"pdfa-and-logos\">PDF\u002FA and logos\u003Ca class=\"q-doc-anchor\" href=\"#pdfa-and-logos\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>PDF\u002FA is produced for every PDF with embedded XML, and for \u003Ccode>pdf\u003C\u002Fcode> output when \u003Ccode>pdf.pdfa\u003C\u002Fcode> is \u003Ccode>true\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>PDF\u002FA forbids the alpha channel (transparency) that mPDF writes. Logos in PDF\u002FA documents are therefore re-encoded as RGB PNG on white. SVG logos are rasterised with the PHP extension \u003Ccode>imagick\u003C\u002Fcode> and must be self-contained. Without \u003Ccode>imagick\u003C\u002Fcode>, rendering an SVG logo fails with a \u003Ccode>ConfigurationException\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Ftemplates#logos\">Logos\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch3 id=\"pdf-renderers\">PDF renderers\u003Ca class=\"q-doc-anchor\" href=\"#pdf-renderers\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The PDF comes from a \u003Ccode>Quittio\\Core\\Pdf\\PdfRenderer\u003C\u002Fcode> (\u003Ccode>render(RenderRequest $request): string\u003C\u002Fcode>). Quittio ships three:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>MpdfRenderer\u003C\u002Fcode>, the default,\u003C\u002Fli>\n\u003Cli>\u003Ccode>CallbackRenderer\u003C\u002Fcode> for another HTML-to-PDF engine (Browsershot, Gotenberg …),\u003C\u002Fli>\n\u003Cli>\u003Ccode>PassthroughRenderer\u003C\u002Fcode> for a finished PDF.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>How to configure and register them is described in \u003Ca href=\"\u002Fdocs\u002Ftemplates#pdf-renderers\">PDF renderers\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>For the e-invoice, two fields of the request matter. \u003Ccode>RenderRequest::$pdfa\u003C\u002Fcode> asks for PDF\u002FA-3b. \u003Ccode>RenderRequest::$embedded\u003C\u002Fcode> carries the XML as \u003Ccode>EmbeddedXml\u003C\u002Fcode> (\u003Ccode>content\u003C\u002Fcode>, \u003Ccode>filename\u003C\u002Fcode>, \u003Ccode>relationship\u003C\u002Fcode>, \u003Ccode>conformanceLevel\u003C\u002Fcode>, \u003Ccode>description\u003C\u002Fcode>, \u003Ccode>documentType\u003C\u002Fcode>, \u003Ccode>version\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A renderer whose \u003Ccode>supportsEmbedding()\u003C\u002Fcode> returns \u003Ccode>true\u003C\u002Fcode> handles both itself.\u003C\u002Fli>\n\u003Cli>For a renderer that returns \u003Ccode>false\u003C\u002Fcode>, the core passes the result to \u003Ccode>MpdfPostProcessor\u003C\u002Fcode> whenever PDF\u002FA or an embedded XML is requested.\u003C\u002Fli>\n\u003Cli>\u003Ccode>CallbackRenderer\u003C\u002Fcode> and \u003Ccode>PassthroughRenderer\u003C\u002Fcode> return \u003Ccode>true\u003C\u002Fcode> and use their own post processor (default \u003Ccode>MpdfPostProcessor\u003C\u002Fcode>). It imports every page into a new PDF\u002FA-3b and adds the output intent, the metadata, the XML as associated file and the Factur-X XMP metadata. So PDFs from other engines become ZUGFeRD.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A result that does not start with \u003Ccode>%PDF\u003C\u002Fcode> throws a \u003Ccode>PdfException\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"xrechnung\">XRechnung\u003Ca class=\"q-doc-anchor\" href=\"#xrechnung\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>XRechnung 3.0 is the German standard for invoices to public authorities. It is a CIUS of EN 16931: a national specialisation with additional rules. The German country pack provides it (\u003Ca href=\"\u002Fdocs\u002Fcountry-packs#xrechnung-profiles\">XRechnung profiles\u003C\u002Fa>) in both syntaxes:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>as plain XML: \u003Ccode>xrechnung-cii\u003C\u002Fcode> (alias \u003Ccode>xrechnung\u003C\u002Fcode>) and \u003Ccode>xrechnung-ubl\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>embedded in ZUGFeRD, as shown in \u003Ca href=\"#embedded-files\">Embedded files\u003C\u002Fa>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The automatic choice uses \u003Ccode>xrechnung-cii\u003C\u002Fcode> for domestic German invoices whose buyer reference (BT-10) is a Leitweg-ID with valid check digits, or whose buyer electronic address has the scheme \u003Ccode>0204\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>XRechnung adds to EN 16931:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Required fields: the buyer reference (BT-10; for public buyers the Leitweg-ID), the electronic addresses of seller and buyer (BT-34, BT-49), a seller contact with name, phone and email (BG-6), payment instructions (BG-16), and city and postcode of seller and buyer.\u003C\u002Fli>\n\u003Cli>Further XRechnung rules with the codes \u003Ccode>BR-DE-…\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fcountry-packs#xrechnung-rules\">XRechnung rules\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The business process (BT-23) defaults to \u003Ccode>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Cash discounts in the payment terms (BT-20) use the notation \u003Ccode>#SKONTO#TAGE=7#PROZENT=2.00#\u003C\u002Fcode> (Skonto = cash discount, Tage = days, Prozent = percent; see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#payment-terms\">Payment terms\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>The VAT breakdown always carries a rate.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The \u003Cstrong>XRechnung extension\u003C\u002Fstrong> (\u003Ccode>-&gt;profile('xrechnung-extension')\u003C\u002Fcode>, specification identifier \u003Ccode>…#conformant#urn:xeinkauf.de:kosit:extension:xrechnung_3.0\u003C\u002Fcode>) adds:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>sub lines, in UBL only (\u003Ccode>xrechnung-ubl\u003C\u002Fcode>; CII fails with BR-DEX-15),\u003C\u002Fli>\n\u003Cli>third party payments (\u003Ccode>xrechnungExtension()\u003C\u002Fcode>, BG-DEX-09), written as \u003Ccode>cac:PrepaidPayment\u003C\u002Fcode> and added to the amount due; only in UBL invoices,\u003C\u002Fli>\n\u003Cli>the identifier schemes \u003Ccode>XR01\u003C\u002Fcode> to \u003Ccode>XR03\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The extension is never chosen automatically; request it explicitly. It has no credit note in UBL (\u003Ccode>DE-XRECHNUNG-EXT-01\u003C\u002Fcode>): cancel such invoices with the strategy \u003Ccode>negative_invoice\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>XRechnung CVD\u003C\u002Fstrong> (\u003Ccode>-&gt;profile('xrechnung-cvd')\u003C\u002Fcode>, specification identifier \u003Ccode>…#compliant#urn:xeinkauf.de:kosit:xrechnung:cvd_0.9\u003C\u002Fcode>) is XRechnung 3.0 for vehicles procured under the Clean Vehicles Directive, in CII and UBL. It requires the contract reference (BT-12), the tender or lot reference (BT-17) and at least one line with the vehicle category as item classification of scheme \u003Ccode>CVD\u003C\u002Fcode> (BT-158) and the item attribute \u003Ccode>cva\u003C\u002Fcode> (BT-160, BT-161), see \u003Ca href=\"\u002Fdocs\u002Fcountry-packs#xrechnung-cvd\">XRechnung CVD\u003C\u002Fa>. It is never chosen automatically either.\u003C\u002Fp>\n\u003Ch2 id=\"peppol-bis-billing-30\">Peppol BIS Billing 3.0\u003Ca class=\"q-doc-anchor\" href=\"#peppol-bis-billing-30\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Peppol BIS Billing 3.0 is the invoice specification of the Peppol network. The format \u003Ccode>peppol\u003C\u002Fcode> writes UBL 2.1 according to it, with the profile \u003Ccode>peppol\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>CustomizationID (the specification identifier, BT-24): \u003Ccode>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>ProfileID (the business process, BT-23): \u003Ccode>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0\u003C\u002Fcode>, unless the invoice sets BT-23.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Seller and buyer need an electronic address (BT-34, BT-49), and the Peppol rules apply (\u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>). The electronic address is the Peppol participant identifier, so its scheme must be one Peppol accepts (\u003Ccode>PEPPOL-EN16931-CL008\u003C\u002Fcode>): e.g. \u003Ccode>9930\u003C\u002Fcode> (German VAT number) or \u003Ccode>0088\u003C\u002Fcode> (GLN), not \u003Ccode>EM\u003C\u002Fcode> (e-mail), which EN 16931 allows. Credit note type codes produce a \u003Ccode>CreditNote\u003C\u002Fcode> document.\u003C\u002Fp>\n\u003Cp>Quittio produces the document. Sending it through an access point, the service provider that connects you to the Peppol network, is not part of the core.\u003C\u002Fp>\n\u003Ch2 id=\"cii-and-ubl\">CII and UBL\u003Ca class=\"q-doc-anchor\" href=\"#cii-and-ubl\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The formats \u003Ccode>cii\u003C\u002Fcode> and \u003Ccode>ubl\u003C\u002Fcode> write plain XML in any profile of the syntax. Both writers require calculated data; the render run calculates. They write the elements in the order of the XSD, the XML schema of the syntax.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>CII\u003C\u002Fstrong> (UN\u002FCEFACT Cross Industry Invoice D16B, CEN\u002FTS 16931-3-3, root \u003Ccode>rsm:CrossIndustryInvoice\u003C\u002Fcode>) is the syntax of ZUGFeRD\u002FFactur-X and supports all Factur-X levels:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It carries only one preceding invoice reference (BG-3) on header level, so further references are dropped.\u003C\u002Fli>\n\u003Cli>Party identifiers without scheme are written as \u003Ccode>ram:ID\u003C\u002Fcode>, with scheme as \u003Ccode>ram:GlobalID\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>An account identifier that is no IBAN is written as \u003Ccode>ProprietaryID\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The tax point date is written with the first VAT breakdown.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Cstrong>UBL\u003C\u002Fstrong> (OASIS UBL 2.1, CEN\u002FTS 16931-3-2) writes an \u003Ccode>Invoice\u003C\u002Fcode> document. For credit note type codes (\u003Ccode>InvoiceTypeCode::isCreditNote()\u003C\u002Fcode>) it writes a \u003Ccode>CreditNote\u003C\u002Fcode> document, whose element order differs from \u003Ccode>Invoice\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>quantities as \u003Ccode>CreditedQuantity\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>the due date (BT-9) in the first payment means; without payment instructions it is not written,\u003C\u002Fli>\n\u003Cli>the project reference (BT-11) as additional document reference with type code 50, followed by the tender or lot reference (BT-17) as \u003Ccode>OriginatorDocumentReference\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>In both UBL documents:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A note with subject code is written as \u003Ccode>#CODE#text\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The creditor identifier of a direct debit (BT-90) is written as seller party identifier with scheme \u003Ccode>SEPA\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>A sales order reference without purchase order reference is written with the order ID \u003Ccode>NA\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The payment card network is written as \u003Ccode>NA\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Rules of both writers:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Amounts have exactly two decimals, prices and percentages at least two decimals, quantities no trailing zeros. The decimal separator is a dot.\u003C\u002Fli>\n\u003Cli>The VAT accounting currency (BT-6) is written only when it differs from the invoice currency (BT-5).\u003C\u002Fli>\n\u003Cli>Texts generated for the payment terms (BT-20) are in the run locale.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>\u003Ccode>SerializationOptions(string $locale = 'en', bool $indent = true)\u003C\u002Fcode> controls locale and indentation when you use a writer (\u003Ccode>CiiWriter\u003C\u002Fcode>, \u003Ccode>UblWriter\u003C\u002Fcode>) directly.\u003C\u002Fp>\n\u003Ch2 id=\"pdf-html-and-json\">PDF, HTML and JSON\u003Ca class=\"q-doc-anchor\" href=\"#pdf-html-and-json\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>These formats are not e-invoices. The validation skips the profile field matrix (level L2) for them; the other levels run as usual.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>pdf\u003C\u002Fcode> renders the template as PDF without e-invoice XML. It is PDF\u002FA-3b unless \u003Ccode>pdf.pdfa\u003C\u002Fcode> is \u003Ccode>false\u003C\u002Fcode> or the run has a watermark.\u003C\u002Fli>\n\u003Cli>With \u003Ccode>pdf.b2c_embed_xml = true\u003C\u002Fcode> (Laravel \u003Ccode>format_resolver.b2c_embed_xml\u003C\u002Fcode>), \u003Ccode>pdf\u003C\u002Fcode> embeds the CII XML as in ZUGFeRD, also for consumers. The XML uses the profile of the call or the configured profile (default EN 16931). The result then has \u003Ccode>xml()\u003C\u002Fcode> and \u003Ccode>profile()\u003C\u002Fcode>. Watermarked runs never embed XML.\u003C\u002Fli>\n\u003Cli>\u003Ccode>html\u003C\u002Fcode> returns the rendered template as HTML (\u003Ccode>html()\u003C\u002Fcode>), e.g. for previews or mails.\u003C\u002Fli>\n\u003Cli>\u003Ccode>json\u003C\u002Fcode> returns the calculated data model (\u003Ccode>json()\u003C\u002Fcode>). It is the same as \u003Ccode>InvoiceData::toJson(JSON_PRETTY_PRINT)\u003C\u002Fcode> of the calculated data (\u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#arrays-and-json\">Arrays and JSON\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"rendering-in-the-core\">Rendering in the core\u003Ca class=\"q-doc-anchor\" href=\"#rendering-in-the-core\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>This section is the reference of a render call. The examples use the core class \u003Ccode>Quittio\\Core\\Quittio\u003C\u002Fcode> without Laravel. In Laravel, \u003Ccode>Quittio::make()\u003C\u002Fcode> returns the Laravel variant with the same methods plus \u003Ccode>queue()\u003C\u002Fcode>; its result can also be saved to a disk, downloaded and mailed (\u003Ca href=\"\u002Fdocs\u002Flaravel#rendering-invoices\">Rendering invoices\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:#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:#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\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $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\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F automatic choice\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $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\">'extended'\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>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$result \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $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\">formats\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'zugferd'\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:#A5D6FF\">'json'\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>\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\">$result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">as\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\">xml\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>make(InvoiceData|ProvidesInvoiceData|InvoiceBuilder $data)\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Core\\Rendering\\PendingInvoice\u003C\u002Fcode>. A builder is built, and a \u003Ccode>ProvidesInvoiceData\u003C\u002Fcode> model is converted.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003Ccode>PendingInvoice\u003C\u002Fcode> method\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format(string $format)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">One output format. Without it: the configured format (\u003Ccode>format\u003C\u002Fcode>, Laravel \u003Ccode>defaults.format\u003C\u002Fcode>), or the \u003Ca href=\"#automatic-choice\">automatic choice\u003C\u002Fa> if none is configured.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats(array $formats)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Several formats from one calculation and validation run, e.g. \u003Ccode>['zugferd', 'xrechnung-cii']\u003C\u002Fcode>; duplicates are removed. The first is the main result.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profile(Profile|string $profile)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Profile for all formats of the run (by key, alias or as object).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale(string $locale)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Language of PDF, HTML and generated XML texts.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>country(string $country)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Country pack that leads the run, instead of the seller's country (BT-40).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>template(string $template)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Template of PDF and HTML (\u003Ca href=\"\u002Fdocs\u002Ftemplates\">Templates and design\u003C\u002Fa>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>presentation(Presentation $presentation)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Design defaults for this run; the invoice's own values win.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>option(string $key, mixed $value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Option for templates and validation rules, e.g. \u003Ccode>watermark\u003C\u002Fcode>, \u003Ccode>paper\u003C\u002Fcode>, \u003Ccode>markdown\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validate(bool $throwOnError = true)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Validation mode of this run: errors throw, or (\u003Ccode>false\u003C\u002Fcode>) warnings only.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>withoutValidation()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Switches the validation off for this render run (not for \u003Ccode>check()\u003C\u002Fcode> and \u003Ccode>prepare()\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>render(): RenderedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Calculates, chooses format and profile, validates, writes the XML, renders template and PDF.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>check(): ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Validates like a render run, without template and PDF, whatever the validation mode. This includes the XML levels, also for the XML that \u003Ccode>pdf\u003C\u002Fcode> embeds with \u003Ccode>pdf.b2c_embed_xml\u003C\u002Fcode>. Returns the result and does not throw for invalid data.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>prepare(): PreparedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Calculates and validates like \u003Ccode>check()\u003C\u002Fcode> without rendering. Returns the calculated data, the chosen formats with their profiles (\u003Ccode>formats\u003C\u002Fcode>, \u003Ccode>format()\u003C\u002Fcode>, \u003Ccode>profile()\u003C\u002Fcode>; \u003Ccode>null\u003C\u002Fcode> for formats that write or embed no XML), the leading and buyer country packs, the locale and the validation result.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>data(): InvoiceData\u003C\u002Fcode>, \u003Ccode>options(): RenderOptions\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The data and the collected options.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"result\">Result\u003Ca class=\"q-doc-anchor\" href=\"#result\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>render()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Core\\Rendering\\RenderedInvoice\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>data(): InvoiceData\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The calculated data (totals, VAT breakdown, line amounts, due date).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format(): string\u003C\u002Fcode>, \u003Ccode>profile(): ?Profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Format key (aliases resolved, e.g. \u003Ccode>zugferd\u003C\u002Fcode> for \u003Ccode>factur-x\u003C\u002Fcode>) and profile; \u003Ccode>null\u003C\u002Fcode> for outputs without XML.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validation(): ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Validation result including warnings (\u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>as(string $format): RenderedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The result of another format of the same run, by format key (not alias); \u003Ccode>LogicException\u003C\u002Fcode> for a format that was not rendered.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats(): array\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Keys of all formats of the run.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pdf()\u003C\u002Fcode>, \u003Ccode>xml()\u003C\u002Fcode>, \u003Ccode>html()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The outputs; \u003Ccode>LogicException\u003C\u002Fcode> if the format produced none. \u003Ccode>hasPdf()\u003C\u002Fcode>, \u003Ccode>hasXml()\u003C\u002Fcode> check first.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>json(): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The calculated data as pretty-printed JSON (for every format).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>contents(): string\u003C\u002Fcode>, \u003Ccode>extension(): string\u003C\u002Fcode>, \u003Ccode>mimeType(): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The main output (PDF, otherwise XML, HTML, JSON), its extension and MIME type.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>filename(?string $extension = null): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">File name of the main output, or with another extension.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hashes(): array\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">SHA-256 hashes of PDF, XML and HTML (\u003Ccode>['pdf' =&gt; …, 'xml' =&gt; …]\u003C\u002Fcode>), e.g. for archiving.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>save(string $path): string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Writes the main output to a file, or into a directory (an existing one or a path ending in \u003Ccode>\u002F\u003C\u002Fcode>) with \u003Ccode>filename()\u003C\u002Fcode>; creates missing directories and returns the path. Throws a \u003Ccode>RuntimeException\u003C\u002Fcode> when the file cannot be written.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"file-names\">File names\u003Ca class=\"q-doc-anchor\" href=\"#file-names\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>File names follow the pattern \u003Ccode>filename\u003C\u002Fcode> (Laravel \u003Ccode>pdf.filename\u003C\u002Fcode>), default \u003Ccode>{title}_{number}.{ext}\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Placeholder\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{title}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">Document title in the run locale, e.g. &quot;Rechnung&quot; (invoice), &quot;Stornorechnung&quot; (cancellation invoice), &quot;Credit note&quot; (\u003Ccode>Presentation::$title\u003C\u002Fcode> overrides it)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{number}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">Invoice number\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{date}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">Issue date, \u003Ccode>YYYY-MM-DD\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{format}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">Format key, e.g. \u003Ccode>zugferd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>{ext}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">Extension of the output: \u003Ccode>pdf\u003C\u002Fcode>, \u003Ccode>xml\u003C\u002Fcode>, \u003Ccode>html\u003C\u002Fcode> or \u003Ccode>json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>In title and number, characters other than letters, digits, \u003Ccode>.\u003C\u002Fcode>, \u003Ccode>_\u003C\u002Fcode> and \u003Ccode>-\u003C\u002Fcode> become \u003Ccode>_\u003C\u002Fcode>. A run of such characters becomes one \u003Ccode>_\u003C\u002Fcode>, and \u003Ccode>_\u003C\u002Fcode> at the start or end is removed. Example: \u003Ccode>Rechnung_RE-2026-0042.pdf\u003C\u002Fcode>; the XRechnung of the same run is \u003Ccode>Rechnung_RE-2026-0042.xml\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"output-configuration\">Output configuration\u003Ca class=\"q-doc-anchor\" href=\"#output-configuration\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003Ccode>Quittio::create()\u003C\u002Fcode> key\u003C\u002Fth>\n\u003Cth>Laravel key\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>format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>defaults.format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Format of runs without \u003Ccode>format()\u003C\u002Fcode>; \u003Ccode>null\u003C\u002Fcode> = automatic choice (\u003Ccode>Quittio::create()\u003C\u002Fcode> also accepts \u003Ccode>auto\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>defaults.profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Default profile for every format that allows it; \u003Ccode>null\u003C\u002Fcode> = the profile of the format or of the automatic choice.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>auto_upgrade_profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>format_resolver.auto_upgrade_profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Upgrade to EXTENDED when EXTENDED features are used.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pdf.b2c_embed_xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>format_resolver.b2c_embed_xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Embed the CII XML into \u003Ccode>pdf\u003C\u002Fcode> output.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pdf.pdfa\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>pdf.pdfa\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>pdf\u003C\u002Fcode> output as PDF\u002FA-3b (ZUGFeRD is always PDF\u002FA).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>filename\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>pdf.filename\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>{title}_{number}.{ext}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ca href=\"#file-names\">File names\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale\u003C\u002Fcode>, \u003Ccode>country\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>defaults.locale\u003C\u002Fcode>, \u003Ccode>defaults.country\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Locale of the run; country pack used when the seller has no country code.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>options.paper\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>pdf.paper\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Paper size that wins over the country pack default.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>temp_dir\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>pdf.cache_path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">system temp directory\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Temporary files of mPDF and the logo cache.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>–\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>format_resolver.driver\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>default\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Resolver registered with \u003Ccode>Quittio::extend('format_resolver', …)\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>peppolLookup\u003C\u002Fcode> of \u003Ccode>DefaultFormatResolver\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>format_resolver.peppol_lookup\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ca href=\"#peppol-lookup\">Peppol lookup\u003C\u002Fa>: invokable class (Laravel: resolved from the container) or callable that receives the \u003Ccode>BuyerParty\u003C\u002Fcode> and returns whether the buyer is reachable via Peppol.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>–\u003C\u002Ftd>\n\u003Ctd data-label=\"Laravel key\">\u003Ccode>pdf.renderer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>mpdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Renderer registered with \u003Ccode>Quittio::extend('renderer', …)\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>All keys of \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> are described in \u003Ca href=\"\u002Fdocs\u002Fconfiguration\">Configuration\u003C\u002Fa>.\u003C\u002Fp>\n",[111,115,118,121,124,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185],{"id":112,"text":113,"level":114},"you-usually-do-not-choose-a-format","You usually do not choose a format",2,{"id":116,"text":117,"level":114},"requesting-a-format","Requesting a format",{"id":119,"text":120,"level":114},"output-formats","Output formats",{"id":122,"text":123,"level":114},"automatic-choice","Automatic choice",{"id":125,"text":126,"level":127},"upgrade-to-profile-extended","Upgrade to profile EXTENDED",3,{"id":129,"text":130,"level":127},"peppol-lookup","Peppol lookup",{"id":132,"text":133,"level":127},"own-resolver-and-country-rules","Own resolver and country rules",{"id":135,"text":136,"level":114},"profiles","Profiles",{"id":138,"text":139,"level":127},"which-profile-is-used","Which profile is used",{"id":141,"text":142,"level":127},"what-each-profile-carries","What each profile carries",{"id":144,"text":145,"level":127},"capabilities","Capabilities",{"id":147,"text":148,"level":127},"own-profiles-and-formats","Own profiles and formats",{"id":150,"text":151,"level":114},"zugferd-and-factur-x","ZUGFeRD and Factur-X",{"id":153,"text":154,"level":127},"embedded-files","Embedded files",{"id":156,"text":157,"level":127},"drafts-and-watermarks","Drafts and watermarks",{"id":159,"text":160,"level":127},"pdfa-and-logos","PDF\u002FA and logos",{"id":162,"text":163,"level":127},"pdf-renderers","PDF renderers",{"id":165,"text":166,"level":114},"xrechnung","XRechnung",{"id":168,"text":169,"level":114},"peppol-bis-billing-30","Peppol BIS Billing 3.0",{"id":171,"text":172,"level":114},"cii-and-ubl","CII and UBL",{"id":174,"text":175,"level":114},"pdf-html-and-json","PDF, HTML and JSON",{"id":177,"text":178,"level":114},"rendering-in-the-core","Rendering in the core",{"id":180,"text":181,"level":127},"result","Result",{"id":183,"text":184,"level":127},"file-names","File names",{"id":186,"text":187,"level":114},"output-configuration","Output configuration","https:\u002F\u002Fgithub.com\u002FQuittio\u002Fquittio\u002Fedit\u002Fmaster\u002Fdocs\u002Fformats.md","\u002Fdocs\u002Fformats.md",{"slug":43,"title":44},{"slug":49,"title":50}]