[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs:laravel":3},{"versions":4,"version":26,"nav":28,"path":61,"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":62,"description":108,"html":109,"headings":110,"editUrl":206,"markdownUrl":207,"prev":208,"next":209},"This page explains how Quittio works in a Laravel application: you start an invoice, render it, save, download or mail the result, render in the queue, react to events and adapt templates, translations and drivers.","\u003Ch1 id=\"laravel-integration\">Laravel integration\u003C\u002Fh1>\n\u003Cp>This page explains how Quittio works in a Laravel application: you start an invoice, render it, save, download or mail the result, render in the queue, react to events and adapt templates, translations and drivers. Read \u003Ca href=\"\u002Fdocs\u002Fgetting-started\">Getting started\u003C\u002Fa> first for a first invoice. The terms used here (format, profile, ZUGFeRD, XRechnung) are explained in \u003Ca href=\"\u002Fdocs\u002Fconcepts\">E-invoicing basics\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>\u003Ccode>quittio\u002Flaravel\u003C\u002Fcode> connects the country-neutral core with Laravel. It needs PHP 8.3 and Laravel 13.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>bash\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FFA657\">composer\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> require\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> quittio\u002Fquittio\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">        # core, Laravel integration and country pack Germany\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FFA657\">php\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> artisan\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> quittio:install\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">             # publishes config\u002Fquittio.php (and config\u002Fquittio\u002Fcountries\u002Fde.php for Germany)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Then set your company in \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration#the-keys-you-set-first\">The keys you set first\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"overview\">Overview\u003Ca class=\"q-doc-anchor\" href=\"#overview\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>A typical invoice goes through these steps:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$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>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 1. start: seller from config\u002Fquittio.php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">number\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'RE-2026-0042'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">deliveryDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-09-30'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                           \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F date of supply, mandatory in Germany\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>\u003Cspan style=\"color:#8B949E\">\u002F\u002F a model that implements ProvidesParty\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Web development'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'95.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">24\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">dueInDays\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">14\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:#8B949E\">\u002F\u002F 2. render: format chosen automatically\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\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 3. save on a filesystem disk …\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">download\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                                \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F    … or download, or attach to a mail\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Step\u003C\u002Fth>\n\u003Cth>What you use\u003C\u002Fth>\n\u003Cth>Section\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Start an invoice\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>Quittio::invoice()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#starting-invoices\">Starting invoices\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Render it\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>-&gt;render()\u003C\u002Fcode>, or \u003Ccode>Quittio::make($invoice)\u003C\u002Fcode> for more options\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#rendering-invoices\">Rendering invoices\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Hand it out\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>-&gt;save()\u003C\u002Fcode>, \u003Ccode>-&gt;download()\u003C\u002Fcode>, \u003Ccode>-&gt;stream()\u003C\u002Fcode>, mail attachment\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#saving-downloading-and-mailing\">Saving, downloading and mailing\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Render later\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>-&gt;queue()-&gt;save()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#queueing\">Queueing\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>React to rendering\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>InvoiceRendered\u003C\u002Fcode> and other events\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#events\">Events\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Cancel an invoice\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>$result-&gt;cancel()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#cancellations\">Cancellations\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Quotes, reminders and other documents\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">\u003Ccode>Quittio::quote()\u003C\u002Fcode> …\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#documents\">Documents\u003C\u002Fa>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Adapt the output\u003C\u002Ftd>\n\u003Ctd data-label=\"What you use\">Blade templates, translations, drivers\u003C\u002Ftd>\n\u003Ctd data-label=\"Section\">\u003Ca href=\"#blade-templates\">Blade templates\u003C\u002Fa> and the sections after it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>All calls go through the facade \u003Ccode>Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fcode>. Instead of the facade you can inject \u003Ccode>Quittio\\Laravel\\QuittioManager\u003C\u002Fcode>; both are the same singleton. Every method is listed in \u003Ca href=\"#facade\">Facade\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"starting-invoices\">Starting invoices\u003Ca class=\"q-doc-anchor\" href=\"#starting-invoices\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode>Quittio::invoice()\u003C\u002Fcode> starts an invoice. It returns an \u003Ccode>InvoiceBuilder\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices\">Building invoices\u003C\u002Fa>) that already has your company as seller, its first bank account and the small business setting of \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration#seller\">Seller\u003C\u002Fa>). You add the number, the customer, the lines and the payment terms. Then you end the chain:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>-&gt;render()\u003C\u002Fcode> renders the invoice: PDF and XML, in a \u003Ca href=\"#renderedinvoice\">\u003Ccode>RenderedInvoice\u003C\u002Fcode>\u003C\u002Fa>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>-&gt;build()\u003C\u002Fcode> returns the data only (an \u003Ccode>InvoiceData\u003C\u002Fcode>), e.g. to store a draft or to render it later with \u003Ccode>Quittio::make()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">number\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'RE-2026-0042'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">deliveryDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-09-30'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)                           \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F date of supply, mandatory in Germany\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>\u003Cspan style=\"color:#8B949E\">\u002F\u002F a model that implements ProvidesParty\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">line\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Web development'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">netPrice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'95.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">24\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">dueInDays\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">14\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\"> $builder\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 format chosen automatically\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\"> $builder\u003C\u002Fspan>\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>\u003Cspan style=\"color:#8B949E\">\u002F\u002F one format\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\"> $builder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\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:#8B949E\">\u002F\u002F several formats; the first is the main result\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$report \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $builder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">check\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                               \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F validate only, no PDF\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$invoice \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $builder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">build\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                              \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F the data, not rendered\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>render(string|array|null $format = null)\u003C\u002Fcode> is the same as \u003Ccode>Quittio::make($builder)-&gt;format($format)-&gt;render()\u003C\u002Fcode>. For profile, locale, template or the queue, pass the builder to \u003Ccode>Quittio::make()\u003C\u002Fcode> (\u003Ca href=\"#rendering-invoices\">Rendering invoices\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>check(string|array|null $format = null)\u003C\u002Fcode> validates in the same way, including the XML, but renders no PDF. It returns the \u003Ccode>ValidationResult\u003C\u002Fcode> and does not throw for invalid data (\u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>The builder is a \u003Ccode>Quittio\\Laravel\\Builder\\RenderableInvoiceBuilder\u003C\u002Fcode>, a subclass of \u003Ccode>InvoiceBuilder\u003C\u002Fcode>, so all builder methods and macros work.\u003C\u002Fp>\n\u003Cp>Documents start the same way, with the seller and bank account of the configuration. They end with \u003Ccode>-&gt;build()\u003C\u002Fcode> or \u003Ccode>-&gt;render()\u003C\u002Fcode> (PDF); see \u003Ca href=\"#documents\">Documents\u003C\u002Fa>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Document\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::quote()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Quote\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::orderConfirmation()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Order confirmation\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::deliveryNote()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Delivery note\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::proforma()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Proforma invoice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::paymentReminder(int $level = 0)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Payment reminder (level 0) or reminder (level 1, 2 …)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::accountStatement()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Account statement\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio::bonusStatement()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Document\">Bonus statement (reduction of the consideration of a period, section 17 (4) UStG)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"another-seller\">Another seller\u003Ca class=\"q-doc-anchor\" href=\"#another-seller\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The bank account and the small business setting belong to the seller of the configuration. So \u003Ccode>-&gt;seller(...)\u003C\u002Fcode> with another seller (\u003Ccode>Party::make()\u003C\u002Fcode>, a \u003Ccode>SellerParty\u003C\u002Fcode> or a model) removes everything the configuration set for its seller: the bank account and the small business flag. With the \u003Ca href=\"#managed-layer\">Managed layer\u003C\u002Fa> (the optional package that stores invoices in the database) it also removes the issuer's payment terms, design, locale, time zone and currency.\u003C\u002Fp>\n\u003Cp>What you set on the builder yourself stays, also when you set it before \u003Ccode>-&gt;seller()\u003C\u002Fcode>. A callable changes the configured seller instead and keeps its values:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\Party\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Data\\Meta\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\PaymentMeansCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#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\">seller\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Party\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Lisa Klein'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">taxNumber\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'21\u002F815\u002F08150'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">identifier\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'21\u002F815\u002F08150'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">address\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Gartenstraße 7'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'12345'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Musterstadt'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'DE'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    ->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">payment\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">PaymentMeansCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">SepaCreditTransfer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">iban\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'DE89370400440532013000'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F Lisa's account\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\">flag\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Meta\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">FLAG_SMALL_BUSINESS\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);                                              \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F if she is a small business\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">seller\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($s) => $s\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">contact\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Max Muster'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">));                     \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F same seller, same defaults\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch3 id=\"seller-from-the-configuration\">Seller from the configuration\u003Ca class=\"q-doc-anchor\" href=\"#seller-from-the-configuration\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio\\Laravel\\Seller\u003C\u002Fcode> turns the \u003Ccode>seller\u003C\u002Fcode> section of \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration#seller\">Configuration\u003C\u002Fa>) into invoice data:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Seller::fromConfig(): SellerParty\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Builds the seller: name, VAT identifier, tax number, address, legal registration, identifiers, additional legal information, contact (when one of its values is set) and electronic address (when set)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Seller::apply(InvoiceBuilder $builder): InvoiceBuilder\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Sets the seller on the builder and adds a credit transfer with the first bank account that has an IBAN. With \u003Ccode>seller.small_business\u003C\u002Fcode>, it flags the invoice as small business invoice (\u003Ccode>Meta::FLAG_SMALL_BUSINESS\u003C\u002Fcode>). Returns the same builder.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>Quittio::invoice()\u003C\u002Fcode> and the document methods use them through \u003Ccode>ConfigInvoiceDefaults\u003C\u002Fcode> (see below). Use them directly for builders you create yourself:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Documents\\DocumentBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Seller\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$invoice \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Seller\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">apply\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">())\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">number\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'RE-2026-0042'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F* ... *\u002F\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">build\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\">$quote \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> DocumentBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">quote\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">seller\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Seller\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">fromConfig\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">());\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>With the Managed layer, issuer profiles hold the seller instead (\u003Ccode>$issuer-&gt;builder()\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Taking the seller from somewhere else.\u003C\u002Fstrong> \u003Ccode>Quittio::invoice()\u003C\u002Fcode> gets its seller from the binding of \u003Ccode>Quittio\\Laravel\\Contracts\\InvoiceDefaults\u003C\u002Fcode> (\u003Ccode>apply(InvoiceBuilder $builder): void\u003C\u002Fcode>; for documents it is applied to their invoice builder). The default binding, \u003Ccode>ConfigInvoiceDefaults\u003C\u002Fcode>, calls \u003Ccode>Seller::apply()\u003C\u002Fcode>. The Managed layer binds the current issuer. Bind your own class to take the seller from elsewhere, e.g. from the current tenant:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Contracts\\InvoiceDefaults\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">app\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">bind\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceDefaults\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::class\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> () => \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> implements\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> InvoiceDefaults\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> apply\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceBuilder\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $builder)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> void\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        $builder\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">seller\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">tenant\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">billingParty\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">());           \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F a SellerParty, PartyBuilder or ProvidesParty\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">});\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch2 id=\"rendering-invoices\">Rendering invoices\u003Ca class=\"q-doc-anchor\" href=\"#rendering-invoices\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Rendering turns invoice data into the output files. \u003Ccode>Quittio::make()\u003C\u002Fcode> starts a render call for data you built before: an \u003Ccode>InvoiceData\u003C\u002Fcode>, an \u003Ccode>InvoiceBuilder\u003C\u002Fcode>, or a model that implements \u003Ccode>ProvidesInvoiceData\u003C\u002Fcode>. It offers the options that \u003Ccode>-&gt;render()\u003C\u002Fcode> on the builder does not have:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$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 format chosen automatically\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\">($order)\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\">'en16931'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\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>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>A run does everything in one go:\u003C\u002Fp>\n\u003Col>\n\u003Cli>It calculates the invoice: totals, VAT breakdown, and the due date from \u003Ccode>defaults.due_days\u003C\u002Fcode>. You never calculate totals yourself.\u003C\u002Fli>\n\u003Cli>It chooses the format (the output, e.g. a ZUGFeRD PDF or an XRechnung XML, see \u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa>) and the profile (how much of EN 16931 the XML contains, see \u003Ca href=\"\u002Fdocs\u002Fconcepts#profiles\">Profiles\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>It validates the invoice (\u003Ca href=\"#validation-per-call\">Validation per call\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>It writes the XML, renders the Blade template and produces the PDF\u002FA (the archivable PDF standard) with the embedded XML.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>All formats of one call share the same calculation.\u003C\u002Fp>\n\u003Ch3 id=\"pendinginvoice\">PendingInvoice\u003Ca class=\"q-doc-anchor\" href=\"#pendinginvoice\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio::make()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Laravel\\Rendering\\PendingInvoice\u003C\u002Fcode>. It collects the options of one call; every setter returns the same object.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Effect\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=\"Effect\">One output format: \u003Ccode>zugferd\u003C\u002Fcode> (\u003Ccode>factur-x\u003C\u002Fcode>, \u003Ccode>facturx\u003C\u002Fcode>), \u003Ccode>xrechnung-cii\u003C\u002Fcode> (\u003Ccode>xrechnung\u003C\u002Fcode>), \u003Ccode>xrechnung-ubl\u003C\u002Fcode>, \u003Ccode>cii\u003C\u002Fcode>, \u003Ccode>ubl\u003C\u002Fcode>, \u003Ccode>peppol\u003C\u002Fcode>, \u003Ccode>pdf\u003C\u002Fcode>, \u003Ccode>html\u003C\u002Fcode>, \u003Ccode>json\u003C\u002Fcode>. Replaces earlier formats.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats(array $formats)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Several formats from one calculation; 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=\"Effect\">Profile key (\u003Ccode>minimum\u003C\u002Fcode>, \u003Ccode>basic-wl\u003C\u002Fcode>, \u003Ccode>basic\u003C\u002Fcode>, \u003Ccode>en16931\u003C\u002Fcode>, \u003Ccode>extended\u003C\u002Fcode>, \u003Ccode>peppol\u003C\u002Fcode>; \u003Ccode>xrechnung\u003C\u002Fcode>, \u003Ccode>xrechnung-extension\u003C\u002Fcode> and \u003Ccode>xrechnung-cvd\u003C\u002Fcode> with the German country pack; aliases such as \u003Ccode>comfort\u003C\u002Fcode>) or a \u003Ccode>Profile\u003C\u002Fcode> object. Every requested format must allow it, otherwise the run throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale(string $locale)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Locale of labels and formatting\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>country(string $country)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Leading country pack (upper-cased), instead of the seller's country\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>template(string $template)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Blade view or plain PHP template name; only allowed views (see \u003Ca href=\"#blade-templates\">Blade templates\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>presentation(Presentation $presentation)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Design for this call, merged over the configured design property by property; the invoice's own presentation wins (see \u003Ca href=\"\u002Fdocs\u002Ftemplates\">Templates and design\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validate(bool $throwOnError = true)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Validation mode \u003Ccode>error\u003C\u002Fcode> (\u003Ccode>true\u003C\u002Fcode>) or \u003Ccode>warn\u003C\u002Fcode> (\u003Ccode>false\u003C\u002Fcode>) for this call\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>withoutValidation()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Validation mode \u003Ccode>off\u003C\u002Fcode> for this call\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>option(string $key, mixed $value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Option for the view model and the validation rules (see \u003Ca href=\"#render-options\">Render options\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>render()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Renders: \u003Ccode>RenderedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>check()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Validates like \u003Ccode>render()\u003C\u002Fcode> without template and PDF: \u003Ccode>ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>prepare()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Calculates and validates without rendering: \u003Ccode>PreparedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>queue(?string $connection = null, ?string $queue = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Renders in a queued job: \u003Ccode>QueuedInvoice\u003C\u002Fcode> (see \u003Ca href=\"#queueing\">Queueing\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>data()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">The invoice data passed to \u003Ccode>make()\u003C\u002Fcode> (not yet calculated)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>options()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">The collected \u003Ccode>Quittio\\Core\\Rendering\\RenderOptions\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"fallback-order\">Fallback order\u003Ca class=\"q-doc-anchor\" href=\"#fallback-order\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Without an explicit value, each choice falls back in this order:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Choice\u003C\u002Fth>\n\u003Cth>Order\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Format\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>format()\u003C\u002Fcode>\u002F\u003Ccode>formats()\u003C\u002Fcode> → \u003Ccode>defaults.format\u003C\u002Fcode> → automatic choice (when \u003Ccode>defaults.format\u003C\u002Fcode> is \u003Ccode>null\u003C\u002Fcode> or \u003Ccode>'auto'\u003C\u002Fcode>; see \u003Ca href=\"\u002Fdocs\u002Fformats#automatic-choice\">Automatic choice\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Profile\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>profile()\u003C\u002Fcode> → \u003Ccode>defaults.profile\u003C\u002Fcode>, where the format allows it → profile of the automatic choice → default profile of the format. CII formats switch to EXTENDED (the profile with more fields than EN 16931) when the invoice uses EXTENDED features and \u003Ccode>profile()\u003C\u002Fcode> was not called (\u003Ccode>format_resolver.auto_upgrade_profile\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Locale\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>locale()\u003C\u002Fcode> → invoice locale (\u003Ccode>InvoiceBuilder::locale()\u003C\u002Fcode>) → \u003Ccode>defaults.locale\u003C\u002Fcode> → country pack\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Country pack\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>country()\u003C\u002Fcode> → seller country (BT-40, see \u003Ca href=\"\u002Fdocs\u002Fconcepts#en-16931-and-business-terms\">business terms\u003C\u002Fa>) → \u003Ccode>defaults.country\u003C\u002Fcode> → generic EN 16931 pack\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Template\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>template()\u003C\u002Fcode> → \u003Ccode>Presentation::$template\u003C\u002Fcode> of the invoice → \u003Ccode>template\u003C\u002Fcode> of the presentation passed with \u003Ccode>presentation()\u003C\u002Fcode> → \u003Ccode>pdf.template\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Validation\u003C\u002Ftd>\n\u003Ctd data-label=\"Order\">\u003Ccode>validate()\u003C\u002Fcode>\u002F\u003Ccode>withoutValidation()\u003C\u002Fcode> → \u003Ccode>validation.mode\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"render-options\">Render options\u003Ca class=\"q-doc-anchor\" href=\"#render-options\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>option()\u003C\u002Fcode> passes values to the view model and the validation rules. They override configured values of the same name:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Key\u003C\u002Fth>\n\u003Cth>Value\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>watermark\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">string\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Watermark text, e.g. \u003Ccode>'DRAFT'\u003C\u002Fcode>. Only for the formats \u003Ccode>pdf\u003C\u002Fcode> and \u003Ccode>html\u003C\u002Fcode>: with any format that produces e-invoice XML, the run throws a \u003Ccode>ConfigurationException\u003C\u002Fcode>. Watermarked PDFs are not PDF\u002FA.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>paper\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">string\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Paper size (like \u003Ccode>pdf.paper\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>markdown\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">bool\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Line descriptions and notes as Markdown (like \u003Ccode>pdf.markdown\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>fold_marks\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">bool\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Fold and punch marks (like \u003Ccode>pdf.fold_marks\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>girocode_amount\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Value\">\u003Ccode>'due'\u003C\u002Fcode>|\u003Ccode>'discounted'\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Amount in the GiroCode, the payment QR code (like \u003Ccode>pdf.payment_qr.girocode_amount\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"validation-per-call\">Validation per call\u003Ca class=\"q-doc-anchor\" href=\"#validation-per-call\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Validation checks the invoice against the rules of EN 16931, the format and the country (\u003Ca href=\"\u002Fdocs\u002Fconcepts#rules-and-validation\">Rules and validation\u003C\u002Fa>). The validation mode decides what happens with errors:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>In mode \u003Ccode>error\u003C\u002Fcode>, a run with errors throws \u003Ccode>Quittio\\Core\\Validation\\ValidationException\u003C\u002Fcode>. With \u003Ccode>validation.block_on_warnings\u003C\u002Fcode>, warnings throw as well. The exception's \u003Ccode>result\u003C\u002Fcode> property holds the \u003Ccode>ValidationResult\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>In mode \u003Ccode>warn\u003C\u002Fcode>, the result is attached and rendering continues.\u003C\u002Fli>\n\u003Cli>In mode \u003Ccode>off\u003C\u002Fcode>, nothing is validated.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Validation\\ValidationException\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">try\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    $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\">} \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">catch\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">ValidationException\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $e) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> back\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">withErrors\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">array_map\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($m) => $m\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">message, $e\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">errors\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\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\">validate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">false\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 never throws on findings\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\">validation\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">warnings\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>check()\u003C\u002Fcode> always validates with the configured levels, whatever the mode, and never throws on findings. It does not render the template or the PDF, so the PDF\u002FA check (level L6, veraPDF) does not run:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$report \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\">check\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\">$report\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">isValid\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>prepare()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Core\\Rendering\\PreparedInvoice\u003C\u002Fcode> with the decisions of a run:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Member\u003C\u002Fth>\n\u003Cth>Content\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>data\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">Calculated \u003Ccode>InvoiceData\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">Format key =&gt; \u003Ccode>Profile\u003C\u002Fcode> (null for formats without XML)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>country\u003C\u002Fcode>, \u003Ccode>buyerCountry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">Leading country pack and the buyer's pack (or null)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">Chosen locale\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validation\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">\u003Ccode>ValidationResult\u003C\u002Fcode> of the data and XML levels\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format()\u003C\u002Fcode>, \u003Ccode>profile()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">First format and its profile\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Validation levels and messages: \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>. Common errors and their fixes: \u003Ca href=\"\u002Fdocs\u002Ftroubleshooting\">Troubleshooting\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"renderedinvoice\">RenderedInvoice\u003Ca class=\"q-doc-anchor\" href=\"#renderedinvoice\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>render()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Laravel\\Rendering\\RenderedInvoice\u003C\u002Fcode> for the first format. It holds the files in memory. It implements \u003Ccode>Illuminate\\Contracts\\Mail\\Attachable\u003C\u002Fcode> and \u003Ccode>Illuminate\\Contracts\\Support\\Responsable\u003C\u002Fcode>, so you can attach it to a mail or return it from a controller.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Returns\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>data()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Calculated \u003Ccode>InvoiceData\u003C\u002Fcode> (totals, VAT breakdown, due date)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Format key of this result\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">All format keys of the run\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>as(string $format)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">The result of another format of the same run; a format that was not rendered throws a \u003Ccode>LogicException\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profile()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Profile\u003C\u002Fcode> of the XML, \u003Ccode>null\u003C\u002Fcode> for formats without XML\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validation()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ValidationResult\u003C\u002Fcode> of this format (warnings; in mode \u003Ccode>warn\u003C\u002Fcode> also errors)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hasPdf()\u003C\u002Fcode>, \u003Ccode>hasXml()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Whether the format produced a PDF or XML\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pdf()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">PDF bytes (\u003Ccode>zugferd\u003C\u002Fcode>, \u003Ccode>pdf\u003C\u002Fcode>); other formats throw a \u003Ccode>LogicException\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xml()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">XML (\u003Ccode>zugferd\u003C\u002Fcode>, \u003Ccode>xrechnung-cii\u003C\u002Fcode>, \u003Ccode>xrechnung-ubl\u003C\u002Fcode>, \u003Ccode>cii\u003C\u002Fcode>, \u003Ccode>ubl\u003C\u002Fcode>, \u003Ccode>peppol\u003C\u002Fcode>, \u003Ccode>pdf\u003C\u002Fcode> with \u003Ccode>b2c_embed_xml\u003C\u002Fcode>); other formats throw\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>html()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">HTML (format \u003Ccode>html\u003C\u002Fcode> only); other formats throw\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>json()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">The calculated invoice as JSON (\u003Ccode>InvoiceData::toJson()\u003C\u002Fcode>), for every format\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>contents()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Main output: PDF, otherwise XML, HTML or JSON\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>mimeType()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>application\u002Fpdf\u003C\u002Fcode>, \u003Ccode>application\u002Fxml\u003C\u002Fcode>, \u003Ccode>text\u002Fhtml\u003C\u002Fcode> or \u003Ccode>application\u002Fjson\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>filename(?string $extension = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">File name from \u003Ccode>pdf.filename\u003C\u002Fcode>, e.g. \u003Ccode>Rechnung_RE-2026-0042.pdf\u003C\u002Fcode> (&quot;Rechnung&quot; is the German title, invoice); with \u003Ccode>$extension\u003C\u002Fcode> for another output, e.g. \u003Ccode>filename('xml')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>hashes()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">SHA-256 of the outputs: \u003Ccode>['pdf' =&gt; …, 'xml' =&gt; …, 'html' =&gt; …]\u003C\u002Fcode> (only those produced)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>download(?string $filename = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">HTTP response as attachment\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>stream(?string $filename = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">HTTP response for inline display in the browser\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>toResponse($request)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Same as \u003Ccode>download()\u003C\u002Fcode>: return the result from a controller\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>toMailAttachment()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Illuminate\\Mail\\Attachment\u003C\u002Fcode> with file name and MIME type\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>save(?string $disk = null, ?string $path = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Stores the main output on a filesystem disk, returns the path; throws a \u003Ccode>RuntimeException\u003C\u002Fcode> when the disk does not store it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cancel(string $number, ?string $reason = null, ?array $lines = null, Date|DateTimeInterface|string|null $issueDate = null, ?string $strategy = null, ?CancellationHistory $history = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Builds the cancellation of this invoice with \u003Ccode>Quittio::cancellation()\u003C\u002Fcode> and renders it in the formats of this run; returns its \u003Ccode>RenderedInvoice\u003C\u002Fcode> (\u003Ca href=\"#cancellations\">Cancellations\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>core()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">The core result \u003Ccode>Quittio\\Core\\Rendering\\RenderedInvoice\u003C\u002Fcode> (adds \u003Ccode>extension()\u003C\u002Fcode> and \u003Ccode>save(string $localPath)\u003C\u002Fcode> for local files)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"saving-downloading-and-mailing\">Saving, downloading and mailing\u003Ca class=\"q-doc-anchor\" href=\"#saving-downloading-and-mailing\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>A rendered result is not stored anywhere yet. Save it on a disk, return it as an HTTP response or attach it to a mail. The same methods work for documents (\u003Ccode>RenderedDocument\u003C\u002Fcode>, see \u003Ca href=\"#documents\">Documents\u003C\u002Fa>).\u003C\u002Fp>\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>Results are named by the pattern \u003Ccode>pdf.filename\u003C\u002Fcode> (default \u003Ccode>{title}_{number}.{ext}\u003C\u002Fcode>). The placeholders are:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>{title}\u003C\u002Fcode>: the document title in the render locale, e.g. &quot;Rechnung&quot; (invoice), &quot;Stornorechnung&quot; (cancellation invoice) or, in English, &quot;Invoice&quot;,\u003C\u002Fli>\n\u003Cli>\u003Ccode>{number}\u003C\u002Fcode>: the invoice number,\u003C\u002Fli>\n\u003Cli>\u003Ccode>{date}\u003C\u002Fcode>: the issue date as \u003Ccode>Y-m-d\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>\u003Ccode>{format}\u003C\u002Fcode>: the format key (for quotes and other documents: the document type),\u003C\u002Fli>\n\u003Cli>\u003Ccode>{ext}\u003C\u002Fcode>: the extension (\u003Ccode>pdf\u003C\u002Fcode>, \u003Ccode>xml\u003C\u002Fcode>, \u003Ccode>html\u003C\u002Fcode>, \u003Ccode>json\u003C\u002Fcode>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Title and number are reduced to letters, digits, \u003Ccode>.\u003C\u002Fcode>, \u003Ccode>_\u003C\u002Fcode> and \u003Ccode>-\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F 'filename' => '{date}_{number}.{ext}'\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\">filename\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 2026-10-03_RE-2026-0042.pdf\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\">filename\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();   \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F 2026-10-03_RE-2026-0042.xml\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch3 id=\"responses\">Responses\u003Ca class=\"q-doc-anchor\" href=\"#responses\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Return the result from a controller to send it to the browser:\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\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> show\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Invoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $invoice)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#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\">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:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $result;                             \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F download (Content-Disposition: attachment)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F return $result->download('invoice.pdf'); \u002F\u002F own file name\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F\u002F return $result->stream();                \u002F\u002F inline, e.g. in a browser tab or iframe\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The response carries:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the content as body,\u003C\u002Fli>\n\u003Cli>\u003Ccode>Content-Type\u003C\u002Fcode> from \u003Ccode>mimeType()\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>\u003Ccode>Content-Disposition\u003C\u002Fcode> with an ASCII fallback name and the UTF-8 name (\u003Ccode>filename*=\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>\u003Ccode>Cache-Control: private, no-store\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The ASCII fallback transliterates: \u003Ccode>Rechnung Über.pdf\u003C\u002Fcode> becomes \u003Ccode>Rechnung_Uber.pdf\u003C\u002Fcode>, and \u003Ccode>ß\u003C\u002Fcode> becomes \u003Ccode>ss\u003C\u002Fcode>. Every other character outside letters, digits, \u003Ccode>.\u003C\u002Fcode>, \u003Ccode>_\u003C\u002Fcode> and \u003Ccode>-\u003C\u002Fcode> becomes one \u003Ccode>_\u003C\u002Fcode>. \u003Ccode>stream()\u003C\u002Fcode> sends the complete file inline; it is not a chunked \u003Ccode>StreamedResponse\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"storage\">Storage\u003Ca class=\"q-doc-anchor\" href=\"#storage\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$path \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                                  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F quittio.storage.disk, file name of the result\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$path \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026\u002F'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);               \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F directory (ends with \"\u002F\"): 2026\u002FRechnung_RE-2026-0042.pdf\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$path \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\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\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026\u002FRE-2026-0042.xml'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>save()\u003C\u002Fcode> stores \u003Ccode>contents()\u003C\u002Fcode> (the main output) with \u003Ccode>Storage::disk($disk)-&gt;put()\u003C\u002Fcode> and returns the path:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The disk defaults to \u003Ccode>quittio.storage.disk\u003C\u002Fcode>, and to the default disk when that is empty.\u003C\u002Fli>\n\u003Cli>The path defaults to \u003Ccode>filename()\u003C\u002Fcode>. A path that ends with \u003Ccode>\u002F\u003C\u002Fcode> is a directory; the file name is added.\u003C\u002Fli>\n\u003Cli>Existing files are overwritten (unlike the archive of the Managed layer).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>For a local path without a disk, use \u003Ccode>$result-&gt;core()-&gt;save('\u002Fvar\u002Finvoices')\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"mail-attachments\">Mail attachments\u003Ca class=\"q-doc-anchor\" href=\"#mail-attachments\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>RenderedInvoice\u003C\u002Fcode> and \u003Ccode>RenderedDocument\u003C\u002Fcode> are attachable. Return them from \u003Ccode>attachments()\u003C\u002Fcode> of a mailable; file name and MIME type come from the result:\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\"> Illuminate\\Mail\\Mailable\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\"> Illuminate\\Mail\\Mailables\\Content\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\"> Illuminate\\Mail\\Mailables\\Envelope\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Rendering\\RenderedInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">final\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> InvoiceMail\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> extends\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Mailable\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> __construct\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">private\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> RenderedInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $invoice) {}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> envelope\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Envelope\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Envelope\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">subject\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Invoice '\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">invoice\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">data\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">number);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> content\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Content\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Content\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">view\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'mail.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:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> attachments\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> array\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">invoice];                         \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F file name and MIME type of the result\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Mail\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">to\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($customer)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">send\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> InvoiceMail\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\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\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()));\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>-&gt;attach($result)\u003C\u002Fcode> works in \u003Ccode>build()\u003C\u002Fcode> and in notification mail messages as well.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>For an XRechnung, attach the XML result (\u003Ccode>$result-&gt;as('xrechnung-cii')\u003C\u002Fcode>). If the recipient wants a readable PDF too, render a second format \u003Ccode>pdf\u003C\u002Fcode> in the same run and attach it as well.\u003C\u002Fli>\n\u003Cli>For queued mailables, consider storing the file first (\u003Ccode>save()\u003C\u002Fcode>) and attaching it with \u003Ccode>Attachment::fromStorageDisk()\u003C\u002Fcode>, so that the file does not travel through the queue.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The Managed layer ships its own mailable and delivery tracking (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#delivery\">Managed layer\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"queueing\">Queueing\u003Ca class=\"q-doc-anchor\" href=\"#queueing\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Render in a queued job when a request should not wait for the PDF, e.g. for many invoices at once. The job renders and saves the result on a disk:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$job \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\">queue\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026\u002F'\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\">$job \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\">queue\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'redis'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">save\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>queue()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Laravel\\Rendering\\QueuedInvoice\u003C\u002Fcode>. Its only method, \u003Ccode>save(?string $disk = null, ?string $path = null)\u003C\u002Fcode>, dispatches a \u003Ccode>Quittio\\Laravel\\Jobs\\RenderInvoice\u003C\u002Fcode> job and returns it.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Detail\u003C\u002Fth>\n\u003Cth>Behaviour\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Connection, queue\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">Arguments of \u003Ccode>queue()\u003C\u002Fcode>, else \u003Ccode>quittio.queue.connection\u003C\u002Fcode> and \u003Ccode>quittio.queue.queue\u003C\u002Fcode>. The default queue is \u003Ccode>quittio\u003C\u002Fcode>: start a worker with \u003Ccode>--queue=quittio,…\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Payload\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">The invoice as versioned JSON snapshot (\u003Ccode>invoice\u003C\u002Fcode>), the \u003Ccode>RenderOptions\u003C\u002Fcode> of the call as versioned JSON (\u003Ccode>options\u003C\u002Fcode>, see \u003Ccode>RenderOptions::toArray()\u003C\u002Fcode>; \u003Ccode>renderOptions()\u003C\u002Fcode> restores them), \u003Ccode>disk\u003C\u002Fcode> and \u003Ccode>path\u003C\u002Fcode> (public properties). A profile object travels by its key; options must be scalars, \u003Ccode>null\u003C\u002Fcode> or arrays of them.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Dispatch\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">Inside a database transaction after the commit, and not at all after a rollback (\u003Ccode>quittio.queue.after_commit\u003C\u002Fcode>, default \u003Ccode>true\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Execution\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">\u003Ccode>handle()\u003C\u002Fcode> renders with the stored options (events included), calls \u003Ccode>save($disk, $path)\u003C\u002Fcode> and dispatches \u003Ccode>QueuedInvoiceStored\u003C\u002Fcode>. A \u003Ccode>null\u003C\u002Fcode> disk is resolved when the job runs.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Retries\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">\u003Ccode>$tries = 3\u003C\u002Fcode> with 10 and 60 seconds between the attempts, for errors that may pass (a disk that is not reachable, a KoSIT daemon that restarts). Errors that another attempt cannot fix fail the job at once: validation errors, invalid or unreadable data, configuration errors (\u003Ccode>RenderInvoice::PERMANENT_ERRORS\u003C\u002Fcode>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Failure\u003C\u002Ftd>\n\u003Ctd data-label=\"Behaviour\">\u003Ccode>failed()\u003C\u002Fcode> dispatches \u003Ccode>QueuedInvoiceFailed\u003C\u002Fcode> with the job and the exception\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Documents are queued the same way: \u003Ccode>Quittio::document($quote)-&gt;queue()-&gt;save('documents', 'quotes\u002F')\u003C\u002Fcode> dispatches a \u003Ccode>RenderDocument\u003C\u002Fcode> job, which carries the document as versioned snapshot and dispatches \u003Ccode>QueuedDocumentStored\u003C\u002Fcode> or \u003Ccode>QueuedDocumentFailed\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fdocuments#queueing\">Documents: queueing\u003C\u002Fa>).\n| Upgrades | Snapshots of older data model versions are migrated by \u003Ccode>quittio.snapshots.upcasters\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration#snapshots\">Snapshots\u003C\u002Fa>); \u003Ccode>data()\u003C\u002Fcode> returns the restored invoice. Jobs queued by Quittio 0.1.0 (options as PHP object) still run. |\u003C\u002Fp>\n\u003Cp>With the \u003Ccode>sync\u003C\u002Fcode> connection the job runs immediately.\u003C\u002Fp>\n\u003Ch2 id=\"events\">Events\u003Ca class=\"q-doc-anchor\" href=\"#events\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Events let you react to rendering, e.g. to log every invoice or to store its hashes. All events are in the namespace \u003Ccode>Quittio\\Laravel\\Events\u003C\u002Fcode>. They are dispatched by \u003Ccode>QuittioManager::renderInvoice()\u003C\u002Fcode>, i.e. by \u003Ccode>PendingInvoice::render()\u003C\u002Fcode>, by queued \u003Ccode>RenderInvoice\u003C\u002Fcode> jobs and by the rendering of the Managed layer.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Event\u003C\u002Fth>\n\u003Cth>Dispatched\u003C\u002Fth>\n\u003Cth>Payload\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>InvoiceRendering\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">Before the invoice is calculated, validated and rendered\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>invoice\u003C\u002Fcode> (\u003Ccode>InvoiceData\u003C\u002Fcode> as passed, not calculated), \u003Ccode>options\u003C\u002Fcode> (\u003Ccode>RenderOptions\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>InvoiceValidated\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">After all formats were rendered, before \u003Ccode>InvoiceRendered\u003C\u002Fcode>, when the run validated and validation did not block it: in mode \u003Ccode>error\u003C\u002Fcode> and in mode \u003Ccode>warn\u003C\u002Fcode>; not in mode \u003Ccode>off\u003C\u002Fcode> (nothing was validated)\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>invoice\u003C\u002Fcode> (calculated \u003Ccode>InvoiceData\u003C\u002Fcode>), \u003Ccode>result\u003C\u002Fcode> (\u003Ccode>ValidationResult\u003C\u002Fcode> of the main format; in mode \u003Ccode>warn\u003C\u002Fcode> it may contain errors, so check \u003Ccode>isValid()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>InvoiceValidationFailed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">When validation blocked the run (mode \u003Ccode>error\u003C\u002Fcode>); the \u003Ccode>ValidationException\u003C\u002Fcode> is thrown afterwards\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>invoice\u003C\u002Fcode> (\u003Ccode>InvoiceData\u003C\u002Fcode> as passed), \u003Ccode>result\u003C\u002Fcode> (\u003Ccode>ValidationResult\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>InvoiceRendered\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">After all requested formats were produced\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>result\u003C\u002Fcode> (\u003Ccode>Quittio\\Laravel\\Rendering\\RenderedInvoice\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>QueuedInvoiceStored\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">After a queued \u003Ccode>RenderInvoice\u003C\u002Fcode> job stored the main output, after \u003Ccode>InvoiceRendered\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>result\u003C\u002Fcode> (\u003Ccode>RenderedInvoice\u003C\u002Fcode>), \u003Ccode>disk\u003C\u002Fcode> (of the job, \u003Ccode>null\u003C\u002Fcode> = configured disk), \u003Ccode>path\u003C\u002Fcode> (the stored path)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DocumentRendering\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">Before a document (quote, reminder, …) is calculated and rendered\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>document\u003C\u002Fcode> (\u003Ccode>DocumentData\u003C\u002Fcode> as passed), \u003Ccode>options\u003C\u002Fcode> (\u003Ccode>RenderOptions\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>DocumentRendered\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">After a document was rendered\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>result\u003C\u002Fcode> (\u003Ccode>Quittio\\Laravel\\Rendering\\RenderedDocument\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>QueuedInvoiceFailed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">When a queued \u003Ccode>RenderInvoice\u003C\u002Fcode> job failed for good (last attempt, or at once for errors another attempt cannot fix)\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>job\u003C\u002Fcode> (\u003Ccode>RenderInvoice\u003C\u002Fcode>; \u003Ccode>$job-&gt;data()\u003C\u002Fcode> returns the invoice), \u003Ccode>exception\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>QueuedDocumentStored\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">After a queued \u003Ccode>RenderDocument\u003C\u002Fcode> job stored the document\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>result\u003C\u002Fcode> (\u003Ccode>RenderedDocument\u003C\u002Fcode>), \u003Ccode>disk\u003C\u002Fcode>, \u003Ccode>path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>QueuedDocumentFailed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">When a queued \u003Ccode>RenderDocument\u003C\u002Fcode> job failed for good\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>job\u003C\u002Fcode> (\u003Ccode>RenderDocument\u003C\u002Fcode>; \u003Ccode>$job-&gt;data()\u003C\u002Fcode> returns the document), \u003Ccode>exception\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>MandatoryFieldMissing\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Dispatched\">When the template omitted mandatory values (\u003Ca href=\"\u002Fdocs\u002Fvalidation#mandatory-field-guard\">Mandatory field guard\u003C\u002Fa>), in the guard modes \u003Ccode>exception\u003C\u002Fcode> (before the exception is thrown) and \u003Ccode>log\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Payload\">\u003Ccode>invoice\u003C\u002Fcode> (calculated \u003Ccode>InvoiceData\u003C\u002Fcode>), \u003Ccode>fields\u003C\u002Fcode> (list of \u003Ccode>Quittio\\Core\\Countries\\MandatoryField\u003C\u002Fcode> with \u003Ccode>accessKey\u003C\u002Fcode>, \u003Ccode>description\u003C\u002Fcode>, \u003Ccode>legalBasis\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>No events are dispatched for \u003Ccode>check()\u003C\u002Fcode>, \u003Ccode>prepare()\u003C\u002Fcode>, reading or validating files. \u003Ccode>Quittio::fake()\u003C\u002Fcode> dispatches the events of a real run (\u003Ca href=\"\u002Fdocs\u002Ftesting#how-the-fake-works\">Testing\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>Queued listeners receive the event serialised: \u003Ccode>InvoiceRendered\u003C\u002Fcode>, \u003Ccode>QueuedInvoiceStored\u003C\u002Fcode> and \u003Ccode>DocumentRendered\u003C\u002Fcode> carry the rendered files, PDF bytes included, into the queue payload. For many or large invoices, listen synchronously and queue a job with the stored path instead.\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\"> Illuminate\\Support\\Facades\\Event\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Events\\InvoiceRendered\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Event\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">listen\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">InvoiceRendered\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $event) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#79C0FF\">    Log\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">info\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Invoice rendered'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#A5D6FF\">        'number'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $event\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">data\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">number,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#A5D6FF\">        'format'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $event\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\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>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#A5D6FF\">        'hashes'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $event\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">hashes\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    ]);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">});\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The Managed layer dispatches further events for the lifecycle of stored invoices (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#events\">Managed layer\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ch2 id=\"cancellations\">Cancellations\u003Ca class=\"q-doc-anchor\" href=\"#cancellations\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>A cancellation reverses an issued invoice. It is a new invoice with its own number and a reference to the original (&quot;Stornorechnung&quot;, cancellation invoice, on German invoices).\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$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>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$cancellation \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $result\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">cancel\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'ST-2026-0001'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">reason\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Charged twice'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);      \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F rendered in the formats of $result\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 stored data: build the cancellation and render it\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$builder \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">cancellation\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($original, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'ST-2026-0001'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">reason\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Charged twice'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($builder)\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 partial cancellation of line 2 (one unit), with the earlier partial cancellations\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">cancellation\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($original, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'ST-2026-0002'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">lines\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: [[\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'line'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '2'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quantity'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> 1\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">]], \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">history\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: $history);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>$result-&gt;cancel()\u003C\u002Fcode> takes the arguments of \u003Ccode>Quittio::cancellation()\u003C\u002Fcode> (\u003Ccode>reason\u003C\u002Fcode>, \u003Ccode>lines\u003C\u002Fcode>, \u003Ccode>issueDate\u003C\u002Fcode>, \u003Ccode>strategy\u003C\u002Fcode>, \u003Ccode>history\u003C\u002Fcode>). It renders the cancellation in the formats of the invoice, so a cancellation of an XRechnung is an XRechnung again.\u003C\u002Fp>\n\u003Cp>The sign strategy decides how the amounts are written: \u003Ccode>credit_note\u003C\u002Fcode> is a credit note (type code 381) with positive amounts, \u003Ccode>negative_invoice\u003C\u002Fcode> an invoice (type code 380) with negative amounts. Both are permitted in Germany.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The sign strategy comes from the argument, then \u003Ccode>corrections.cancellation_strategy\u003C\u002Fcode>, then the country pack.\u003C\u002Fli>\n\u003Cli>The locale comes from the original, then \u003Ccode>defaults.locale\u003C\u002Fcode>, then the country pack.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Details: \u003Ca href=\"\u002Fdocs\u002Fgetting-started#cancellation\">Cancellation\u003C\u002Fa>, \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#cancellations-and-corrections\">Cancellations and corrections\u003C\u002Fa> and, for stored invoices, \u003Ca href=\"\u002Fdocs\u002Fmanaged#cancellations-and-corrections\">Managed layer\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"documents\">Documents\u003Ca class=\"q-doc-anchor\" href=\"#documents\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Quotes, order confirmations, delivery notes, proforma invoices, payment reminders and account statements are documents: PDFs without e-invoice XML. Start them with the methods of \u003Ca href=\"#starting-invoices\">Starting invoices\u003C\u002Fa>. End the chain with \u003Ccode>-&gt;render()\u003C\u002Fcode>, or pass the builder to \u003Ccode>Quittio::document()\u003C\u002Fcode> for more options:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Builder\\Party\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Enums\\UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">$quote \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\">quote\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">number\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'AN-2026-0007'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">issueDate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'2026-10-01'\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\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Party\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Kunde AG'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">address\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Weg 1'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'54321'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'Beispielstadt'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'DE'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">))\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#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\">'100.00'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">quantity\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">2\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\">unit\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">: \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">UnitCode\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">Hour\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">return\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">document\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($quote)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">download\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>\u003Ccode>Quittio::document()\u003C\u002Fcode> returns a \u003Ccode>Quittio\\Laravel\\Rendering\\PendingDocument\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>template(string $template)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Template (same allowlist as invoices)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>locale(string $locale)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Locale\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>country(string $country)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Leading country pack\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>presentation(Presentation $presentation)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Design for this call\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>htmlOnly()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Render HTML only, no PDF\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>option(string $key, mixed $value)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Output option of this call, e.g. \u003Ccode>option('fold_marks', false)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>render()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>RenderedDocument\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>PendingDocument\u003C\u002Fcode> is \u003Ccode>Macroable\u003C\u002Fcode> like \u003Ccode>PendingInvoice\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Documents never contain XML and are not validated. \u003Ccode>RenderedDocument\u003C\u002Fcode> offers:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>data()\u003C\u002Fcode> (\u003Ccode>DocumentData\u003C\u002Fcode>), \u003Ccode>hasPdf()\u003C\u002Fcode> (\u003Ccode>false\u003C\u002Fcode> after \u003Ccode>htmlOnly()\u003C\u002Fcode>), \u003Ccode>pdf()\u003C\u002Fcode> (throws after \u003Ccode>htmlOnly()\u003C\u002Fcode>), \u003Ccode>html()\u003C\u002Fcode>, \u003Ccode>contents()\u003C\u002Fcode>, \u003Ccode>mimeType()\u003C\u002Fcode>, \u003Ccode>filename(?string $extension = null)\u003C\u002Fcode> and \u003Ccode>core()\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>like invoices: \u003Ccode>download()\u003C\u002Fcode>, \u003Ccode>stream()\u003C\u002Fcode>, \u003Ccode>toResponse()\u003C\u002Fcode>, \u003Ccode>toMailAttachment()\u003C\u002Fcode> and \u003Ccode>save()\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Document types and their data: \u003Ca href=\"\u002Fdocs\u002Fdocuments\">Quotes and other documents\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"blade-templates\">Blade templates\u003Ca class=\"q-doc-anchor\" href=\"#blade-templates\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The sections from here on describe how to adapt the output. The PDF is rendered from a Blade template. The core prepares the invoice for display (the view model: formatted amounts, labels, design values) and renders it with \u003Ccode>Quittio\\Laravel\\Templates\\BladeTemplateEngine\u003C\u002Fcode>. A view receives one variable, \u003Ccode>$invoice\u003C\u002Fcode> (\u003Ccode>Quittio\\Core\\View\\InvoiceViewModel\u003C\u002Fcode>, see \u003Ca href=\"\u002Fdocs\u002Ftemplates#view-model\">View model\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>View\u003C\u002Fth>\n\u003Cth>Use\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio::templates.default.layout\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Default template (\u003Ccode>pdf.template\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio::templates.default.partials.*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Its partials (\u003Ccode>letterhead\u003C\u002Fcode>, \u003Ccode>recipient\u003C\u002Fcode>, \u003Ccode>lines\u003C\u002Fcode>, \u003Ccode>totals\u003C\u002Fcode>, \u003Ccode>payment\u003C\u002Fcode>, …)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>invoices.{name}.layout\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Use\">Templates created by \u003Ccode>make:quittio-template {name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Customise the design in levels (see \u003Ca href=\"\u002Fdocs\u002Ftemplates\">Templates and design\u003C\u002Fa>):\u003C\u002Fp>\n\u003Col>\n\u003Cli>the configuration (\u003Ccode>pdf.*\u003C\u002Fcode>, see \u003Ca href=\"\u002Fdocs\u002Fconfiguration#pdf-and-design\">PDF and design\u003C\u002Fa>),\u003C\u002Fli>\n\u003Cli>published partials: \u003Ccode>php artisan vendor:publish --tag=quittio-views\u003C\u002Fcode> copies them to \u003Ccode>resources\u002Fviews\u002Fvendor\u002Fquittio\u002Ftemplates\u003C\u002Fcode>, which Laravel prefers over the package views,\u003C\u002Fli>\n\u003Cli>an own template (\u003Ccode>make:quittio-template\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>an own renderer (\u003Ca href=\"#extensions\">Extensions\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Template names may come from invoice data (\u003Ccode>Presentation::$template\u003C\u002Fcode>) or issuer branding. So only these views can be rendered:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>default\u003C\u002Fcode>, which means the view of \u003Ccode>pdf.template\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>the view configured in \u003Ccode>pdf.template\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>the shipped views under \u003Ccode>quittio::templates.\u003C\u002Fcode> (not their partials),\u003C\u002Fli>\n\u003Cli>the views of \u003Ccode>pdf.templates\u003C\u002Fcode> (default \u003Ccode>['invoices.*']\u003C\u002Fcode>). An entry ending in \u003Ccode>*\u003C\u002Fcode> allows every view below that prefix, e.g. \u003Ccode>mytheme::*\u003C\u002Fcode>. Views containing \u003Ccode>.partials.\u003C\u002Fcode> never qualify.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Any other existing view fails with an \u003Ccode>InvalidArgumentException\u003C\u002Fcode>. A name that is no Blade view falls back to the plain PHP templates of the core. They resolve names inside their template directories only, never file paths.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F config\u002Fquittio.php\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#A5D6FF\">'pdf'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#A5D6FF\">    'template'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'invoices.acme.layout'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">,                     \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F every invoice\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#A5D6FF\">    'templates'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'invoices.*'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'mytheme::*'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">],              \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F selectable per call or per invoice\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">template\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'mytheme::invoice'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Ch2 id=\"translations\">Translations\u003Ca class=\"q-doc-anchor\" href=\"#translations\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Invoices are printed in the language of the invoice, with Quittio's labels (&quot;Rechnung&quot;, &quot;Invoice&quot; …). Labels, rule messages, code names and terms come from the core's language files \u003Ccode>labels.php\u003C\u002Fcode>, \u003Ccode>rules.php\u003C\u002Fcode>, \u003Ccode>codes.php\u003C\u002Fcode> and \u003Ccode>terms.php\u003C\u002Fcode>. They exist in German, English, French and Dutch; French and Dutch have no rule messages. They are in the translation namespace \u003Ccode>quittio\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>The core translates through Laravel's translator, so the usual overrides work:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>bash\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FFA657\">php\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> artisan\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> vendor:publish\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> --tag=quittio-lang\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">     # lang\u002Fvendor\u002Fquittio\u002F{locale}\u002F*.php\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>A published file only needs the keys you change; Laravel merges it over the package file.\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F lang\u002Fvendor\u002Fquittio\u002Fde\u002Flabels.php: \"Bitte überweisen\" (please transfer) instead of \"Zahlbetrag\" (amount due)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">return\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'amount_due'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'Bitte überweisen'\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 or at runtime\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#D2A8FF\">app\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'translator'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">addLines\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">([\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'labels.amount_due'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> =>\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> 'Bitte überweisen'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">], \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>Country packs add their own namespace \u003Ccode>quittio-{code}\u003C\u002Fcode>, e.g. \u003Ccode>quittio-de\u003C\u002Fcode> (\u003Ccode>rules.php\u003C\u002Fcode>, \u003Ccode>tax.php\u003C\u002Fcode>). Override it in \u003Ccode>lang\u002Fvendor\u002Fquittio-de\u002F{locale}\u002F\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>The Managed layer uses \u003Ccode>quittio-managed\u003C\u002Fcode> (\u003Ccode>--tag=quittio-managed-lang\u003C\u002Fcode>).\u003C\u002Fli>\n\u003Cli>Labels of a single invoice can be changed with \u003Ccode>Presentation::$labels\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Invoices are translated in the render locale, not in the application locale.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"preview-route\">Preview route\u003Ca class=\"q-doc-anchor\" href=\"#preview-route\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The preview shows the sample invoices in the browser with your design, so you can check logo, colours and texts without creating an invoice. With \u003Ccode>quittio.preview.enabled\u003C\u002Fcode> (default: only in the \u003Ccode>local\u003C\u002Fcode> environment), the provider registers two routes under \u003Ccode>quittio.preview.path\u003C\u002Fcode>, with the middleware \u003Ccode>quittio.preview.middleware\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Route\u003C\u002Fth>\n\u003Cth>Name\u003C\u002Fth>\n\u003Cth>Response\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET \u002F_quittio\u002Fpreview\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">\u003Ccode>quittio.preview.index\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Response\">List of the sample scenarios with HTML and PDF links\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>GET \u002F_quittio\u002Fpreview\u002F{scenario}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Name\">\u003Ccode>quittio.preview.show\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Response\">The scenario as HTML, with \u003Ccode>?format=pdf\u003C\u002Fcode> as inline PDF\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Query parameters of \u003Ccode>show\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>format\u003C\u002Fcode>: \u003Ccode>pdf\u003C\u002Fcode>; anything else means HTML.\u003C\u002Fli>\n\u003Cli>\u003Ccode>template\u003C\u002Fcode>: one of the views that rendering accepts (see \u003Ca href=\"#blade-templates\">Blade templates\u003C\u002Fa>): \u003Ccode>default\u003C\u002Fcode>, \u003Ccode>pdf.template\u003C\u002Fcode>, the shipped views under \u003Ccode>quittio::templates.\u003C\u002Fcode> and the views of \u003Ccode>pdf.templates\u003C\u002Fcode>, never partials. The view must exist.\u003C\u002Fli>\n\u003Cli>\u003Ccode>locale\u003C\u002Fcode>: a locale code such as \u003Ccode>en\u003C\u002Fcode> or \u003Ccode>de_CH\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Unknown scenarios, other or missing templates and invalid locales return 404, so no request can name a file or an arbitrary view.\u003C\u002Fp>\n\u003Cp>The preview renders the \u003Ca href=\"\u002Fdocs\u002Ftesting#scenarios\">sample scenarios\u003C\u002Fa> with the configured design, validation mode \u003Ccode>warn\u003C\u002Fcode> and a watermark (&quot;PREVIEW&quot;, in German &quot;VORSCHAU&quot;). The locale defaults to the scenario's locale. The routes are not registered while routes are cached (\u003Ccode>php artisan route:cache\u003C\u002Fcode>). Requests are limited to \u003Ccode>quittio.preview.throttle\u003C\u002Fcode> (default 30 per minute; \u003Ccode>null\u003C\u002Fcode> = no limit).\u003C\u002Fp>\n\u003Cp>Outside the \u003Ccode>local\u003C\u002Fcode> environment every request is refused with 403 unless the gate \u003Ccode>viewQuittioPreview\u003C\u002Fcode> allows it. Define it, like Telescope's gate, in a service provider of your application:\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\"> Illuminate\\Support\\Facades\\Gate\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Gate\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">define\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'viewQuittioPreview'\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\">User\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $user) => $user\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">is_admin);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Add \u003Ccode>auth\u003C\u002Fcode> to \u003Ccode>quittio.preview.middleware\u003C\u002Fcode> (\u003Ccode>['web', 'auth']\u003C\u002Fcode>), so that guests are sent to the login instead of getting 403. On the command line, use \u003Ccode>php artisan quittio:preview\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fcommands#quittiopreview\">Artisan commands\u003C\u002Fa>).\u003C\u002Fp>\n\u003Cp>\u003Ccode>Quittio\\Laravel\\Support\\Preview\u003C\u002Fcode> is the service behind route and command:\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>scenarios(): array\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Names of the sample scenarios\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>allowsTemplate(string $template): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Whether the preview may render this template: an existing view that rendering accepts (\u003Ccode>BladeTemplateEngine::fromSettings()\u003C\u002Fcode>), or \u003Ccode>default\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>allowsLocale(string $locale): bool\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Whether the locale code is well-formed\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>render(string $scenario, string $format = 'pdf', ?string $template = null, ?string $locale = null): RenderedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Renders a scenario (\u003Ccode>pdf\u003C\u002Fcode> or \u003Ccode>html\u003C\u002Fcode>) with the watermark; invalid arguments throw an \u003Ccode>InvalidArgumentException\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"extensions\">Extensions\u003Ca class=\"q-doc-anchor\" href=\"#extensions\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode>Quittio::extend(string $type, string $name, Closure $factory)\u003C\u002Fcode> registers a driver: your own PDF renderer, validator, XML writer or format resolver.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The factory receives the container and the driver's configuration array.\u003C\u002Fli>\n\u003Cli>It must return an instance of the expected interface, otherwise building the core fails with a \u003Ccode>ConfigurationException\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Unknown types throw an \u003Ccode>InvalidArgumentException\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>extend()\u003C\u002Fcode> forgets the built core, so call it in the \u003Ccode>boot()\u003C\u002Fcode> method of a service provider.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Type\u003C\u002Fth>\n\u003Cth>Interface\u003C\u002Fth>\n\u003Cth>Used when\u003C\u002Fth>\n\u003Cth>Configuration passed\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>renderer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Interface\">\u003Ccode>Quittio\\Core\\Pdf\\PdfRenderer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used when\">\u003Ccode>pdf.renderer\u003C\u002Fcode> is \u003Ccode>{name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Configuration passed\">\u003Ccode>pdf.renderers.{name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validator\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Interface\">\u003Ccode>Quittio\\Core\\Validation\\ValidationDriver\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used when\">\u003Ccode>{name}\u003C\u002Fcode> is listed in \u003Ccode>validation.levels\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Configuration passed\">\u003Ccode>validation.drivers.{name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>serializer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Interface\">\u003Ccode>Quittio\\Core\\Xml\\XmlSerializer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used when\">always; replaces the writer of its syntax\u003C\u002Ftd>\n\u003Ctd data-label=\"Configuration passed\">\u003Ccode>serializers.{name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>format_resolver\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Interface\">\u003Ccode>Quittio\\Core\\Formats\\FormatResolver\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used when\">\u003Ccode>format_resolver.driver\u003C\u002Fcode> is \u003Ccode>{name}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Configuration passed\">\u003Ccode>format_resolver\u003C\u002Fcode> (including \u003Ccode>peppol_lookup\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Illuminate\\Contracts\\Container\\Container\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\\Pdf\\Renderers\\CallbackRenderer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\"> boot\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> void\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#79C0FF\">    Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">extend\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'renderer'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'gotenberg'\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\">Container\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $app, \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">array\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $config) => \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">new\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> CallbackRenderer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> (\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">string\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $html) => $app\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">GotenbergClient\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::class\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">pdf\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($html, $config),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    ));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F config\u002Fquittio.php: 'pdf' => ['renderer' => 'gotenberg', 'renderers' => ['gotenberg' => ['url' => '…']]]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cul>\n\u003Cli>The callback of \u003Ccode>Quittio\\Core\\Pdf\\Renderers\\CallbackRenderer\u003C\u002Fcode> receives the HTML and the \u003Ccode>RenderRequest\u003C\u002Fcode> and returns any PDF. \u003Ccode>CallbackRenderer\u003C\u002Fcode> then turns it into PDF\u002FA-3 and embeds the XML itself (design level 4 in \u003Ca href=\"\u002Fdocs\u002Ftemplates\">Templates and design\u003C\u002Fa>).\u003C\u002Fli>\n\u003Cli>A class implementing \u003Ccode>PdfRenderer\u003C\u002Fcode> directly receives the \u003Ccode>RenderRequest\u003C\u002Fcode> (\u003Ccode>html\u003C\u002Fcode>, \u003Ccode>title\u003C\u002Fcode>, \u003Ccode>author\u003C\u002Fcode>, \u003Ccode>paper\u003C\u002Fcode>, \u003Ccode>pdfa\u003C\u002Fcode>, \u003Ccode>embedded\u003C\u002Fcode>, \u003Ccode>font\u003C\u002Fcode>) and must produce the PDF\u002FA and embed the file itself.\u003C\u002Fli>\n\u003Cli>A validator driver returns its levels, decides with \u003Ccode>supports()\u003C\u002Fcode> which subjects it checks and returns a \u003Ccode>ValidationResult\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa>).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3 id=\"macros\">Macros\u003Ca class=\"q-doc-anchor\" href=\"#macros\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>QuittioManager\u003C\u002Fcode> and \u003Ccode>PendingInvoice\u003C\u002Fcode> are macroable (\u003Ccode>macro()\u003C\u002Fcode>, \u003Ccode>mixin()\u003C\u002Fcode>, \u003Ccode>hasMacro()\u003C\u002Fcode>, \u003Ccode>flushMacros()\u003C\u002Fcode>). Use a macro for a combination of options you need often:\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\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Rendering\\PendingInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">PendingInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">macro\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'forPublicBuyer'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">, \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">function\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> () {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#8B949E\">    \u002F** \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">@var\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> PendingInvoice\u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\"> $this *\u002F\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    return\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> $this\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\">locale\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'de'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">});\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">make\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($invoice)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">forPublicBuyer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">render\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Builder macros are described in \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#macros\">Macros\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"peppol-lookup\">Peppol lookup\u003Ca class=\"q-doc-anchor\" href=\"#peppol-lookup\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Peppol is an international network for delivering e-invoices (\u003Ca href=\"\u002Fdocs\u002Fconcepts#formats\">Formats\u003C\u002Fa>). The default format resolver chooses the format \u003Ccode>peppol\u003C\u002Fcode> only with a lookup that tells whether a buyer is reachable via Peppol (see \u003Ca href=\"\u002Fdocs\u002Fformats#peppol-lookup\">Formats and profiles\u003C\u002Fa>). Quittio ships no Peppol directory client, so you provide the lookup.\u003C\u002Fp>\n\u003Cp>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 whether the buyer is reachable via Peppol:\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\"> Illuminate\\Support\\Facades\\Cache\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Core\\Data\\Party\\BuyerParty\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">final\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> class\u003C\u002Fspan>\u003Cspan style=\"color:#FFA657\"> PeppolDirectoryLookup\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">{\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> __construct\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">private\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> PeppolDirectory\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $directory) {}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#FF7B72\">    public\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> function\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> __invoke\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>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        $address \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $buyer\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">electronicAddress;                        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F BT-49\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        if\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ($address \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">===\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> null\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:14ch;text-indent:-14ch\">\u003Cspan style=\"color:#FF7B72\">            return\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> false\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#E6EDF3\">        $participant \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">=\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> $address\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">scheme\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">value\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">':'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">$address\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">value;  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F e.g. 0208:0123456749\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:10ch;text-indent:-10ch\">\u003Cspan style=\"color:#FF7B72\">        return\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Cache\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">remember\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'peppol:'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">.\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">$participant, \u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">now\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">addDay\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(), \u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">fn\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> ()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">:\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> bool\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> => \u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">$this\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">directory\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">isRegistered\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">($participant));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#E6EDF3\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#E6EDF3\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F config\u002Fquittio.php: 'format_resolver' => ['peppol_lookup' => PeppolDirectoryLookup::class, …]\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>The lookup runs for every automatic choice with a business buyer that no domestic country rule decided (for German sellers: cross-border invoices), so cache its answers. A resolver registered with \u003Ccode>Quittio::extend('format_resolver', …)\u003C\u002Fcode> receives the value in its configuration and decides itself whether to use it.\u003C\u002Fp>\n\u003Ch2 id=\"logging\">Logging\u003Ca class=\"q-doc-anchor\" href=\"#logging\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The manager passes Laravel's logger (\u003Ccode>Psr\\Log\\LoggerInterface\u003C\u002Fcode>, the default log channel) to the core. The logger receives the warnings of the mandatory field guard in mode \u003Ccode>log\u003C\u002Fcode> (\u003Ccode>validation.mandatory_field_guard\u003C\u002Fcode>; the default in production). To route them elsewhere, listen for the \u003Ccode>MandatoryFieldMissing\u003C\u002Fcode> event, which is dispatched in the modes \u003Ccode>log\u003C\u002Fcode> and \u003Ccode>exception\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"country-packs\">Country packs\u003Ca class=\"q-doc-anchor\" href=\"#country-packs\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Country packs bring the rules, tax presets and texts of a country. They are discovered from Composer metadata, listed in \u003Ccode>quittio.countries\u003C\u002Fcode> or registered with \u003Ccode>Quittio::registerCountry()\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fconfiguration#country-packs\">Configuration\u003C\u002Fa>). Their translations, profiles, formats and rules are registered with them. Available packs and writing your own: \u003Ca href=\"\u002Fdocs\u002Fcountry-packs\">Country packs\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"managed-layer\">Managed layer\u003Ca class=\"q-doc-anchor\" href=\"#managed-layer\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode> stores invoices in the database and builds on this package:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It renders through the same \u003Ccode>QuittioManager\u003C\u002Fcode>, so configuration, templates, events and \u003Ccode>Quittio::fake()\u003C\u002Fcode> apply.\u003C\u002Fli>\n\u003Cli>It reads \u003Ccode>pdf.template\u003C\u002Fcode> and \u003Ccode>pdf.templates\u003C\u002Fcode> to check issuer branding.\u003C\u002Fli>\n\u003Cli>It uses \u003Ccode>corrections.cancellation_strategy\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>It adds commands and implements two contracts of this package:\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Contract\u003C\u002Fth>\n\u003Cth>Used by\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Laravel\\Contracts\\ManagedInstaller\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>php artisan quittio:install --managed\u003C\u002Fcode> (migrations, first issuer profile)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Laravel\\Contracts\\ManagedInvoiceRenderer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Used by\">\u003Ccode>php artisan quittio:render {invoice}\u003C\u002Fcode> (render a stored invoice again)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Issuer profiles replace the \u003Ccode>seller\u003C\u002Fcode> section, and the Managed archive uses its own disk and queue settings (\u003Ccode>config\u002Fquittio-managed.php\u003C\u002Fcode>). See \u003Ca href=\"\u002Fdocs\u002Fmanaged\">Managed layer\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"reference\">Reference\u003Ca class=\"q-doc-anchor\" href=\"#reference\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The tables below list the methods by purpose. The \u003Ca href=\"\u002Fdocs\u002Fapi\u002FQuittio\u002FLaravel\u002FQuittioManager\">API reference\u003C\u002Fa> has every public class and method with its parameters, generated from the code of this version.\u003C\u002Fp>\n\u003Ch3 id=\"facade\">Facade\u003Ca class=\"q-doc-anchor\" href=\"#facade\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#FF7B72\">use\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">;\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Instead of the facade you can inject \u003Ccode>Quittio\\Laravel\\QuittioManager\u003C\u002Fcode>; both are the same singleton.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Returns\u003C\u002Fth>\n\u003Cth>Description\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>make(InvoiceData|ProvidesInvoiceData|InvoiceBuilder $data)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>PendingInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Starts a render call. A builder is built, a \u003Ccode>ProvidesInvoiceData\u003C\u002Fcode> model converted with \u003Ccode>toInvoiceData()\u003C\u002Fcode>. See \u003Ca href=\"#rendering-invoices\">Rendering invoices\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>invoice()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>RenderableInvoiceBuilder\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">A new invoice with the seller of the configuration (or of the current issuer of the Managed layer); ends with \u003Ccode>build()\u003C\u002Fcode> or \u003Ccode>render()\u003C\u002Fcode> (see \u003Ca href=\"#starting-invoices\">Starting invoices\u003C\u002Fa>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quote()\u003C\u002Fcode>, \u003Ccode>orderConfirmation()\u003C\u002Fcode>, \u003Ccode>deliveryNote()\u003C\u002Fcode>, \u003Ccode>proforma()\u003C\u002Fcode>, \u003Ccode>paymentReminder(int $level = 0)\u003C\u002Fcode>, \u003Ccode>accountStatement()\u003C\u002Fcode>, \u003Ccode>bonusStatement()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>RenderableDocumentBuilder\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">A new document with the seller of the configuration; ends with \u003Ccode>build()\u003C\u002Fcode> or \u003Ccode>render()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>document(DocumentData|DocumentBuilder $document)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>PendingDocument\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Starts a render call for a quote, order confirmation, delivery note, proforma invoice, payment reminder or account statement (see \u003Ca href=\"#documents\">Documents\u003C\u002Fa>).\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>cancellation(InvoiceData $original, string $number, ?string $reason = null, ?string $strategy = null, ?Date $issueDate = null, ?array $lines = null, ?CancellationHistory $history = null, ?string $title = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>InvoiceBuilder\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Builder for the cancellation of an issued invoice; render it with \u003Ccode>make()\u003C\u002Fcode>. \u003Ccode>$title\u003C\u002Fcode> is the document title in the PDF, e.g. &quot;Stornorechnung&quot; (cancellation invoice); \u003Ccode>null\u003C\u002Fcode> = the title of the country pack's correction policy. See \u003Ca href=\"#cancellations\">Cancellations\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>check(InvoiceData $invoice, RenderOptions $options)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Validates like a render run; the fluent form is \u003Ccode>Quittio::make($invoice)-&gt;check()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>prepare(InvoiceData $invoice, RenderOptions $options)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>PreparedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Calculates and validates without rendering; fluent form \u003Ccode>-&gt;prepare()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>read(string $content)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ReadResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Reads an incoming XML or PDF e-invoice from its content (bytes, never a path). See \u003Ca href=\"\u002Fdocs\u002Freading\">Reading incoming invoices\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>readFile(string $path)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ReadResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The same from a file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validateFile(string $content)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Reads and validates an incoming XML or PDF (content) with all configured levels. See \u003Ca href=\"\u002Fdocs\u002Fvalidation#incoming-files\">Validation\u003C\u002Fa>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validatePath(string $path)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ValidationResult\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The same from a file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>renderInvoice(InvoiceData $invoice, RenderOptions $options)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>RenderedInvoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The render run behind \u003Ccode>PendingInvoice::render()\u003C\u002Fcode>, with events\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>renderDocument(DocumentData $document, RenderOptions $options)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>RenderedDocument\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The render run behind \u003Ccode>PendingDocument::render()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>extend(string $type, string $name, Closure $factory)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>QuittioManager\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Registers a renderer, validator, serializer or format resolver (see \u003Ca href=\"#extensions\">Extensions\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>registerCountry(CountryPack $pack)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>QuittioManager\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Registers a country pack; it wins over configured and discovered packs with the same code\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>defaultVat(?string $sellerCountry, bool $smallBusiness)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>?TaxPreset\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Default VAT of lines without \u003Ccode>-&gt;vat()\u003C\u002Fcode>: \u003Ccode>defaults.vat\u003C\u002Fcode>, otherwise the standard preset of the seller's country pack, for small businesses its small business preset (\u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#default-vat\">Default VAT\u003C\u002Fa>). The service provider installs it with \u003Ccode>InvoiceBuilder::useDefaultVat()\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>countries()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>CountryRegistry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Active country packs: \u003Ccode>all()\u003C\u002Fcode>, \u003Ccode>has($code)\u003C\u002Fcode>, \u003Ccode>get($code)\u003C\u002Fcode>, \u003Ccode>getOrGeneric($code)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>profiles()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>ProfileRegistry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Profiles of the core and the country packs: \u003Ccode>all()\u003C\u002Fcode>, \u003Ccode>has($key)\u003C\u002Fcode>, \u003Ccode>get($key)\u003C\u002Fcode>, \u003Ccode>bySpecificationId($id)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>formats()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>FormatRegistry\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Output formats: \u003Ccode>all()\u003C\u002Fcode>, \u003Ccode>has($key)\u003C\u002Fcode>, \u003Ccode>get($key)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>settings()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Settings\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Typed access to \u003Ccode>config('quittio')\u003C\u002Fcode> (see \u003Ca href=\"#settings\">Settings\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>flush()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>QuittioManager\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Forgets the built core; the next call builds it again. Configuration changes do not need it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>core()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Quittio\\Core\\Quittio\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">The core instance, e.g. \u003Ccode>Quittio::core()-&gt;config()\u003C\u002Fcode> or \u003Ccode>-&gt;validators()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>coreWithLevels(array $levels)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Quittio\\Core\\Quittio\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">A new core (the cached one stays unchanged) that validates with \u003Ccode>validation.levels\u003C\u002Fcode> plus \u003Ccode>$levels\u003C\u002Fcode>, e.g. \u003Ccode>['kosit', 'verapdf']\u003C\u002Fcode>, every driver with its settings of \u003Ccode>validation.drivers.*\u003C\u002Fcode>; used by \u003Ccode>quittio:validate --kosit --verapdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>macro()\u003C\u002Fcode>, \u003Ccode>mixin()\u003C\u002Fcode>, \u003Ccode>hasMacro()\u003C\u002Fcode>, \u003Ccode>flushMacros()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Macros of the manager (see \u003Ca href=\"#macros\">Macros\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>fake()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>QuittioFake\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Replaces rendering in tests (see \u003Ca href=\"\u002Fdocs\u002Ftesting#fake\">Testing\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>assertRendered()\u003C\u002Fcode>, \u003Ccode>assertRenderedCount()\u003C\u002Fcode>, \u003Ccode>assertNothingRendered()\u003C\u002Fcode>, \u003Ccode>assertDocumentRendered()\u003C\u002Fcode>, \u003Ccode>rendered()\u003C\u002Fcode>, \u003Ccode>documents()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Description\">Assertions and recordings of the fake, only after \u003Ccode>fake()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The manager builds the core lazily, on the first call that needs it. It uses the configuration, the country packs, the Blade template engine, the PDF renderer, the logger and your extensions.\u003C\u002Fp>\n\u003Ch3 id=\"settings\">Settings\u003Ca class=\"q-doc-anchor\" href=\"#settings\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>\u003Ccode>Quittio::settings()\u003C\u002Fcode> returns \u003Ccode>Quittio\\Laravel\\Support\\Settings\u003C\u002Fcode>: typed read access to \u003Ccode>config('quittio')\u003C\u002Fcode> with dot notation. Wrong types throw a \u003Ccode>ConfigurationException\u003C\u002Fcode> naming the key.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Method\u003C\u002Fth>\n\u003Cth>Returns\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>get(string $key, mixed $default = null)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Raw value\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>string(string $key, string $default)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">String; \u003Ccode>null\u003C\u002Fcode> and \u003Ccode>''\u003C\u002Fcode> give the default\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>nullableString(string $key)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">String or \u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>bool(string $key, bool $default)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Boolean\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>int(string $key, int $default)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Integer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>array(string $key)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">Array (missing = \u003Ccode>[]\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>strings(string $key)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">The string values of a list\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>section(string $key)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Returns\">\u003Ccode>Settings\u003C\u002Fcode> for a sub-array, e.g. \u003Ccode>section('validation.drivers.kosit')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"service-provider\">Service provider\u003Ca class=\"q-doc-anchor\" href=\"#service-provider\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>The package registers itself through Laravel's package discovery (\u003Ccode>composer.json\u003C\u002Fcode>: \u003Ccode>extra.laravel\u003C\u002Fcode>): the provider \u003Ccode>Quittio\\Laravel\\QuittioServiceProvider\u003C\u002Fcode> and the alias \u003Ccode>Quittio\u003C\u002Fcode> for \u003Ccode>Quittio\\Laravel\\Facades\\Quittio\u003C\u002Fcode>. With \u003Ccode>&quot;dont-discover&quot;: [&quot;quittio\u002Flaravel&quot;]\u003C\u002Fcode> in your \u003Ccode>composer.json\u003C\u002Fcode>, register both yourself in \u003Ccode>bootstrap\u002Fproviders.php\u003C\u002Fcode> and \u003Ccode>config\u002Fapp.php\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Registered\u003C\u002Fth>\n\u003Cth>Details\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Configuration\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">\u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> merged with the package defaults (see \u003Ca href=\"\u002Fdocs\u002Fconfiguration\">Configuration\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Laravel\\QuittioManager\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Singleton behind the facade, also available as \u003Ccode>app('quittio')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Laravel\\Contracts\\InvoiceDefaults\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Bound to \u003Ccode>ConfigInvoiceDefaults\u003C\u002Fcode> unless already bound (see \u003Ca href=\"#seller-from-the-configuration\">Seller from the configuration\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Laravel\\Support\\Preview\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Singleton that renders the sample scenarios (see \u003Ca href=\"#preview-route\">Preview route\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>Quittio\\Core\\Serialization\\Snapshots\\SnapshotUpcasterChain\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Singleton with the upcasters of \u003Ccode>quittio.snapshots.upcasters\u003C\u002Fcode>; also the default chain of \u003Ccode>InvoiceData::fromSnapshot()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Default VAT\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">\u003Ccode>InvoiceBuilder::useDefaultVat()\u003C\u002Fcode> with \u003Ccode>Quittio::defaultVat()\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fbuilding-invoices#default-vat\">Default VAT\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Views\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Namespace \u003Ccode>quittio\u003C\u002Fcode> (\u003Ccode>quittio::templates.default.layout\u003C\u002Fcode>, its partials, \u003Ccode>quittio::preview.index\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Translations\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Namespace \u003Ccode>quittio\u003C\u002Fcode> with the labels and messages of the core; the core uses Laravel's translator (see \u003Ca href=\"#translations\">Translations\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Routes\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">The preview routes, when enabled\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Commands\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">\u003Ccode>quittio:*\u003C\u002Fcode> and \u003Ccode>make:quittio-template\u003C\u002Fcode> (console only, see \u003Ca href=\"\u002Fdocs\u002Fcommands\">Artisan commands\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Publish tags\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">\u003Ccode>quittio-config\u003C\u002Fcode>, \u003Ccode>quittio-views\u003C\u002Fcode>, \u003Ccode>quittio-lang\u003C\u002Fcode>, \u003Ccode>quittio-fonts\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fcommands#publish-tags\">Artisan commands\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>php artisan about\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Details\">Section &quot;Quittio&quot; with the active country packs and profiles\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Country packs bring their own provider. The German pack registers \u003Ccode>Quittio\\Country\\DE\\Laravel\\GermanyServiceProvider\u003C\u002Fcode> (discovered as well): it merges the defaults of its settings into \u003Ccode>quittio.countries.de\u003C\u002Fcode>, registers the configured base rates, the command \u003Ccode>quittio:base-rate:update\u003C\u002Fcode> and the publish tag \u003Ccode>quittio-de-config\u003C\u002Fcode> (\u003Ccode>config\u002Fquittio\u002Fcountries\u002Fde.php\u003C\u002Fcode>, see \u003Ca href=\"\u002Fdocs\u002Fconfiguration#country-pack-germany-quittiocountriesde\">Country pack Germany\u003C\u002Fa>).\u003C\u002Fp>\n",[111,115,118,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,169,172,175,178,181,184,187,190,191,194,197,200,203],{"id":112,"text":113,"level":114},"overview","Overview",2,{"id":116,"text":117,"level":114},"starting-invoices","Starting invoices",{"id":119,"text":120,"level":121},"another-seller","Another seller",3,{"id":123,"text":124,"level":121},"seller-from-the-configuration","Seller from the configuration",{"id":126,"text":127,"level":114},"rendering-invoices","Rendering invoices",{"id":129,"text":130,"level":121},"pendinginvoice","PendingInvoice",{"id":132,"text":133,"level":121},"fallback-order","Fallback order",{"id":135,"text":136,"level":121},"render-options","Render options",{"id":138,"text":139,"level":121},"validation-per-call","Validation per call",{"id":141,"text":142,"level":121},"renderedinvoice","RenderedInvoice",{"id":144,"text":145,"level":114},"saving-downloading-and-mailing","Saving, downloading and mailing",{"id":147,"text":148,"level":121},"file-names","File names",{"id":150,"text":151,"level":121},"responses","Responses",{"id":153,"text":154,"level":121},"storage","Storage",{"id":156,"text":157,"level":121},"mail-attachments","Mail attachments",{"id":159,"text":160,"level":114},"queueing","Queueing",{"id":162,"text":163,"level":114},"events","Events",{"id":165,"text":166,"level":114},"cancellations","Cancellations",{"id":55,"text":168,"level":114},"Documents",{"id":170,"text":171,"level":114},"blade-templates","Blade templates",{"id":173,"text":174,"level":114},"translations","Translations",{"id":176,"text":177,"level":114},"preview-route","Preview route",{"id":179,"text":180,"level":114},"extensions","Extensions",{"id":182,"text":183,"level":121},"macros","Macros",{"id":185,"text":186,"level":114},"peppol-lookup","Peppol lookup",{"id":188,"text":189,"level":114},"logging","Logging",{"id":73,"text":74,"level":114},{"id":192,"text":193,"level":114},"managed-layer","Managed layer",{"id":195,"text":196,"level":114},"reference","Reference",{"id":198,"text":199,"level":121},"facade","Facade",{"id":201,"text":202,"level":121},"settings","Settings",{"id":204,"text":205,"level":121},"service-provider","Service provider","https:\u002F\u002Fgithub.com\u002FQuittio\u002Fquittio\u002Fedit\u002Fmaster\u002Fdocs\u002Flaravel.md","\u002Fdocs\u002Flaravel.md",{"slug":58,"title":59},{"slug":64,"title":65}]