[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs:commands":3},{"versions":4,"version":26,"nav":28,"path":67,"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":68,"description":108,"html":109,"headings":110,"editUrl":182,"markdownUrl":183,"prev":184,"next":185},"This page lists every Artisan command of Quittio and every publish tag for vendor:publish.","\u003Ch1 id=\"artisan-commands\">Artisan commands\u003C\u002Fh1>\n\u003Cp>This page lists every Artisan command of Quittio and every publish tag for \u003Ccode>vendor:publish\u003C\u002Fcode>. You need it when you install Quittio, check the invoice design, validate e-invoice files (locally or in CI) and schedule recurring tasks. The commands are grouped by purpose: \u003Ca href=\"#setup\">Setup\u003C\u002Fa>, \u003Ca href=\"#preview-and-testing\">Preview and testing\u003C\u002Fa>, \u003Ca href=\"#maintenance\">Maintenance\u003C\u002Fa> and \u003Ca href=\"#package-development\">Package development\u003C\u002Fa>. Terms such as XRechnung, Peppol, profile or KoSIT are explained in \u003Ca href=\"\u002Fdocs\u002Fconcepts\">E-invoicing basics\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>Three packages register commands:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>quittio\u002Flaravel\u003C\u002Fcode> registers the general commands (console only).\u003C\u002Fli>\n\u003Cli>\u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode> adds the commands for stored invoices and extends \u003Ccode>quittio:install\u003C\u002Fcode> and \u003Ccode>quittio:render\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>quittio\u002Fcountry-de\u003C\u002Fcode> adds \u003Ccode>quittio:base-rate:update\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Every command returns exit code \u003Ccode>0\u003C\u002Fcode> on success and \u003Ccode>1\u003C\u002Fcode> on failure. The failure cases are listed per command, so CI jobs and the scheduler can react to them.\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\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Group\u003C\u002Fth>\n\u003Cth>Command\u003C\u002Fth>\n\u003Cth>Package\u003C\u002Fth>\n\u003Cth>Purpose\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Setup\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittioinstall\">\u003Ccode>quittio:install\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Publish the configuration (with that of the country packs), optionally templates and fonts; \u003Ccode>--managed\u003C\u002Fcode> installs the Managed layer\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Setup\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiocountries\">\u003Ccode>quittio:countries\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Show the installed country packs\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Setup\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#makequittio-template\">\u003Ccode>make:quittio-template\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Create a template from the default template\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Setup\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittioschemasdownload\">\u003Ccode>quittio:schemas:download\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Download the KoSIT validator and the XRechnung configuration, compile the Peppol rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Preview and testing\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiopreview\">\u003Ccode>quittio:preview\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Render a sample invoice with the configured design\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Preview and testing\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiorender\">\u003Ccode>quittio:render\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel, managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Render an invoice from a JSON file, or render a stored invoice again\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Preview and testing\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiovalidate\">\u003Ccode>quittio:validate\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Validate an XML or PDF e-invoice and print a report\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Preview and testing\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittioread\">\u003Ccode>quittio:read\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Read an e-invoice and show its content\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Preview and testing\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiobenchmark\">\u003Ccode>quittio:benchmark\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Measure rendering performance\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittioverify\">\u003Ccode>quittio:verify\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Check the hashes of the archived documents\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiodraftsprune\">\u003Ccode>quittio:drafts:prune\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Delete left-behind cancellation and correction drafts\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittioretentioncheck\">\u003Ccode>quittio:retention:check\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">List (and delete) invoices past their retention period\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiosequenceshow\">\u003Ccode>quittio:sequence:show\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Show the number sequences\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiosequenceset\">\u003Ccode>quittio:sequence:set\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Increase a number sequence\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Maintenance\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiobase-rateupdate\">\u003Ccode>quittio:base-rate:update\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">country-de\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Fetch the German base rate (Basiszinssatz, section 247 of the German Civil Code BGB) from the Deutsche Bundesbank\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Package development\u003C\u002Ftd>\n\u003Ctd data-label=\"Command\">\u003Ca href=\"#quittiocodelistsupdate\">\u003Ccode>quittio:codelists:update\u003C\u002Fcode>\u003C\u002Fa>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Purpose\">Regenerate the code lists\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>php artisan about\u003C\u002Fcode> shows a section &quot;Quittio&quot; with the active country packs and profiles.\u003C\u002Fp>\n\u003Cp>Commands that ask for confirmation (\u003Ccode>quittio:sequence:set\u003C\u002Fcode>, \u003Ccode>quittio:retention:check --delete\u003C\u002Fcode>, \u003Ccode>quittio:drafts:prune\u003C\u002Fcode>) treat a run without interaction as &quot;no&quot; and exit with \u003Ccode>1\u003C\u002Fcode>. Runs without interaction are \u003Ccode>--no-interaction\u003C\u002Fcode>, the scheduler and CI; pass \u003Ccode>--force\u003C\u002Fcode> there.\u003C\u002Fp>\n\u003Ch2 id=\"setup\">Setup\u003Ca class=\"q-doc-anchor\" href=\"#setup\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Run these commands when you install Quittio or change its setup.\u003C\u002Fp>\n\u003Ch3 id=\"quittioinstall\">quittio:install\u003Ca class=\"q-doc-anchor\" href=\"#quittioinstall\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:install\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--views}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--fonts}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--managed}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\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>Option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--views\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Also publish the Blade templates (\u003Ccode>quittio-views\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--fonts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Also publish the fonts (\u003Ccode>quittio-fonts\u003C\u002Fcode>, to \u003Ccode>resources\u002Ffonts\u002Fquittio\u002Fgeist\u003C\u002Fcode> and \u003Ccode>resources\u002Ffonts\u002Fquittio\u002Finter\u003C\u002Fcode>). The renderer searches \u003Ccode>resources\u002Ffonts\u002Fquittio\u003C\u002Fcode> and its subdirectories automatically.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--managed\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Also install the Managed layer (needs \u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Overwrite existing files\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The command publishes \u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (tag \u003Ccode>quittio-config\u003C\u002Fcode>), the settings of every installed country pack that has some (tags \u003Ccode>quittio-{code}-config\u003C\u002Fcode>, e.g. \u003Ccode>quittio-de-config\u003C\u002Fcode>: \u003Ccode>config\u002Fquittio\u002Fcountries\u002Fde.php\u003C\u002Fcode>) and the selected tags. Then it prints the next steps: set the seller, install a country pack, run the preview. It exits with \u003Ccode>1\u003C\u002Fcode> when \u003Ccode>--managed\u003C\u002Fcode> is given without \u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>With \u003Ccode>--managed\u003C\u002Fcode>, the Managed installer then:\u003C\u002Fp>\n\u003Col>\n\u003Cli>publishes \u003Ccode>config\u002Fquittio-managed.php\u003C\u002Fcode> (\u003Ccode>quittio-managed-config\u003C\u002Fcode>; overwritten with \u003Ccode>--force\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>publishes the migrations (\u003Ccode>quittio-managed-migrations\u003C\u002Fcode>) unless they were published before. It detects them by file name, because \u003Ccode>vendor:publish\u003C\u002Fcode> gives migrations new timestamps.\u003C\u002Fli>\n\u003Cli>asks &quot;Run the migrations now?&quot; (default yes) and runs \u003Ccode>migrate --force\u003C\u002Fcode>. When you decline, it prints the next steps and ends with exit code \u003Ccode>0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>asks for the first issuer profile, if none exists: key (\u003Ccode>default\u003C\u002Fcode>), company name (required), street and number, postcode, city, country (\u003Ccode>DE\u003C\u002Fcode>), VAT identifier, tax number (only without VAT identifier), e-mail address for invoices (contact and electronic address), IBAN, BIC (only with IBAN) and time zone. The time zone defaults to \u003Ccode>app.timezone\u003C\u002Fcode>, or to \u003Ccode>Europe\u002FBerlin\u003C\u002Fcode> for Germany when that is UTC. The profile becomes the default issuer.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Without interaction (\u003Ccode>-n\u003C\u002Fcode>), it runs the migrations without asking and skips the issuer profile. The immutability triggers are not published; publish them separately (see \u003Ca href=\"\u002Fdocs\u002Fmanaged#immutability\">Managed layer\u003C\u002Fa>). It exits with \u003Ccode>1\u003C\u002Fcode> when the migrations or the database fail.\u003C\u002Fp>\n\u003Ch3 id=\"quittiocountries\">quittio:countries\u003Ca class=\"q-doc-anchor\" href=\"#quittiocountries\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:countries\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Lists the active country packs: code, class, profiles, number of rules and format rules, and the defaults (currency, locale, profile). Without a country pack, it warns that only EN 16931 rules are checked (exit code \u003Ccode>0\u003C\u002Fcode>). See \u003Ca href=\"\u002Fdocs\u002Fcountry-packs\">Country packs\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"makequittio-template\">make:quittio-template\u003Ca class=\"q-doc-anchor\" href=\"#makequittio-template\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> make:quittio-template\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {name}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\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>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>name\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Template name: lower-case letters, digits, \u003Ccode>-\u003C\u002Fcode> and \u003Ccode>_\u003C\u002Fcode>, starting with a letter or digit\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Overwrite an existing template\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Copies the default template (\u003Ccode>layout.blade.php\u003C\u002Fcode> and \u003Ccode>partials\u002F\u003C\u002Fcode>) to \u003Ccode>resources\u002Fviews\u002Finvoices\u002F{name}\u003C\u002Fcode> and points the layout to its own partials. Use the new template per call with \u003Ccode>-&gt;template('invoices.{name}.layout')\u003C\u002Fcode> (allowed by the default \u003Ccode>pdf.templates\u003C\u002Fcode>), or for every invoice with \u003Ccode>pdf.template\u003C\u002Fcode>. An invalid name, or an existing template without \u003Ccode>--force\u003C\u002Fcode>, exits with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Ftemplates\">Templates and design\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittioschemasdownload\">quittio:schemas:download\u003Ca class=\"q-doc-anchor\" href=\"#quittioschemasdownload\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:schemas:download\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--path=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--without-peppol}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--java=java}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Installs the official validators for local checks and CI: the KoSIT validator (the validator for XRechnung and EN 16931, published by KoSIT, the agency behind XRechnung) and the rules of Peppol BIS Billing. Quittio uses them for the validation level L5 (\u003Ca href=\"\u002Fdocs\u002Fvalidation#kosit-validator-l5\">KoSIT validator\u003C\u002Fa>).\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Option\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--path\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>storage\u002Fquittio\u002Fvalidators\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Target directory\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Download and compile again, also when the files exist\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--without-peppol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Skip compiling the Peppol BIS Billing 3.0 rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--java\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>java\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Java binary for compiling the Peppol rules\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>It downloads into the target directory:\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>File\u003C\u002Fth>\n\u003Cth>Content\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>validator.jar\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">KoSIT validator 1.6.3 (standalone)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xrechnung\u002F\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">XRechnung validator configuration (release \u003Ccode>v2026-08-31\u003C\u002Fcode>, XRechnung 3.0.2), with \u003Ccode>scenarios.xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>peppol\u002FPEPPOL-EN16931-UBL.xsl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Content\">Peppol BIS Billing 3.0 rules (Schematron, a rule language for XML, \u003Ccode>v3.0.20\u003C\u002Fcode>), compiled with SchXslt 1.10.1 and the Saxon of the validator JAR\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Every download is checked against the SHA-256 checksum pinned in \u003Ccode>KositArtifacts::SHA256\u003C\u002Fcode>; a file that does not match is discarded and the command fails. Existing files are kept unless \u003Ccode>--force\u003C\u002Fcode> is given. The command needs the PHP \u003Ccode>zip\u003C\u002Fcode> extension. Compiling the Peppol rules and running the validator need Java 11 or newer.\u003C\u002Fp>\n\u003Cp>Afterwards it prints:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the configuration for \u003Ccode>validation.drivers.kosit\u003C\u002Fcode> in mode \u003Ccode>cli\u003C\u002Fcode> (\u003Ccode>jar\u003C\u002Fcode>, \u003Ccode>scenarios\u003C\u002Fcode>, \u003Ccode>repository\u003C\u002Fcode> and, with Peppol, \u003Ccode>configurations\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>a reminder to add \u003Ccode>kosit\u003C\u002Fcode> to \u003Ccode>validation.levels\u003C\u002Fcode>,\u003C\u002Fli>\n\u003Cli>the command that starts the validator as a daemon for the default mode \u003Ccode>daemon\u003C\u002Fcode>, on the port of \u003Ccode>validation.drivers.kosit.url\u003C\u002Fcode>. The default URL is \u003Ccode>http:\u002F\u002F127.0.0.1:8081\u003C\u002Fcode>, so the command contains \u003Ccode>-P 8081\u003C\u002Fcode>; the validator's own default port is 8080.\u003C\u002Fli>\n\u003C\u002Ful>\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\">java\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -jar\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '…\u002Fvalidators\u002Fvalidator.jar'\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -s\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '…\u002Fvalidators\u002Fxrechnung\u002Fscenarios.xml'\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '…\u002Fvalidators\u002Fxrechnung'\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\"> \\\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:6ch;text-indent:-6ch\">\u003Cspan style=\"color:#79C0FF\">    -s\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '…\u002Fpeppol-scenarios.xml'\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -r\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> '…\u002Fvalidators'\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -D\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> -P\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\"> 8081\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Download and compile errors exit with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fvalidation#kosit-validator-l5\">Validation\u003C\u002Fa> and \u003Ca href=\"\u002Fdocs\u002Ftesting#official-validators-in-ci\">Official validators in CI\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"preview-and-testing\">Preview and testing\u003Ca class=\"q-doc-anchor\" href=\"#preview-and-testing\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Use these commands to check the design, to render invoices from files and to check e-invoice files, e.g. in CI or when a customer sends you an invoice.\u003C\u002Fp>\n\u003Ch3 id=\"quittiopreview\">quittio:preview\u003Ca class=\"q-doc-anchor\" href=\"#quittiopreview\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:preview\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--scenario=simple}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--template=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--format=pdf}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--locale=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--output=}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Renders a sample invoice with your design (logo, colours, texts, template) into a file. The sample invoices use sample data, not your seller.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Option\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--scenario\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>simple\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Sample scenario (see \u003Ca href=\"\u002Fdocs\u002Ftesting#scenarios\">Scenarios\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--template\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">configured\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">A view that rendering accepts: \u003Ccode>default\u003C\u002Fcode>, the configured \u003Ccode>pdf.template\u003C\u002Fcode>, a view under \u003Ccode>quittio::templates.\u003C\u002Fcode> or one of \u003Ccode>pdf.templates\u003C\u002Fcode>, e.g. \u003Ccode>invoices.acme.layout\u003C\u002Fcode> from \u003Ccode>make:quittio-template\u003C\u002Fcode>. No partials; the view must exist.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>pdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">\u003Ccode>pdf\u003C\u002Fcode> or \u003Ccode>html\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--locale\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">scenario locale (\u003Ccode>de\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Locale of the labels\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--output\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>storage\u002Fapp\u002Fquittio\u002Fpreview\u002F{scenario}.{format}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Target file; missing directories are created\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The command renders the scenario with the configured design, validation mode \u003Ccode>warn\u003C\u002Fcode> and the watermark &quot;PREVIEW&quot; (&quot;VORSCHAU&quot; in German), like the \u003Ca href=\"\u002Fdocs\u002Flaravel#preview-route\">preview route\u003C\u002Fa>. Unknown scenarios, formats, templates or invalid locales exit with \u003Ccode>1\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiorender\">quittio:render\u003Ca class=\"q-doc-anchor\" href=\"#quittiorender\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:render\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {invoice?}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--json=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--format=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--profile=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--output=}\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>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>invoice\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Number, UUID or id of a stored invoice of the Managed layer (see below). Takes precedence over \u003Ccode>--json\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">JSON file with invoice data in the format of \u003Ccode>InvoiceData::toJson()\u003C\u002Fcode> (see \u003Ca href=\"\u002Fdocs\u002Fgetting-started#json\">Getting started\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Output format; default: \u003Ccode>defaults.format\u003C\u002Fcode>, else the automatic choice\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Profile\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--output\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Directory (an existing one or a path ending in \u003Ccode>\u002F\u003C\u002Fcode>; the file gets \u003Ccode>filename()\u003C\u002Fcode>) or target file; missing directories are created; default: the current directory. A file that cannot be written fails the command\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Cstrong>From a JSON file.\u003C\u002Fstrong> With \u003Ccode>--json\u003C\u002Fcode>, the command renders like \u003Ccode>Quittio::make($data)-&gt;format(…)-&gt;profile(…)-&gt;render()\u003C\u002Fcode>, with the configured validation mode. It writes the main output (\u003Ccode>contents()\u003C\u002Fcode>): the PDF of \u003Ccode>zugferd\u003C\u002Fcode> and \u003Ccode>pdf\u003C\u002Fcode>, the XML of the XML formats. It prints the number, format, profile and path, and the findings when there are warnings. Validation errors are printed as a table and exit with \u003Ccode>1\u003C\u002Fcode>. A missing \u003Ccode>--json\u003C\u002Fcode>, an unreadable file and any other error exit with \u003Ccode>1\u003C\u002Fcode> as well.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>A stored invoice (Managed layer).\u003C\u002Fstrong> With \u003Ccode>invoice\u003C\u002Fcode> (and \u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode> installed), the command renders an issued invoice whose documents are missing or failed:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>It looks up a UUID first, then the number (a number used by several issuers must be given as UUID), then the numeric id.\u003C\u002Fli>\n\u003Cli>When the current document version is complete, it reports that and exits with \u003Ccode>0\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>Missing files are rendered as a new document version; existing files are never overwritten. The command lists the missing files and the new version.\u003C\u002Fli>\n\u003Cli>Damaged files (hash mismatch) dispatch \u003Ccode>ArchiveIntegrityViolation\u003C\u002Fcode> and exit with \u003Ccode>1\u003C\u002Fcode>. Drafts and unknown invoices exit with \u003Ccode>1\u003C\u002Fcode> as well.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Without \u003Ccode>quittio\u002Fmanaged\u003C\u002Fcode>, \u003Ccode>invoice\u003C\u002Fcode> exits with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#rendering-and-archive\">Rendering and archive\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiovalidate\">quittio:validate\u003Ca class=\"q-doc-anchor\" href=\"#quittiovalidate\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:validate\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {file}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--profile=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--kosit}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--verapdf}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--json}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\u003C\u002Fdiv>\n\u003Cp>Checks an e-invoice file against the rules, e.g. one you received or one your application produced. See \u003Ca href=\"\u002Fdocs\u002Fvalidation\">Validation\u003C\u002Fa> for the levels L1 to L7.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>file\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">XML or PDF file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Expected profile (aliases allowed); a different profile fails\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--kosit\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Also run the KoSIT validator (L5) with all settings of \u003Ccode>quittio.validation.drivers.kosit\u003C\u002Fcode> (\u003Ccode>mode\u003C\u002Fcode>, \u003Ccode>url\u003C\u002Fcode>, \u003Ccode>jar\u003C\u002Fcode>, \u003Ccode>scenarios\u003C\u002Fcode>, \u003Ccode>repository\u003C\u002Fcode>, \u003Ccode>configurations\u003C\u002Fcode>, \u003Ccode>java\u003C\u002Fcode>, \u003Ccode>timeout\u003C\u002Fcode>, \u003Ccode>fail_on_unavailable\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--verapdf\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Also run veraPDF, the PDF\u002FA checker (L6), with all settings of \u003Ccode>quittio.validation.drivers.verapdf\u003C\u002Fcode> (\u003Ccode>mode\u003C\u002Fcode>, \u003Ccode>binary\u003C\u002Fcode>, \u003Ccode>image\u003C\u002Fcode>, \u003Ccode>docker\u003C\u002Fcode>, \u003Ccode>timeout\u003C\u002Fcode>, \u003Ccode>fail_on_unavailable\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Print the result as JSON instead of the report\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>The command reads the file and validates it with the configured levels plus \u003Ccode>kosit\u003C\u002Fcode> and \u003Ccode>verapdf\u003C\u002Fcode> (\u003Ccode>Quittio::coreWithLevels()\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Cul>\n\u003Cli>The drivers are built exactly as in a render run.\u003C\u002Fli>\n\u003Cli>A level already in \u003Ccode>validation.levels\u003C\u002Fcode> is not added twice.\u003C\u002Fli>\n\u003Cli>The cached core of the application is not changed.\u003C\u002Fli>\n\u003Cli>With \u003Ccode>fail_on_unavailable\u003C\u002Fcode> set to \u003Ccode>false\u003C\u002Fcode>, a validator that cannot be reached or started is reported as a warning (\u003Ccode>KOSIT-UNAVAILABLE\u003C\u002Fcode>, \u003Ccode>VERAPDF-UNAVAILABLE\u003C\u002Fcode>) and does not fail the command.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The report shows invoice number, syntax, profile, the checked levels and a table of findings (severity, level, code, business term, message and hint). \u003Ccode>--json\u003C\u002Fcode> prints \u003Ccode>{&quot;valid&quot;: …, &quot;levels&quot;: […], &quot;messages&quot;: [{severity, code, message, level, bt, path, hint, xpath}], &quot;profile&quot;: …, &quot;expectedProfile&quot;: …, &quot;profileMismatch&quot;: …}\u003C\u002Fcode>; when the file cannot be checked, it prints \u003Ccode>{&quot;valid&quot;: false, &quot;error&quot;: &quot;…&quot;}\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ctable class=\"q-doc-table q-stack-table\">\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Exit code\u003C\u002Fth>\n\u003Cth>Meaning\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">The file has no errors and, with \u003Ccode>--profile\u003C\u002Fcode>, has the expected profile; warnings do not fail\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">The file has errors or another profile than \u003Ccode>--profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>2\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Meaning\">The file could not be checked: missing or unreadable, not readable as e-invoice, or an unknown \u003Ccode>--profile\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch3 id=\"quittioread\">quittio:read\u003Ca class=\"q-doc-anchor\" href=\"#quittioread\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:read\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {file}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--json}\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>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>file\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">XML or PDF file\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Print the invoice data as JSON (\u003Ccode>InvoiceData::toJson()\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Shows the content of an e-invoice file:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>number, issue date, type code, syntax and profile,\u003C\u002Fli>\n\u003Cli>seller and buyer (with country),\u003C\u002Fli>\n\u003Cli>the embedded file name of a PDF,\u003C\u002Fli>\n\u003Cli>a table of the lines (position, item, quantity and unit, net amount, VAT category and rate),\u003C\u002Fli>\n\u003Cli>net total, VAT and amount due (the totals declared in the file),\u003C\u002Fli>\n\u003Cli>the findings of the reader.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>A missing or unreadable file exits with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Freading\">Reading incoming invoices\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiobenchmark\">quittio:benchmark\u003Ca class=\"q-doc-anchor\" href=\"#quittiobenchmark\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:benchmark\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--count=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">20\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--scenario=simple}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--format=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">*\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">}\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>Option\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--count\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>20\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Measured runs per format (at least 1)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--scenario\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>simple\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Sample scenario\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--format\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>cii\u003C\u002Fcode>, \u003Ccode>zugferd\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Formats; repeat the option for several (\u003Ccode>--format=cii --format=zugferd\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Renders the scenario once per format to warm up fonts and caches. Then it renders \u003Ccode>--count\u003C\u002Fcode> times with validation mode \u003Ccode>warn\u003C\u002Fcode> and prints average, minimum, 95th percentile and maximum in milliseconds, plus the peak memory. An unknown scenario exits with \u003Ccode>1\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"maintenance\">Maintenance\u003Ca class=\"q-doc-anchor\" href=\"#maintenance\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Recurring tasks. Most of them belong to the Managed layer, which stores invoices in the database (\u003Ca href=\"\u002Fdocs\u002Fmanaged\">Managed layer\u003C\u002Fa>). Schedule them as shown in \u003Ca href=\"#scheduling\">Scheduling\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittioverify\">quittio:verify\u003Ca class=\"q-doc-anchor\" href=\"#quittioverify\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Managed layer.\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\"> quittio:verify\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--from=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--to=}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--issuer=}\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>Option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--from\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Issue date from (\u003Ccode>Y-m-d\u003C\u002Fcode>, inclusive)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--to\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Issue date to (\u003Ccode>Y-m-d\u003C\u002Fcode>, inclusive)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--issuer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Only invoices of this issuer key\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Checks every issued invoice of all issuers; the tenancy scope does not apply. The archived XML and PDF of the current document version must exist and match their SHA-256 hashes. Issued invoices whose documents were never archived (render status \u003Ccode>pending\u003C\u002Fcode>, \u003Ccode>rendering\u003C\u002Fcode> or \u003Ccode>failed\u003C\u002Fcode>) count as problems too.\u003C\u002Fp>\n\u003Cp>Every problem dispatches \u003Ccode>ArchiveIntegrityViolation\u003C\u002Fcode> (invoice, path, problem). The run writes the audit entry \u003Ccode>verified\u003C\u002Fcode> with the number of checked invoices and violations. Problems are printed as a table and exit with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#rendering-and-archive\">Rendering and archive\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiodraftsprune\">quittio:drafts:prune\u003Ca class=\"q-doc-anchor\" href=\"#quittiodraftsprune\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Managed layer.\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\"> quittio:drafts:prune\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--older-than=\u003C\u002Fspan>\u003Cspan style=\"color:#79C0FF\">60\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\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>Option\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--older-than\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>60\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Minimum age of cancellation drafts in minutes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">–\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Do not ask for confirmation\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Deletes drafts that can never be issued:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>cancellation drafts older than \u003Ccode>--older-than\u003C\u002Fcode> minutes. They were left behind (e.g. by a crash) while \u003Ccode>cancel()\u003C\u002Fcode> or \u003Ccode>cancelPartially()\u003C\u002Fcode> issued them.\u003C\u002Fli>\n\u003Cli>correction drafts whose original is no longer in status \u003Ccode>issued\u003C\u002Fcode> or no longer exists.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The command lists them (draft, kind, original, created), asks, and deletes each through the model (audit entry \u003Ccode>deleted_draft\u003C\u002Fcode>). A draft issued meanwhile is not touched. A non-numeric \u003Ccode>--older-than\u003C\u002Fcode> or a declined confirmation exits with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#cancellations-and-corrections\">Cancellations and corrections\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittioretentioncheck\">quittio:retention:check\u003Ca class=\"q-doc-anchor\" href=\"#quittioretentioncheck\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Managed layer.\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\"> quittio:retention:check\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--delete}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\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>Option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--delete\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Delete the expired invoices and their archived documents (asks for confirmation)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Do not ask for confirmation\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Invoices must be kept for a legal retention period (\u003Ca href=\"\u002Fdocs\u002Fmanaged#retention-and-deletion\">Retention and deletion\u003C\u002Fa>). The command lists the issued invoices past their retention period that are not on legal hold. An invoice counts as expired two days after \u003Ccode>retention_until\u003C\u002Fcode>. It dispatches \u003Ccode>RetentionExpired\u003C\u002Fcode> for each of them. It also reports archived files of deleted invoices that could not be deleted yet. Without \u003Ccode>--delete\u003C\u002Fcode> nothing changes.\u003C\u002Fp>\n\u003Cp>With \u003Ccode>--delete\u003C\u002Fcode>, it first retries the leftover files. Then it deletes by group:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>A group is an invoice together with all invoices connected to it through cancellations, partial cancellations, corrections and replacements.\u003C\u002Fli>\n\u003Cli>A group is deleted only when every member is expired and none is on legal hold. Otherwise the command names the invoice that keeps the group.\u003C\u002Fli>\n\u003Cli>The rows of a group (relations, deliveries, referring drafts, invoices) are deleted in one transaction with audit entries, then all archived files of all document versions. Files that cannot be deleted are tried again by the next run.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Failures of single groups are reported and the run continues (exit code \u003Ccode>0\u003C\u002Fcode>). A declined confirmation exits with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#rendering-and-archive\">Rendering and archive\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiosequenceshow\">quittio:sequence:show\u003Ca class=\"q-doc-anchor\" href=\"#quittiosequenceshow\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Managed layer.\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\"> quittio:sequence:show\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--issuer=}\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>Option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--issuer\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Only the sequences of this issuer key\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Lists every number sequence with its next value and pattern, ordered by key. The key has the form \u003Ccode>{issuer}:{sequence}:{period}\u003C\u002Fcode>, e.g. \u003Ccode>default:invoice:2026\u003C\u002Fcode>. Sequences are created when the first invoice of a period is issued. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#numbering\">Numbering\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiosequenceset\">quittio:sequence:set\u003Ca class=\"q-doc-anchor\" href=\"#quittiosequenceset\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>Managed layer.\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\"> quittio:sequence:set\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {key}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {value}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--force}\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>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Sequence key \u003Ccode>{issuer}:{sequence}:{period}\u003C\u002Fcode>, e.g. \u003Ccode>default:invoice:2026\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>value\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">New next value, a positive integer greater than the current one\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Do not ask for confirmation\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Raises the next value of a sequence, e.g. when you migrate from another system. Lowering it is refused.\u003C\u002Fp>\n\u003Cp>A sequence that does not exist yet is created ahead of time, but only when the numbering would use it:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the issuer must exist,\u003C\u002Fli>\n\u003Cli>the sequence must be \u003Ccode>invoice\u003C\u002Fcode>, or a kind with its own sequence for that issuer (\u003Ccode>cancellation\u003C\u002Fcode>, \u003Ccode>correction\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>the period must match the reset mode (\u003Ccode>2026\u003C\u002Fcode> yearly, \u003Ccode>2026-10\u003C\u002Fcode> monthly, \u003Ccode>all\u003C\u002Fcode> never).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The pattern comes from the configuration. The change runs in a transaction with a row lock and is written to the audit log. Invalid values or keys, a lower value and a declined confirmation exit with \u003Ccode>1\u003C\u002Fcode>. See \u003Ca href=\"\u002Fdocs\u002Fmanaged#numbering\">Numbering\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch3 id=\"quittiobase-rateupdate\">quittio:base-rate:update\u003Ca class=\"q-doc-anchor\" href=\"#quittiobase-rateupdate\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\n\u003Cp>German country pack.\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\"> quittio:base-rate:update\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\"> [--dry-run]\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>Option\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--dry-run\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Show the rates, write nothing\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>German default interest on late payments is the base rate (Basiszinssatz) under section 247 of the German Civil Code (BGB) plus a surcharge. The base rate changes on 1 January and 1 July. Quittio ships the rates up to its release; this command fetches the later ones, so that default interest (\u003Ccode>DefaultInterest\u003C\u002Fcode>) covers periods after the shipped table without a new release.\u003C\u002Fp>\n\u003Cp>The command fetches the base rate from the statistics API of the Deutsche Bundesbank (series \u003Ccode>BBIN1.M.DE.BBK.BBKBAS2.EUR.ME\u003C\u002Fcode>). It stores the rates that the shipped table does not contain, and values that differ from it, in \u003Ccode>quittio.countries.de.base_rate_file\u003C\u002Fcode> (default \u003Ccode>storage\u002Fapp\u002Fquittio\u002Fbase-rates.json\u003C\u002Fcode>). The German country pack registers it (\u003Ccode>GermanyServiceProvider\u003C\u002Fcode>).\u003C\u002Fp>\n\u003Cp>It prints the latest rate and the rates after the shipped table. It warns when a value differs from the shipped table; the Bundesbank value is then used. It writes the file only when something changed.\u003C\u002Fp>\n\u003Cp>Exit code \u003Ccode>1\u003C\u002Fcode> when:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>the API cannot be reached or returns no rates,\u003C\u002Fli>\n\u003Cli>\u003Ccode>quittio.countries.de.base_rate_file\u003C\u002Fcode> is empty (not with \u003Ccode>--dry-run\u003C\u002Fcode>),\u003C\u002Fli>\n\u003Cli>the directory of the file cannot be created.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>See \u003Ca href=\"\u002Fdocs\u002Fcountry-packs#base-rate-table\">Country packs: base rate table\u003C\u002Fa> and \u003Ca href=\"\u002Fdocs\u002Fconfiguration#country-pack-germany-quittiocountriesde\">Country pack Germany\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"package-development\">Package development\u003Ca class=\"q-doc-anchor\" href=\"#package-development\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ch3 id=\"quittiocodelistsupdate\">quittio:codelists:update\u003Ca class=\"q-doc-anchor\" href=\"#quittiocodelistsupdate\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh3>\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\"> quittio:codelists:update\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {xsl?}\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\"> {--target=}\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>Argument \u002F option\u003C\u002Fth>\n\u003Cth>Default\u003C\u002Fth>\n\u003Cth>Effect\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>xsl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">\u003Ccode>storage\u002Fquittio\u002Fvalidators\u002Fxrechnung\u002Fresources\u002Fcii\u002F16b\u002Fxsl\u002FEN16931-CII-validation.xsl\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">EN 16931 CII Schematron XSL of the validator configuration\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>--target\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Default\">the code lists of \u003Ccode>quittio\u002Fcore\u003C\u002Fcode> (\u003Ccode>resources\u002Fcodelists\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd data-label=\"Effect\">Output directory\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>For the development of Quittio itself: it regenerates the JSON code lists (units, currencies, countries, VAT categories, VATEX, EAS and ICD schemes, payment means, …) from the official rules and prints the number of codes per list. In an application, pass \u003Ccode>--target\u003C\u002Fcode>; the default writes into the installed package. A missing XSL exits with \u003Ccode>1\u003C\u002Fcode> (run \u003Ccode>quittio:schemas:download\u003C\u002Fcode> first).\u003C\u002Fp>\n\u003Ch2 id=\"scheduling\">Scheduling\u003Ca class=\"q-doc-anchor\" href=\"#scheduling\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Schedule the maintenance commands in \u003Ccode>routes\u002Fconsole.php\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cdiv class=\"q-doc-code\">\u003Cdiv class=\"q-doc-code-bar\">\u003Cspan>php\u003C\u002Fspan>\u003Cbutton type=\"button\" class=\"q-doc-copy\" data-copy aria-label=\"Copy code\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\u003Crect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\"\u002F>\u003Cpath d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"\u002F>\u003C\u002Fsvg>\u003Cspan>Copy\u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cpre class=\"shiki github-dark-default\" style=\"background-color:#0d1117;color:#e6edf3\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#8B949E\">\u002F\u002F routes\u002Fconsole.php\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\\Support\\Facades\\Schedule\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\">Schedule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">command\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio:verify'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">weekly\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">onOneServer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();                  \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F exit code 1 on problems\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Schedule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">command\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio:drafts:prune --force'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">daily\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">onOneServer\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\">Schedule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">command\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio:retention:check'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">monthly\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">onOneServer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F report and RetentionExpired events\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\" style=\"padding-left:2ch;text-indent:-2ch\">\u003Cspan style=\"color:#79C0FF\">Schedule\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">::\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">command\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">(\u003C\u002Fspan>\u003Cspan style=\"color:#A5D6FF\">'quittio:base-rate:update'\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">)\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">weekly\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">()\u003C\u002Fspan>\u003Cspan style=\"color:#FF7B72\">->\u003C\u002Fspan>\u003Cspan style=\"color:#D2A8FF\">onOneServer\u003C\u002Fspan>\u003Cspan style=\"color:#E6EDF3\">();        \u003C\u002Fspan>\u003Cspan style=\"color:#8B949E\">\u002F\u002F new base rate on 1 January and 1 July\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>Command\u003C\u002Fth>\n\u003Cth>Recommendation\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio:verify\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Recommendation\">Daily or weekly. React to failures with \u003Ccode>-&gt;onFailure(…)\u003C\u002Fcode> or \u003Ccode>-&gt;emailOutputOnFailure(…)\u003C\u002Fcode> and listen for \u003Ccode>ArchiveIntegrityViolation\u003C\u002Fcode>. On large archives limit the range, e.g. \u003Ccode>['--from' =&gt; now()-&gt;subDays(8)-&gt;toDateString()]\u003C\u002Fcode>, and run a full check less often.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio:drafts:prune\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Recommendation\">Daily with \u003Ccode>--force\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio:retention:check\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Recommendation\">Monthly without \u003Ccode>--delete\u003C\u002Fcode> for a report. Add \u003Ccode>--delete --force\u003C\u002Fcode> only when expired invoices should be deleted without review.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio:schemas:download\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Recommendation\">Not scheduled: run it in deployment or CI when you use the KoSIT validator\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio:base-rate:update\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Recommendation\">Weekly (or daily in January and July): the new rate is stored as soon as the Bundesbank has published it\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"publish-tags\">Publish tags\u003Ca class=\"q-doc-anchor\" href=\"#publish-tags\" aria-label=\"Link to this section\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Publish tags copy files of the packages into your application, so that you can change them:\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-config\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>Tag\u003C\u002Fth>\n\u003Cth>Package\u003C\u002Fth>\n\u003Cth>Publishes to\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-config\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>config\u002Fquittio.php\u003C\u002Fcode> (\u003Ca href=\"\u002Fdocs\u002Fconfiguration\">Configuration\u003C\u002Fa>)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-views\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>resources\u002Fviews\u002Fvendor\u002Fquittio\u002Ftemplates\u003C\u002Fcode> (default template and partials; they override the package views)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-lang\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>lang\u002Fvendor\u002Fquittio\u003C\u002Fcode> (labels, rule messages, codes, terms)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-fonts\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">laravel\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>resources\u002Ffonts\u002Fquittio\u002Fgeist\u003C\u002Fcode> (Geist) and \u003Ccode>resources\u002Ffonts\u002Fquittio\u002Finter\u003C\u002Fcode> (Inter). \u003Ccode>resources\u002Ffonts\u002Fquittio\u003C\u002Fcode> and its subdirectories are added to the font directories automatically, so further font files placed there only need an entry in \u003Ccode>pdf.fonts\u003C\u002Fcode>.\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-managed-config\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>config\u002Fquittio-managed.php\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-managed-migrations\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>database\u002Fmigrations\u003C\u002Fcode> (tables of the Managed layer, with new timestamps)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-managed-triggers\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>database\u002Fmigrations\u003C\u002Fcode> (immutability triggers, recommended for production)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-managed-views\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>resources\u002Fviews\u002Fvendor\u002Fquittio-managed\u003C\u002Fcode> (mail view)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-managed-lang\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">managed\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>lang\u002Fvendor\u002Fquittio-managed\u003C\u002Fcode> (mail and invoice texts)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>quittio-de-config\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd data-label=\"Package\">country-de\u003C\u002Ftd>\n\u003Ctd data-label=\"Publishes to\">\u003Ccode>config\u002Fquittio\u002Fcountries\u002Fde.php\u003C\u002Fcode> (\u003Ccode>quittio.countries.de\u003C\u002Fcode>: base rates; published by \u003Ccode>quittio:install\u003C\u002Fcode> as well)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Publishing is only registered in the console.\u003C\u002Fp>\n",[111,115,118,122,125,128,131,134,137,140,143,146,149,152,155,158,161,164,167,170,173,176,179],{"id":112,"text":113,"level":114},"overview","Overview",2,{"id":116,"text":117,"level":114},"setup","Setup",{"id":119,"text":120,"level":121},"quittioinstall","quittio:install",3,{"id":123,"text":124,"level":121},"quittiocountries","quittio:countries",{"id":126,"text":127,"level":121},"makequittio-template","make:quittio-template",{"id":129,"text":130,"level":121},"quittioschemasdownload","quittio:schemas:download",{"id":132,"text":133,"level":114},"preview-and-testing","Preview and testing",{"id":135,"text":136,"level":121},"quittiopreview","quittio:preview",{"id":138,"text":139,"level":121},"quittiorender","quittio:render",{"id":141,"text":142,"level":121},"quittiovalidate","quittio:validate",{"id":144,"text":145,"level":121},"quittioread","quittio:read",{"id":147,"text":148,"level":121},"quittiobenchmark","quittio:benchmark",{"id":150,"text":151,"level":114},"maintenance","Maintenance",{"id":153,"text":154,"level":121},"quittioverify","quittio:verify",{"id":156,"text":157,"level":121},"quittiodraftsprune","quittio:drafts:prune",{"id":159,"text":160,"level":121},"quittioretentioncheck","quittio:retention:check",{"id":162,"text":163,"level":121},"quittiosequenceshow","quittio:sequence:show",{"id":165,"text":166,"level":121},"quittiosequenceset","quittio:sequence:set",{"id":168,"text":169,"level":121},"quittiobase-rateupdate","quittio:base-rate:update",{"id":171,"text":172,"level":114},"package-development","Package development",{"id":174,"text":175,"level":121},"quittiocodelistsupdate","quittio:codelists:update",{"id":177,"text":178,"level":114},"scheduling","Scheduling",{"id":180,"text":181,"level":114},"publish-tags","Publish tags","https:\u002F\u002Fgithub.com\u002FQuittio\u002Fquittio\u002Fedit\u002Fmaster\u002Fdocs\u002Fcommands.md","\u002Fdocs\u002Fcommands.md",{"slug":64,"title":65},{"slug":70,"title":71}]