====== Invoice Ninja 5 - fakturační systém ====== Hledal jsem jednoduchý fakturační systém, který bych si mohl nainstalovat jako webovou službu. V minulosti mě zaujal [[https://invoiceninja.github.io/en/self-host-installation/|InvoiceNinja]] a používal jsem verzi 4. Musel jsem si ji trošku přizpůsobit pro české prostředí, ale bylo to funkční. Nicméně vývojáři InvoiceNinja vytvořili novější verzi a protože struktura systému je jiná, nebylo možné systém jednoduše aktualizovat. Musel jsem vytvořit novou instanci s verzí 5 a poté udělat migraci. Naštěstí na to vývojáři mysleli a migrace je funkční. A zdá se, že verze 5 je opravdu slušně vylepšená a přechod měl smysl. A dokonce se mi podařilo vyřešit i několik problémů z verze 4, které bránily k dokonalému použití. ===== Migrace ===== Postupoval jsem podle [[https://invoiceninja.github.io/en/migration/|dokumentace k migraci]]. Vytvořil jsem novou instalaci na jiné subdoméně. [[https://invoiceninja.github.io/en/self-host-installation/|Popis instalace]] zahrnuje: * doporučenou verzi PHP * potřebné balíčky * nastavení práv * nastavení cronu a další V rámci migrace jsem pak ve verzi 4 šel podle návodu, nastavil jsem doménu na kterou budu migrovat a bylo to. Starý systém mohu nyní vypnout nebo přesměrovat. Po migraci jsem se začal věnovat nastavení nového fakturačního systému. Fakt je, že se přeneslo i nastavení z původní verze. Nicméně stejně jsem si to nastavení musel vylepšit v menu **Nastaveni/Settings**. ===== Lokalizace ===== Lokalizace se provádí skrze menu **Uživatelské detaily**, kde zapnu jazyk a dále pak přes menu **Lokalizace**, kde se zapíná desetinná tečku a čárka na České prostředí. I přesto, že jsem měl desetinnou tečku a čárku správně nastavenou, tak jsem zjistil, že na vystavených fakturách je anglický formát. Později jsem si všimnul, že se to týká pouze některých faktur. Původně jsem si myslel, že je to chyba v programu. Ale když jsem si zkusil přidat novou firmu (čistou) firmu, tak vystavení faktur bylo v pořádku v českém formátu. Pak mě napadlo, kde by mohl být problém. Podíval jsem se, komu faktury vystavuji a měl jsem v kontaktu napsáno, že kontakt pochází z United States. Nevím jestli to vzniknul problém při migraci nebo jsem v původní systému špatně zadával údaje. Každopádně změnil jsem u kontaktu zemi a v tu chvíli se změnila desetinná tečka na faktuře na destinnou čárku. Problém byl vyřešen. Další možnost je přejmenovat některé popisky na faktuře. Například jsem se snažil původně přejmenovat pole **Číslo faktury** na **variabilní symbol**. To jsem dělal v menu **Lokalizace-> Custom Lables**. Vycházel jsem z existujících labelů [[https://github.com/invoiceninja/invoiceninja/blob/master/resources/lang/en/texts.php|z dokumentace]]. Použil jsem při vytváření label a pak bylo možné mu nastavit nový název. Každopádně jsem z tohoto postupu upustil, vyřešil jsem variabilní symbol k platbě editací šablony. ===== QR kód ===== Protože byl přepracován vzhled šablon, tak se otevřely nové možnosti vložení QR kódu do šablony. Nejprve vypadala nadějně [[https://invoiceninja.github.io/en/qr-codes/|oficiální dokumentace ke QR kódům]]. V dokumentaci jsou 3 typy QR kódů. Pochopil jsem, že první se týká Švýcarska - takže pro mě nepoužitelné. Další variantou jsou SEPA ERC QR kódy. Aktivace spočívá v přidání v custom fields pro **Company**. Pozor, musí být přesně dané pořadí, jinak to nebude fungovat. Nicméně měna byla v Eurech a týkala se podle mě plateb v zahraničí. Řešením měla být poslední možnost - Generic Payment link QR Codes. Použití bylo jednoduché, stačilo do šablony vložit proměnnou **payment_qrcode** a mělo to fungovat. Bohužel mělo a nefungovalo. Pak jsem se ale inspiroval [[https://forum.invoiceninja.com/t/qr-code-to-scan-and-pay/8292|ve fóru]], kde vložili do šablony tag, který načítá URL, která vygeneruje QR kód. Velmi jednoduché řešení. Jako služba pro generování QR kódu jsem použil službu https://developers.google.com/chart/infographics/docs/qr_codes. V bankovnictví jsem si vygeneroval QR kód, přečetl jsem si obsah a nahradil v řětezci proměnné pro měnu a variabilní symbol. Výsledek byl, že jsem do šablony pak vložil tento tag, který generuje QR platby: Ještě doplním, že jsem musel použít proměnnou **$amount_raw**, aby byla v kódu částka bez měny. O proměnné je psáno [[https://forum.invoiceninja.com/t/qr-codes-scan-and-pay/3713/10|zde]] a [[https://forum.invoiceninja.com/t/issue-with-custom-fields-amount-and-other-fields-should-only-contain-float-no-currency-text/10253|zde]]. Jenom jsem nasadil QR platby, tak u druhé faktury dostal Google výpadek a nejde generovat QR obrázky. To mě dovedlo k alternativní službě, která je jistým způsobem ještě jednodušší, protože parametry účtu předávám v rámci parametrů. Dokumentaci jsem našel na serveru [[https://qr-platba.cz/pro-vyvojare/restful-api/|qr-platba.cz]] a tady je příklad kódu: ===== Vkládání podpisu (obrázku) do šablony ===== Zakódoval jsem obrázek do base64 a vložil pomocí tagu IMG s nastavenou src. Obrázek lze zakódovat jednoduše například přes službu [[https://www.base64-image.de/|base64image]]. Výsledek kódu a vložení vypadá takto: ===== Šablona ===== Šablonu jsem postavil na **Business template**. Přidal jsem ještě některé styly na další úpravy. Některé jsem později vypnul, protože jsem našel jinou volbu v nastavení, které problém řešila. /* [data-ref="product_table-product.item-th"], [data-ref="product_table-product.item-td"] { display:none; }*/ p[data-ref="company_details-company.id_number"]::before { content: "I\00010C: "; display: inline; /* nebo 'inline-block' pokud potřebujete další formátování */ } p[data-ref="company_details-company.id_number"], p[data-ref="company_details-company.id_number"] > p { display: inline-block; margin-bottom: 5px; } [data-ref="company_details-company.custom1"]{ margin-top: 10px; } p[data-ref="client_details-client.number"]:not(:empty)::before { content: "I\00010C: "; display: inline; /* nebo 'inline-block' pokud potřebujete další formátování */ } p[data-ref="client_details-client.number"], p[data-ref="client_details-client.number"] > p { display: inline-block; } p[data-ref="client_details-client.vat_number"]:not(:empty)::before { content: "DI\00010C: "; display: inline; /* nebo 'inline-block' pokud potřebujete další formátování */ } p[data-ref="client_details-client.vat_number"], p[data-ref="client_details-client.vat_number"] > p { display: inline-block; margin-bottom: 10px; /* Pro jistotu, aby nebyly žádné defaultní marginy */ } #payment-instructions{ font-size: 18px !important; padding-bottom: 30px; padding-top: 10px; } #payment-instructions strong{ font-size: 20px; } [data-ref="client_details-client.phone"] { margin-top: 10px } /*[data-ref="totals_table-net_subtotal"] { display: none } [data-ref="totals_table-net_subtotal-label"] { display: none } [data-ref="totals_table-subtotal-label"] { display: none } [data-ref="totals_table-subtotal"] { display: none }*/ A tady kód samotné šablony.

$entity_issued_to_label:

Platbu $amount proveďte na účet číslo 280 158 1174/2010, s variabilním symbolem $number
$status_logo
Výsledek pak vypadá takto: {{:it:software:pasted:20240105-150706.png}}