Sąskaitų išrašymas iš Jūsų sistemos
Pardavimo sąskaitos sukūrimas, patvirtinimas, PDF ir siuntimas klientui per REST API, saugiai kartojant užklausas.
Šiame puslapyje aprašyta visa seka, kuria Jūsų sistema (CRM, užsakymų valdymas, el. parduotuvė) išrašo pardavimo sąskaitą JARS Apskaita ir gauna jos PDF, kurį galima siųsti klientui. Tą pačią seką naudojame ir patys, kai išrašome sąskaitas iš savo paslaugų parduotuvių. Bendra API apžvalga ir raktų valdymas aprašyti puslapyje JARS API.
Visi pavyzdžiai naudoja https://app.jars.lt/api ir antraštę Authorization: Bearer jars_sk_….
Seka trumpai
| Žingsnis | Užklausa | Rezultatas |
|---|---|---|
| 1. Klientas | GET /api/partners?externalCode=…, jei nėra — POST /api/partners | Kliento _id |
| 2. Juodraštis | POST /api/invoices su externalCode | Sąskaitos _id, būsena DRAFT |
| 3. Patvirtinimas | POST /api/invoices/{id}/post | Oficialus numeris (invoice.number), būsena POSTED |
| 4. PDF | POST /api/invoices/{id}/pdf, tada GET /api/invoices/{id}/pdf | PDF failas |
| 5. Išsiuntimas | Jūsų paštas arba POST /api/invoices/{id}/send-email | Laiškas klientui su PDF priedu |
Prieš pradedant
Vieną kartą paruoškite:
- API raktą — Nustatymai → API raktai. Svarbu, kas jį kuria: žr. toliau skyrių „API raktas ir teisės“.
- Numeracijos seriją — Nustatymai → Įmonės nustatymai → Numeracija. Jos prefiksą siųsite lauke
series(pardavimo sąskaitoms numatytoji serija yraSF). Oficialų numerį JARS suteikia pats, tvirtinant sąskaitą. - PVM kodo
_id—GET /api/vat-codes. - Operacijų šablono
_id—GET /api/templates, šablonas susourceType: "SALES_INVOICE", tinkantis kliento šaliai (Lietuva, ES, ne ES).
PVM kodų ir šablonų sąrašai keičiasi retai: gaukite juos vieną kartą ir laikykite savo sistemoje.
1. Klientas
Pirmiausia ieškokite kliento pagal savo sistemos identifikatorių, laikomą lauke externalCode:
curl -s -H "Authorization: Bearer $API_KEY" \
"https://app.jars.lt/api/partners?externalCode=CRM-12345"
Atsakymas yra masyvas. Jei jis tuščias, sukurkite klientą:
curl -s -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "UAB Klientas",
"type": "CUSTOMER",
"externalCode": "CRM-12345",
"companyCode": "<įmonės kodas>",
"vatCode": "<PVM kodas, jei yra>",
"country": "LT",
"billingEmail": "buhalterija@klientas.example",
"correspondenceLanguage": "lt"
}' \
"https://app.jars.lt/api/partners"
correspondenceLanguage (lt, en arba ru) lemia sąskaitos PDF kalbą ir numatytojo laiško kalbą. Jį nustatykite kuriant klientą.
2. Sąskaitos juodraštis
curl -s -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"type": "SALES",
"externalCode": "ORDER-2026-0042",
"series": "SF",
"date": "2026-10-06",
"dueDate": "2026-10-20",
"partnerId": "<kliento _id>",
"operationTemplateId": "<šablono _id>",
"currency": "EUR",
"exchangeRate": 1,
"lines": [
{
"lineNo": 1,
"description": "Konsultacija",
"quantity": 1,
"unitPrice": 99.00,
"unitCode": "vnt",
"discountPercent": 0,
"lineSubtotal": 99.0000,
"vatCodeId": "<PVM kodo _id>",
"vatRate": 21,
"vatAmount": 20.79,
"lineTotal": 119.79
}
],
"subtotal": 9900,
"vatTotal": 2079,
"total": 11979,
"notes": "Ačiū, kad renkatės mus"
}' \
"https://app.jars.lt/api/invoices"
Atsakymas (201) yra sukurta sąskaita su _id ir internalNumber. Kelios taisyklės:
- Pinigų vienetai skiriasi. Eilutės sumos (
unitPrice,lineSubtotal,vatAmount,lineTotal) rašomos eurais su kableliu (iki 4 skaitmenų), o dokumento sumos (subtotal,vatTotal,total) — centais. 99,00 € eilutė duoda"subtotal": 9900. Klaida čia — dažniausia: suma bus šimtą kartų per didelė arba per maža. - Sąskaitos numerio nesiųskite. Pardavimo sąskaitai
numbersuteikiamas išseriestvirtinant.internalNumber(SF-2026-00001) yra vidinis registracijos numeris, jis spausdinamoje sąskaitoje nerodomas. - PVM suvestinė (
vatSummary) apskaičiuojama pati, jos siųsti nebūtina. - Lauką
externalCodevisada nurodykite — jis padaro užklausą saugiai kartojamą (žr. toliau). - Sąskaitą galima keisti (
PUT /api/invoices/{id}), kol ji yraDRAFT.
3. Patvirtinimas
curl -s -X POST \
-H "Authorization: Bearer $API_KEY" \
"https://app.jars.lt/api/invoices/<sąskaitos _id>/post"
Atsakyme invoice.number yra oficialus numeris (pvz., SF-00001). Po patvirtinimo sąskaita nebekeičiama, išskyrus pastabas ir mokėjimo terminą. Patvirtinimas sukuria žurnalo įrašą; įmonėms, kurios veda supaprastintą apskaitą (individuali veikla, verslo liudijimas), įrašo nėra, tačiau numeris suteikiamas taip pat.
4. PDF
Sąskaitos PDF gaunamas dviem kvietimais:
# 4a. Sugeneruoti PDF (paprastai kelios sekundės)
curl -s -X POST \
-H "Authorization: Bearer $API_KEY" \
"https://app.jars.lt/api/invoices/<sąskaitos _id>/pdf"
# {"s3Key":"…","sizeBytes":125432}
# 4b. Atsisiųsti failą
curl -s -H "Authorization: Bearer $API_KEY" \
-o sf-00001.pdf \
"https://app.jars.lt/api/invoices/<sąskaitos _id>/pdf"
- Pirmiausia
POST, paskuiGET. Kol PDF nesugeneruotas,GETatsako404su pranešimuPDF not yet generated. Atsakyme įPOSTfailo nėra — jį atsiunčia tikGET. POSTgalima kartoti: jis sugeneruoja PDF iš naujo. Užklausos laukimo ribą nustatykite bent 30 sekundžių.- Kalba imama iš kliento kortelės (
correspondenceLanguage). Pakeitus kliento kortelę, PDF reikia sugeneruoti iš naujo. - Pakeitus patvirtintos sąskaitos pastabas ar mokėjimo terminą, ankstesnis PDF nebelaikomas:
GETvėl atsakys404, kol vėl iškviesitePOST. - PDF failai saugomi metus. Senesnį PDF
GETsugeneruoja iš naujo pats, todėl klaidos nebus, bet gausite šiandienos išvaizdos dokumentą. - Atsisiuntimo failo pavadinimas —
Sąskaita <numeris>.pdf(antraštėjeContent-Disposition).
5. Išsiuntimas klientui
Yra du būdai.
A. Siunčiate patys. Pasiimkite PDF (4b) ir išsiųskite iš savo pašto sistemos, savo siuntėjo adresu ir savo laišku. Taip daro ir mūsų pačių integracijos: laiško tekstas, siuntėjas ir pakartojimai lieka Jūsų kontrolėje.
B. Siunčia JARS.
curl -s -X POST \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "buhalterija@klientas.example",
"subject": "Sąskaita SF-00001",
"bodyHtml": "<p>Sveiki, siunčiame sąskaitą.</p>"
}' \
"https://app.jars.lt/api/invoices/<sąskaitos _id>/send-email"
# {"ok":true,"sentTo":"…","sentAt":"…"}
- Privalomas tik
email(vienas gavėjas).subjectirbodyHtmlneprivalomi: nenurodžius, JARS parašo standartinį laišką kliento kalba, o tema visada lietuviška (Sąskaita faktūra SF-00001 (Jūsų įmonė)). NurodytasbodyHtmlpakeičia visą laiško tekstą. - PDF pridedamas automatiškai. Jei jo dar nėra arba jis pasenęs, JARS sugeneruoja jį prieš siųsdamas, todėl 4 žingsnio galima nevykdyti.
- Laiškas siunčiamas iš JARS adreso
noreply@jars.lt, oReply-To— Jūsų įmonės el. paštas iš įmonės nustatymų (Nustatymai → Įmonės nustatymai). Jei jo nėra, klientas neturės kam atsakyti. Pats siuntėjo adresas keičiamas negali. Jei laiškas turi eiti iš Jūsų domeno, rinkitės A būdą. - Siunčiama tik patvirtinta pardavimo sąskaita. Sėkmingai išsiuntus, sąskaitoje užrašoma, kada ir kam (
emailSentAt,emailSentTo), o audito žurnale atsiranda įrašas. - Pakartotinis kvietimas išsiunčia dar vieną laišką: jokios apsaugos nuo dubliavimo nėra, todėl neautomatizuokite kartojimo „kol nepavyks“ be savo žymos, kad laiškas jau išsiųstas.
Kartojimas po klaidos
Tinklas nutrūksta, procesas užstringa, atsakymas neatkeliauja. Tada svarbiausia neišrašyti antros sąskaitos tam pačiam užsakymui. Seka saugiai kartojama, jei prieš kiekvieną žingsnį pasitikrinate, ar jis jau atliktas:
- Prieš kurdami juodraštį, ieškokite pagal
externalCode:GET /api/invoices?externalCode=ORDER-2026-0042. Radę — tęskite nuo jos.externalCodeyra unikalus: jei du procesai kuria vienu metu, antrasis gauna409su koduDUPLICATE_KEY. Tada tiesiog suraskite laimėtojo sąskaitą ir tęskite. - Patvirtinimas nėra kartojamas. Antras
/postatsako400su koduDOC_NOT_DRAFT. Tai ne klaida: perskaitykite sąskaitą (GET /api/invoices/{id}) ir paimkitenumber. Jei kitas procesas tvirtina tą pačią sąskaitą šią akimirką, gausiteINVOICE_POSTING_IN_PROGRESS: palaukite ir perskaitykite iš naujo. - PDF generavimas kartojamas laisvai, nes rezultatas tas pats.
- Siuntimas — vienintelis žingsnis, kurio kartoti negalima aklai. Pažymėkite savo sistemoje, kad laiškas išsiųstas, o jei naudojate B būdą, pažiūrėkite sąskaitos
emailSentAt.
Paprasčiausia schema: kiekvieną kartą pradėkite nuo sąskaitos paieškos pagal externalCode, o toliau žiūrėkite jos būseną (DRAFT ar POSTED) ir ar jau yra PDF. Savo sistemoje išsaugokite sąskaitos _id ir numerį, kai tik juos gaunate, kad kitas bandymas jų nebeieškotų.
API raktas ir teisės
- Raktas susietas su viena įmone ir veikia su jį sukūrusio naudotojo teisėmis. Savininko (
OWNER) raktas gali tai, ką savininkas; buhalterio (ACCOUNTANT) raktas — ką buhalteris; stebėtojo (VIEWER) raktas gali tik skaityti, rašymo užklausas JARS atmeta. Rolių lentelė — puslapyje Naudotojai ir rolės. - Rakto apriboti tik pardavimo sąskaitomis kol kas negalima. Rakto tipai yra du: pilnas (REST API) ir MCP raktas, kuris veikia tik MCP jungtyje ir REST API nepasiekia. Pilnas raktas gali daryti viską, ką leidžia jį sukūrusio naudotojo rolė, įskaitant kitų dokumentų skaitymą ir keitimą.
Kaip sumažinti riziką:
- Raktą laikykite tik savo serveryje. Vadybininkė dirba Jūsų sistemoje, o ši kreipiasi į JARS. Raktas niekada neturi patekti į naršyklę, kompiuterį ar pašto programą. Tada svarbu tik tai, kokias užklausas siunčia Jūsų serveris, o jos fiksuotos: PVM kodai, partneriai, sąskaitos, PDF.
- Nenaudokite savininko rakto. Sukurkite atskirą naudotoją su buhalterio role (Nustatymai → Nariai) ir raktą generuokite jam: buhalterio rolė negali kviesti naudotojų, keisti rolių ir šalinti įmonės.
- Kiekvienai integracijai — atskiras raktas su aiškiu pavadinimu, pvz., „Vadybininkų sąskaitų sistema“. Atšaukus raktą (Nustatymai → API raktai), jis nustoja veikti iškart.
- Žiūrėkite audito žurnalą (Ataskaitos → Pakeitimų žurnalas): kiekvienas raktu atliktas pakeitimas pažymėtas kaip atliktas per API ir nurodo rakto pavadinimą.
- Laikotarpis, kurį uždarėte (Periodas uždarytas iki), apsaugotas ir nuo API: į jį sąskaitų įrašyti nepavyks.
Dažniausi atsakymai
| Kodas | Kada | Ką daryti |
|---|---|---|
409 DUPLICATE_KEY | externalCode jau panaudotas | Suraskite esamą įrašą pagal externalCode |
400 DOC_NOT_DRAFT | /post kartojamas arba keičiama patvirtinta sąskaita | Perskaitykite sąskaitą ir tęskite |
400 INVOICE_POSTING_IN_PROGRESS | Kita užklausa tvirtina ar atšaukia tą pačią sąskaitą | Palaukite ir perskaitykite iš naujo |
400 PERIOD_CLOSED | Sąskaitos data patenka į uždarytą laikotarpį | Pakeiskite datą arba atidarykite laikotarpį |
404 PDF not yet generated | GET /pdf prieš POST /pdf | Pirmiausia iškvieskite POST |
400 INVALID_EMAIL | Tuščias ar netinkamas email | Patikrinkite adresą |
400 EMAIL_SALES_ONLY | Bandoma siųsti pirkimo sąskaitą | Siunčiamos tik pardavimo sąskaitos |
400 DOC_NOT_POSTED | Siunčiamas juodraštis | Pirmiausia patvirtinkite |
500 PDF_RENDER_FAILED, PDF_READ_FAILED, EMAIL_SEND_FAILED | Sutriko mūsų pusėje; pranešta mums | Kartokite vėliau; neišnyksta — parašykite mums |
Pilnas sąskaitos laukų sąrašas ir klaidų kodai pateikti API nuorodoje.