Haiku.lt

Sąskaitų faktūrų žymėjimo kalba (InML)

2026-02-22

InML (Invoice Markup Language) yra XML pagrindu sukurta šablonų kalba, skirta apibrėžti sąskaitų faktūrų PDF išdėstymą „Haiku.lt” sistemoje. Ji suteikia visišką kontrolę sąskaitos struktūrai, stiliui ir turiniui.

Galite pasirinkti vieną iš penkių integruotų stilių kaip pradinį tašką ir pritaikyti jį pagal savo poreikius arba sukurti šabloną nuo nulio.

Pagrindinė struktūra

Kiekvienas InML šablonas prasideda šakniniu <inml> elementu:

<inml version="1.0" page-size="A4" margin="20mm"
      font-regular="Roboto-Light" font-bold="Roboto-Medium">
  <page>
    <!-- elementai piešiami kiekviename puslapyje -->
  </page>
  <layout>
    <!-- turinio sritys -->
  </layout>
</inml>

Šakninio elemento atributai

AtributasAprašymas
versionInML versija. Šiuo metu 1.0.
page-sizePuslapio formatas. Šiuo metu palaikomas tik A4.
marginNumatytoji puslapio paraštė (pvz. 20mm).
font-regularŠriftas paprastam tekstui (pvz. Roboto-Light).
font-boldŠriftas paryškintam tekstui (pvz. Roboto-Medium).

Matavimo vienetai

Visi matmenys nurodomi milimetrais (mm) arba taškais. Reikšmės rašomos kaip 20mm, 5mm, 210mm. Šriftų dydžiai nurodomi taškais be vienetų (pvz. font-size="12").

Puslapio elementai

<page> sekcija apibrėžia elementus, kurie piešiami kiekviename puslapyje, po pagrindiniu turiniu. Naudokite fono paveikslėliams, dekoratyviniams stačiakampiams ar linijoms.

<page>
  <image src="{{background}}" x="0mm" y="0mm" width="210mm" height="297mm" />
  <rect x="0mm" y="0mm" width="210mm" height="30mm" fill="#f1f5f9" />
  <line x1="20mm" y1="50mm" x2="190mm" y2="50mm" color="#cccccc" width="0.5mm" />
</page>

Galimi puslapio elementai

  • <image> — fono paveikslėlis. Atributai: src, x, y, width, height.
  • <rect> — stačiakampis. Atributai: x, y, width, height, fill, stroke, stroke-width.
  • <line> — linija. Atributai: x1, y1, x2, y2, color, width.

Išdėstymas ir sritys

<layout> sekcijoje yra vienas ar daugiau <region> elementų. Kiekviena sritis yra nepriklausoma turinio zona su savo pozicionavimo režimu.

<layout>
  <region id="header" flow="fixed" margin-top="5mm"
          margin-left="20mm" content-width="170mm">
    <!-- turinys -->
  </region>
  <region id="body" flow="sequential" margin-top="20mm">
    <!-- turinys -->
  </region>
</layout>

Srities atributai

AtributasAprašymas
idUnikalus srities identifikatorius.
flowPozicionavimo režimas: sequential, absolute arba fixed.
margin-leftHorizontalus poslinkis nuo puslapio krašto.
content-widthTurinio pločio perrašymas šiai sričiai.
margin-topVertikalus poslinkis. sequential sritims prideda tarpą virš srities.
min-heightMinimalus srities aukštis, net jei turinys yra trumpesnis.

Pozicionavimo režimai

  • sequential — sritys išdėstomos viena po kitos iš viršaus į apačią. Tai dažniausiai naudojamas režimas pagrindiniam turiniui.
  • absolute — pozicionuojama konkrečioje vietoje, apskaičiuojant nuo dabartinės vertikalios pozicijos. Sekančios „sequential” sritys tęsiasi po jos.
  • fixed — pozicionuojama fiksuotoje puslapio vietoje, nepriklausomai nuo kitų sričių. Naudinga antraštėms ar uždengimams.

Išdėstymo stulpeliai

Norėdami sudėti sritis greta viena kitos, apgaubkite jas <columns> elementu išdėstymo lygmenyje:

<layout>
  <columns>
    <column margin-left="20mm" content-width="80mm">
      <region id="left" flow="sequential">
        <!-- kairysis turinys -->
      </region>
    </column>
    <column content-width="80mm">
      <region id="right" flow="sequential">
        <!-- dešinysis turinys -->
      </region>
    </column>
  </columns>
</layout>

Kiekvienas <column> gali turėti margin-left ir content-width atributus ir savyje talpina vieną ar daugiau <region> elementų.

Turinio elementai

Turinio elementai dedami sričių viduje. Visi turinio elementai turi šiuos bendrus nebūtinus atributus:

AtributasAprašymas
fontregular arba bold.
font-sizeŠrifto dydis taškais (pvz. 12).
colorTeksto ar užpildo spalva (pvz. #333333).
alignTeksto lygiavimas: left, right arba center.
margin-topTarpas virš elemento.
margin-bottomTarpas po elementu.

Rodo įmonės logotipą, išlaikant proporcijas.

<logo src="{{logo}}" width="50mm" ratio="{{logoRatio}}" />
AtributasAprašymas
srcPaveikslėlio duomenys (naudokite {{logo}} kintamąjį).
widthRodymo plotis.
heightNeprivalomas fiksuotas aukštis.
ratioProporcijų santykis (naudokite {{logoRatio}} kintamąjį).

<title>

Antraštės tekstas, dažniausiai naudojamas sąskaitos pavadinimui.

<title font="bold" font-size="14" align="center">{{invoiceTitle}}</title>

<text>

Paprastas tekstas.

<text font="regular" font-size="12">{{seller}}</text>

<columns> ir <column>

Išdėsto turinį greta srities viduje.

<columns>
  <column width="50%" align="left">
    <text font="bold" font-size="12">{{t.invoice.seller}}</text>
    <text font="regular" font-size="12" margin-top="5mm">{{seller}}</text>
  </column>
  <column width="50%" align="right">
    <text font="bold" font-size="12">{{t.invoice.buyer}}</text>
    <text font="regular" font-size="12" margin-top="5mm">{{buyer}}</text>
  </column>
</columns>

Kiekvienas <column> turi width atributą procentais (pvz. 50%) ir neprivalomą align atributą.

<stack> ir <group>

Vertikaliai sudėtos turinio grupės su nurodomomis tarpais tarp jų.

<stack spacing="10mm">
  <group>
    <text font="bold" font-size="12">Pirma sekcija</text>
    <text font="regular" font-size="12">Turinys čia</text>
  </group>
  <group>
    <text font="bold" font-size="12">Antra sekcija</text>
    <text font="regular" font-size="12">Daugiau turinio</text>
  </group>
</stack>

spacing atributas nustato vertikalų tarpą tarp grupių.

<box>

Konteineris su rėmeliu ir užpildu.

<box stroke="#cccccc" padding="5mm">
  <text font="regular" font-size="12">Turinys rėmelyje</text>
</box>
AtributasAprašymas
strokeRėmelio spalva.
paddingVidinis užpildas.
heightNeprivalomas fiksuotas aukštis.

<rect>

Stačiakampis turinio sraute.

<rect width="170mm" height="1mm" fill="#238c83" />
AtributasAprašymas
widthStačiakampio plotis.
heightStačiakampio aukštis.
fillUžpildo spalva.
strokeRėmelio spalva.

<image>

Paveikslėlis turinio sraute.

<image src="{{logo}}" width="50mm" height="20mm" />

<spacer>

Prideda vertikalų tarpą tarp elementų.

<spacer height="10mm" />

<invoice-table>

Sąskaitos eilučių lentelė. Tai pagrindinis elementas, skirtas sąskaitos prekėms ir paslaugoms su stulpeliais ir suvestinės sekcija.

<invoice-table row-style="minimal" cell-padding="0mm"
       separator-after-header="true" separator-after-items="true"
       separator-color="#aaaaaa" separator-width="0.5mm">
  <col name="id"     label="{{t.invoice.lineItemNo}}"     width="10mm" align="left" />
  <col name="name"   label="{{t.invoice.lineItemName}}"   width="80mm" align="left" />
  <col name="unit"   label="{{t.invoice.lineItemUnit}}"   width="20mm" align="right" />
  <col name="amount" label="{{t.invoice.lineItemAmount}}" width="20mm" align="right" />
  <col name="price"  label="{{priceColumnLabel}}"         width="20mm" align="right" />
  <col name="total"  label="{{t.invoice.lineItemSum}}"    width="20mm" align="right" />

  <summary>
    <row label="{{t.invoice.total}}" value="{{total}}" />
  </summary>
</invoice-table>

Lentelės atributai

AtributasAprašymas
row-styleEilučių stilius: minimal, striped, bordered arba colored-header.
cell-paddingUžpildas celės viduje.
separator-after-headerRodyti liniją po antraštės eilute (true/false).
separator-after-itemsRodyti liniją po visomis eilutėmis (true/false).
separator-colorSkiriamųjų linijų spalva.
separator-widthSkiriamųjų linijų storis.
stripe-colorKaitaliojamų eilučių fono spalva (naudojant striped stilių).
header-bg-colorAntraštės fono spalva (naudojant colored-header stilių).
header-text-colorAntraštės teksto spalva (naudojant colored-header stilių).
header-extra-paddingPapildomas antraštės eilutės užpildas.

Stulpelių apibrėžimai

Kiekvienas <col> apibrėžia lentelės stulpelį:

AtributasAprašymas
nameStulpelio identifikatorius: id, name, unit, amount, price, vat, vat_sum, total.
labelStulpelio antraštės tekstas (naudokite šablono kintamuosius vertimams).
widthStulpelio plotis.
alignTeksto lygiavimas: left, right arba center.

PVM mokėtojams paprastai pridedami papildomi vat ir vat_sum stulpeliai. Naudokite {{#if vatpayer}} sąlyginiam jų rodymui.

Suvestinės eilutės

<summary> sekcija apibrėžia sumas, rodomas po lentele:

<summary>
  {{#if vatpayer}}
    <row label="{{t.invoice.total_without_vat}}" value="{{totalWithoutVat}}" />
    <row label="{{t.invoice.vat}}" value="{{vatTotal}}" />
  {{/if}}
  <row label="{{t.invoice.total}}" value="{{total}}" />
  {{#if alreadyPaid}}
    <row label="{{t.invoice.alreadyPaid}}" value="{{alreadyPaidFormatted}}" />
    <row label="{{t.invoice.sumToPay}}" value="{{sumToPay}}" />
  {{/if}}
</summary>

Šablono kintamieji

InML naudoja Handlebars sintaksę dinaminiam turiniui. Kintamieji įterpiami su {{kintamojoVardas}}, o sąlyginiai blokai su {{#if kintamojoVardas}}...{{/if}}.

Galimi kintamieji

Sąskaitos duomenys

KintamasisAprašymas
invoiceTitleSąskaitos pavadinimas pagal tipą ir PVM mokėtojo statusą.
seriesNameSąskaitos serijos pavadinimas.
seriesIdSąskaitos numeris serijoje.
formattedDateSuformatuota sąskaitos data.
sellerPardavėjo informacija.
buyerPirkėjo informacija.
issuerSąskaitą išrašęs asmuo.
extraPapildomos informacijos tekstas.

Kainų laukai

KintamasisAprašymas
totalBendra sąskaitos suma (suformatuota).
totalWithoutVatSuma be PVM (suformatuota).
vatTotalPVM suma (suformatuota).
alreadyPaidJau sumokėta suma (skaičius, naudokite su {{#if}}).
alreadyPaidFormattedJau sumokėta suma (suformatuota eilutė).
sumToPayLikusi mokėtina suma (suformatuota).
priceInWordsBendra suma žodžiais (jei galima).
priceColumnLabelKainos stulpelio etiketė (keičiasi PVM mokėtojams).

Požymiai

KintamasisAprašymas
vatpayertrue, jei pardavėjas yra PVM mokėtojas. Naudokite su {{#if vatpayer}}.

Spalvos

KintamasisAprašymas
colors.headerBackgroundAntraštės fono spalva (numatytoji #f1f5f9).
colors.primaryAccentPagrindinė akcentinė spalva (numatytoji #238c83).

Paveikslėliai

KintamasisAprašymas
logoĮmonės logotipo duomenys. Naudokite su {{#if logo}}.
logoRatioLogotipo proporcijų santykis (<logo ratio="...">).
backgroundFono paveikslėlio duomenys. Naudokite su {{#if background}}.

Vertimo eilutės

Visos etiketės pasiekiamos per t objektą. Dažniausiai naudojamos:

KintamasisAprašymas
t.invoice.seller„Pardavėjas” etiketė
t.invoice.buyer„Pirkėjas” etiketė
t.invoice.no„Nr.” etiketė
t.invoice.total„Iš viso” etiketė
t.invoice.total_without_vat„Iš viso be PVM”
t.invoice.vat„PVM” etiketė
t.invoice.lineItemNo„Eil. nr.” stulpelio antraštė
t.invoice.lineItemName„Pavadinimas” stulpelio antraštė
t.invoice.lineItemUnit„Mato vnt.” stulpelio antraštė
t.invoice.lineItemAmount„Kiekis” stulpelio antraštė
t.invoice.lineItemPrice„Kaina” stulpelio antraštė
t.invoice.lineItemPriceWithoutVAT„Kaina (be PVM)“
t.invoice.lineItemVat„PVM %” antraštė
t.invoice.lineItemVatSum„PVM suma” antraštė
t.invoice.lineItemSum„Suma” stulpelio antraštė
t.invoice.alreadyPaid„Jau sumokėta” etiketė
t.invoice.sumToPay„Mokėtina suma” etiketė
t.invoice.sumInWords„Suma žodžiais” etiketė
t.invoice.invoiceIssuedBy„Sąskaitą išrašė”
t.metadata.series„Serija” etiketė

Integruoti stiliai

„Haiku.lt” turi penkis integruotus stilius, kuriuos galite naudoti kaip pradinį tašką:

  • minimalist — švarus dizainas su centruota antrašte ir minimaliais skirtukais
  • modern-accent — spalvota antraštės juosta su akcentinėmis spalvomis
  • left-aligned — kairėn lygiuotas išdėstymas su paprasta struktūra
  • bordered — lentelės eilutės ir sekcijos su rėmeliais
  • split-column — dviejų stulpelių išdėstymas pardavėjo ir pirkėjo informacijai

Pasirinkite integruotą stilių sąskaitos nustatymuose, tada perjunkite į pasirinktinį InML, kad galėtumėte jį modifikuoti.

Pilnas pavyzdys

Supaprastintas šablonas, rodantis pagrindinius InML konceptus:

<inml version="1.0" page-size="A4" margin="20mm"
      font-regular="Roboto-Light" font-bold="Roboto-Medium">
  <page>
    {{#if background}}
      <image src="{{background}}" x="0mm" y="0mm" width="210mm" height="297mm" />
    {{/if}}
  </page>
  <layout>
    {{#if logo}}
      <region id="logo" flow="absolute">
        <logo src="{{logo}}" width="50mm" ratio="{{logoRatio}}" />
        <spacer height="10mm" />
      </region>
    {{/if}}

    <region id="title-block" flow="absolute" min-height="40mm">
      <title font="bold" font-size="14" align="center">{{invoiceTitle}}</title>
      <text font="bold" font-size="12" align="center" margin-top="8mm">
        {{t.metadata.series}} {{seriesName}} {{t.invoice.no}} {{seriesId}}
      </text>
      <text font="regular" font-size="12" align="center" margin-top="16mm">
        {{formattedDate}}
      </text>
    </region>

    <region id="parties" flow="sequential" min-height="30mm">
      <columns>
        <column width="50%" align="left">
          <text font="bold" font-size="12">{{t.invoice.seller}}</text>
          <text font="regular" font-size="12" margin-top="5mm">{{seller}}</text>
        </column>
        <column width="50%" align="right">
          <text font="bold" font-size="12">{{t.invoice.buyer}}</text>
          <text font="regular" font-size="12" margin-top="5mm">{{buyer}}</text>
        </column>
      </columns>
    </region>

    <region id="table" flow="sequential" margin-top="20mm">
      <invoice-table row-style="minimal" cell-padding="0mm"
             separator-after-header="true" separator-after-items="true"
             separator-color="#aaaaaa" separator-width="0.5mm">
        <col name="id"     label="{{t.invoice.lineItemNo}}"     width="10mm" align="left" />
        <col name="name"   label="{{t.invoice.lineItemName}}"   width="80mm" align="left" />
        <col name="unit"   label="{{t.invoice.lineItemUnit}}"   width="20mm" align="right" />
        <col name="amount" label="{{t.invoice.lineItemAmount}}" width="20mm" align="right" />
        <col name="price"  label="{{priceColumnLabel}}"         width="20mm" align="right" />
        <col name="total"  label="{{t.invoice.lineItemSum}}"    width="20mm" align="right" />

        <summary>
          <row label="{{t.invoice.total}}" value="{{total}}" />
        </summary>
      </invoice-table>
    </region>

    <region id="footer" flow="sequential">
      {{#if extra}}
        <text font="regular" font-size="12">{{extra}}</text>
        <spacer height="10mm" />
      {{/if}}
      <text font="regular" font-size="12">
        {{t.invoice.invoiceIssuedBy}} {{issuer}}
      </text>
    </region>
  </layout>
</inml>