Откуцај
ЋИРLATENРУ Пријава

Упутство за инсталацију

Откуцај, регистарски назив „Otkucaj“ · верзија 1.3.6 · otkucaj.com · Корисничко упутство · Упутство за конфигурацију

Коме је овај документ намењен: ономе ко Откуцај инсталира код обвезника, било да је то испоручилац, ИТ сарадник обвезника или сам обвезник. Описује шта се инсталира, три начина испоруке и поступак за сваки, од празног рачунара до првог провереног рачуна. Подешавање после инсталације је засебан документ: Упутство за конфигурацију.

Све што овај документ каже о прописима је наше разумевање, а не правни ни порески савет; пре одлуке проверите код књиговође или у Пореској управи.

Садржај

1.Шта се инсталира, а шта не

Електронски фискални уређај чине три елемента: ЕСИР, ПФР и безбедносни елемент. Овим упутством се инсталира само први од њих. Откуцај јесте ЕСИР: прикупља ставке, попусте, плаћања и податке о купцу, саставља захтев, шаље га ПФР-у и приказује и штампа рачун који ПФР врати. Он не фискализује рачуне, не додељује ПФР број ни бројач и не потписује рачун.

Л-ПФР се набавља и инсталира одвојено. Локални процесор фискалних рачуна је засебан програм или уређај, са сопственим одобрењем Пореске управе и сопственим евиденционим бројем. Инсталира га његов испоручилац, по свом упутству, и то пре или после Откуцаја, свеједно. Откуцај се на њега само повезује преко мреже, што је поступак из поглавља 4.7 овог упутства. Ако обвезник још нема Л-ПФР, инсталација Откуцаја се доводи до краја и оставља у демо режиму, а веза се подешава кад Л-ПФР стигне.

Безбедносни елемент издаје Пореска управа обвезнику и он се не инсталира овим упутством. У облику паметне картице стоји у читачу Л-ПФР-а и њиме потписује сам Л-ПФР; Откуцај картици не приступа. У облику датотеке (.pfx или .p12) користи се уз В-ПФР и поставља се кроз Подешавања, што је описано у Упутству за конфигурацију. Ниједан безбедносни елемент се не копира у директоријуме програма ручно.

2.Начини испоруке

Откуцај се испоручује на три начина. Програм је у сва три исти, база података и подешавања су у сва три иста, а разликују се само по томе на ком рачунару програм ради и ко га поставља. Обвезник у сваком тренутку може прећи са једног начина на други, јер се цела инсталација своди на базу података и једну конфигурациону датотеку.

Начин испорукеКо инсталираГде програм радиПоглавље
Путем интернета (клауд сервис)Испоручилац; обвезник само отвара налогНа серверу издаваоца, отвара се на адреси otkucaj.com3
Директно у пословном просторуИспоручилац или ИТ сарадник обвезника, на лицу местаНа рачунару или серверу у објекту обвезника4
СамоинсталацијаОбвезник сам, по овом упутствуКлауд налог отвара сам, или локално по поглављу 43 и 4

Избор начина испоруке повезан је са избором ПФР-а. Уз В-ПФР Пореске управе раде оба начина, јер је стална веза са интернетом ионако услов рада. Уз Л-ПФР ради само локална инсталација, зато што Л-ПФР са Откуцајем разговара преко локалне мреже објекта, а сервер у облаку у ту мрежу не може да уђе. Како ми разумемо чл. 6 ст. 4 Закона о фискализацији, обвезник који ради са В-ПФР-ом мора у сваком пословном простору коме је додељен ЈИД да има и Л-ПФР, осим ако промет на мало обавља искључиво преко интернета или продаје сопствена коришћена покретна материјална средства; Откуцај са Л-ПФР-ом ради само као локална инсталација.

3.Варијанта А: рад преко интернета

У овој варијанти се не инсталира ништа на сервер: програм већ ради на адреси otkucaj.com. Инсталација се своди на отварање налога, инсталацију апликације на уређај касира и проверу штампе.

3.1 Отварање и одобравање налога

Отворите https://otkucaj.com/registracija и попуните пословно име, ПИБ, матични број, број телефона, е-пошту, корисничко име и лозинку од најмање 10 знакова. ПИБ (9 цифара) и матични број (8 цифара) проверавају се по контролној цифри, а телефон мора бити број из Србије, мобилни или фиксни. Са једне мрежне адресе прихвата се највише 5 регистрација на сат.

Налог се отвара неактиван и пријава са њим није могућа док га администратор не одобри. То је намерно: пријава мора да прође кроз некога ко зна да је обвезник стваран. Ако су обавештења подешена, администратор о новој регистрацији добија поруку одмах. По активацији корисник се пријављује уобичајено, корисничким именом и лозинком.

3.2 Прва пријава и водич кроз прве кораке

Отворите https://otkucaj.com/prijava и пријавите се. Образац је заштићен невидљивом провером (Cloudflare Turnstile), која не тражи слагалице ни прекуцавање знакова; ако сервис провере тренутно није доступан, пријава пролази и без ње. После 8 погрешних покушаја у минуту пријава се са те мрежне адресе привремено закључава.

Поље Остани пријављен на овом уређају је означено унапред и на каси у објекту га треба оставити тако: касир се пријављује једном и остаје пријављен и после гашења рачунара. На туђем или дељеном рачунару га искључите. Пријава на свим уређајима се прекида у Подешавања, Корисници, дугметом Одјави ме свуда, а исто се дешава и при промени лозинке или деактивацији налога.

При првој пријави отвара се кратак водич кроз пет корака: основе Касе, картице отворених рачуна, врсте рачуна и плаћања, издавање и штампа, и на крају инсталација апликације. Водич се може поново покренути у сваком тренутку: Подешавања, Подаци о обвезнику, О апликацији, дугме Водич.

3.3 Инсталација апликације на уређај (PWA)

Откуцај је инсталабилна веб апликација: добија своју икону, отвара се у сопственом прозору и чува шифарник артикала локално, па се Каса отвара и када веза падне. Инсталација није обавезна, али се на каси препоручује, због рада без интернета и брже пречице.

УређајПоступак
Windows, Chrome или EdgeОтворите otkucaj.com, кликните икону „Инсталирај“ у адресној траци, или мени прегледача, па „Инсталирај апликацију“ (у Edge-у: Апликације, па „Инсталирај ову локацију као апликацију“). Апликација добија пречицу у Старт менију.
AndroidУ Chrome-у отворите сајт, мени са три тачке, па „Инсталирај апликацију“ (или „Додај на почетни екран“).
iPhone и iPadУ Safari-ју отворите сајт, дугме Дели (Share), па „Add to Home Screen“.

Исто дугме Инсталирај апликацију постоји и у горњој траци почетне стране и у Подешавања, Подаци о обвезнику, О апликацији. Апликација се отвара на екрану Касе и ради у пуном прозору, без адресне траке.

3.4 Подешавање штампача и провера QR кода

  1. Инсталирајте штампач у оперативни систем са драјвером произвођача и подесите величину папира: ролна 58 mm или 80 mm за журнал, лист А4 или А5 за рачун као документ. Ради и обичан канцеларијски штампач.
  2. У Подешавања, Штампа и плаћање изаберите исту ширину папира и ширину рачуна у знаковима: уобичајено 40 за ролну од 80 mm и 32 за ролну од 58 mm. Дозвољени распон је 32 до 64 знака.
  3. У дијалогу штампе прегледача (Ctrl+P) поставите маргине на „без маргина“, размеру на 100% и искључите заглавља и подножја. Прегледач та подешавања памти, па се раде само први пут по уређају.
  4. Одштампајте пробни рачун и лењиром измерите QR код. Мора бити квадрат странице од 40 до 50 mm. Откуцај га штампа на 41 mm на ролни од 58 mm и на 45 mm на ролни од 80 mm и на листовима А4 и А5, што је у оба случаја унутар прописаног распона.
  5. Проверите да ниједан ред журнала не излази са десне ивице папира. Ширина отиска рачуна је 46 mm на ролни од 58 mm и 68 mm на ролни од 80 mm, а величина слова се изводи из броја знакова у реду, па се на ужу ролну прелази смањивањем броја знакова са 40 на 32, а не смањивањем размере штампе.
Не смањујте размеру штампе да би рачун стао. Размера мења и физичку величину QR кода, а он мора остати између 40 и 50 mm. Ако рачун не стаје, смањите број знакова у реду у Подешавањима.

3.5 Провера инсталације

Инсталација је завршена када кроз цео ток прође један рачун врсте Обука. Та врста пролази исти пут као прави рачун (ПФР, журнал, QR код, штампа), али носи поруку да није фискални рачун, не улази у промет и искључена је из свих извештаја, па је безбедна за пробу.

  1. Отворите Касу, додајте један артикал и изаберите врсту рачуна Обука.
  2. Издајте рачун и сачекајте да се појави журнал са QR кодом.
  3. Кликните Штампај и проверите отисак: сви редови унутар папира, QR код 40 до 50 mm, текст читљив.
  4. Скенирајте QR код телефоном и отворите адресу за проверу.
  5. Отворите Рачуни и проверите да је тај рачун у регистру.

4.Варијанта Б: локална инсталација у пословном простору

У овој варијанти цео Откуцај ради на рачунару у објекту обвезника. То је варијанта коју захтева рад са Л-ПФР-ом и рад без интернета. Поступак испод води од празног рачунара до провереног рачуна и изводи се једном по продајном месту.

4.1 Системски захтеви

  • Рачунар са оперативним системом Windows или Linux.
  • PHP 8.3 или новији (издавалац продукцијски ради на 8.5), са проширењима pdo_mysql, mbstring, openssl и curl. Проширење json је од PHP 8 део језгра. Проверава се командом php -m.
  • MySQL 8.0 или новији, односно MariaDB 10.6 или новија.
  • Веб сервер који PHP извршава преко FastCGI-ја или сличног (nginx, Apache, IIS).
  • Л-ПФР, засебно одобрен код Пореске управе, инсталиран на истом рачунару или у истој локалној мрежи, са читачем картица и безбедносним елементом. Није део Откуцаја и набавља се одвојено (поглавље 1).
  • Термални штампач ролне 58 или 80 mm са драјвером за тај систем, или обичан A4 штампач.

Ако сервер сам издаје рачуне е-поштом, потребан му је и излаз за пошту. Без њега све остало ради, а слање рачуна е-поштом не.

4.2 Распакивање и права над директоријумима

Испоручени пакет садржи три директоријума и шему базе:

otkucaj/
  app/         програм, подешавања, преводи, погледи
  public/      једини директоријум који веб сервер сме да служи
  bin/         командне алатке (migrate.php, seed.php)
  schema.sql   шема базе података

Распакујте пакет ван директоријума који веб сервер служи, на пример у /var/www/otkucaj на Linux-у или C:\otkucaj на Windows-у. Веб сервер ће касније показивати само на подпутању public.

Права: власник свих датотека нека буде корисник под којим ради веб сервер (на Linux-у најчешће www-data). Програму је за рад довољно право читања. У свом директоријуму он у раду пише само у један подпут, private, поред app и public, у који чува дигитални сертификат безбедносног елемента. Тај директоријум не морате правити унапред: апликација га прави сама при првом постављању сертификата, са правима 0750, а саму датотеку сертификата уписује са правима 0600.

Директоријум private никада не сме бити унутар public. У њему стоји безбедносни елемент. Ако веб сервер показује на цео директоријум програма уместо на public, сертификат и конфигурациона датотека постају доступни са интернета. Проверу тога носи и контролна листа у поглављу 8.

4.3 Креирање базе и увоз шеме

Направите базу и корисника. Кодни распоред мора бити utf8mb4, јер и корисничко сучеље и називи артикала и цео журнал иду на ћирилици:

CREATE DATABASE kasir CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'kasir'@'127.0.0.1' IDENTIFIED BY 'ЛОЗИНКА';
GRANT ALL PRIVILEGES ON kasir.* TO 'kasir'@'127.0.0.1';
FLUSH PRIVILEGES;

Затим увезите шему:

mysql -u kasir -p kasir < schema.sql

Шема прави табеле и уписује почетно стање: подразумеване српске пореске ознаке (Ђ 20%, Е 10%, Г 0%, А ван ПДВ), ширину рачуна од 40 знакова и оба окружења, при чему је активно тест окружење у демо режиму. Подаци о обвезнику се намерно уписују празни: ово је преносив производ и рачун не сме да носи име фирме која не постоји. Уносе се касније, кроз Подешавања.

4.4 Конфигурациона датотека

Копирајте app/config.sample.php у app/config.php и попуните пет вредности. Датотека врши повратак низа и изгледа овако:

<?php
return [
    'debug'    => false,
    'base_url' => 'http://localhost:8080',
    'app_key'  => '64 хексадецималне цифре',
    'db' => [
        'host' => '127.0.0.1',
        'name' => 'kasir',
        'user' => 'kasir',
        'pass' => 'ЛОЗИНКА',
    ],
];
ПараметарШта значи и како се поставља
debugМора остати false на инсталацији која ради. Са true се поруке о грешкама исписују посетиоцу уместо да иду само у дневник сервера.
base_urlАдреса на којој се апликација отвара, без косе црте на крају. Код локалне инсталације то је локална адреса, на пример http://localhost:8080 или адреса рачунара у мрежи. Тако све везе унутар апликације остају у локалној мрежи.
app_keyТајни кључ ове инсталације, тачно 64 хексадецималне цифре. Њиме се шифрује лозинка сертификата безбедносног елемента. Направите нов кључ за сваку инсталацију и никада не преузимајте туђи. Направите га командом php -r "echo bin2hex(random_bytes(32));". Ако се кључ касније промени, већ сачувана лозинка сертификата више се не може прочитати и мора се унети поново.
db.hostАдреса сервера базе, најчешће 127.0.0.1.
db.name · db.user · db.passИме базе, корисник и лозинка из поглавља 4.3.

Датотеку затим закључајте: она носи лозинку базе и кључ инсталације. На Linux-у је довољно chmod 640 app/config.php уз власништво корисника веб сервера. Она се налази ван директоријума који се служи, па се не може преузети са мреже; то се ипак провери у поглављу 8.

После попуњавања конфигурације покрените миграцију шеме. Она је идемпотентна, свака измена прво проверава затечено стање, па се сме покренути и на свежој бази и после сваке надоградње:

php bin/migrate.php

Алатка исписује шта је применила и колико је корака већ било на месту. Ту се, између осталог, додељује серијски број инсталације у облику OTK-XXXXXXXXXXXX. Он је јединствен за ту инсталацију, изведен из случајних бајтова, и не мења се ни после надоградње ни после враћања резервне копије.

4.5 Веб сервер, локална адреса и порт

Веб сервер се подешава по три правила:

  1. Коренски директоријум је public, никад директоријум изнад њега. У њему су само датотеке које смеју да се служе.
  2. Сваки захтев који није постојећа датотека води на public/index.php. Откуцај има један улазни програм који сам одлучује коју страницу приказује. Уз програм се не испоручује ниједна датотека са правилима преусмеравања, па се то правило уписује у подешавања самог сервера. У nginx-у је то try_files $uri /index.php$is_args$args;.
  3. PHP се извршава преко FastCGI процеса, у верзији из поглавља 4.1.

Порт бирате слободно; уобичајено је 8080 за локалну инсталацију. Иста адреса и порт морају стајати и у параметру base_url, иначе ће адресе у порукама е-поште и у линковима за проверу рачуна показивати на погрешно место.

Провера при пријави. Заштита обрасца за пријаву (Cloudflare Turnstile) захтева интернет. На инсталацији која ради без везе искључује се уписом у табелу подешавања:

UPDATE settings SET v = '0' WHERE k = 'turnstile_enforce';

Пријава и даље тражи корисничко име и лозинку и даље се закључава после 8 погрешних покушаја у минуту. Ако провера остане укључена а мреже нема, пријава свеједно пролази, јер провера намерно пропушта корисника кад сервис за проверу није доступан; препорука је ипак да се на локалној инсталацији изричито искључи.

Веза преко обичног HTTP-а је довољна за рад у локалној мрежи и апликација на њу рачуна: колачић сесије тражи заштићену везу само тамо где веза јесте заштићена. Инсталација апликације на уређај и рад без интернета из поглавља 3.3 траже заштићену везу, па на локалној инсталацији раде на самом рачунару, преко адресе http://localhost, а са других рачунара у мрежи тек кад сервер добије HTTPS.

4.6 Први администраторски налог

Свеже инсталирана база нема ниједног корисника, а образац за регистрацију прави налог који је неактиван док га неко не одобри. Први налог се зато прави из командне линије:

php bin/seed.php admin ЛОЗИНКА-ОД-НАЈМАЊЕ-10-ЗНАКОВА "Име Презиме"

Алатка прави администраторски налог, а ако корисник тог имена већ постоји, поставља му нову лозинку и враћа му улогу администратора. Трећи параметар је име које се исписује и штампа на рачуну; ако се изостави, уписује се „Администратор“. Ако је шифарник артикала празан, алатка уз то уписује осам огледних артикала, да Каса не буде празна при првој проби; они се касније бришу или замењују сопственим шифарником.

Пријавите се тим налогом и одмах промените лозинку у Подешавања, Корисници. Остале касире отвара администратор, кроз исти екран, са улогом Касир.

4.7 Повезивање на Л-ПФР

Л-ПФР мора већ бити инсталиран и покренут, са безбедносним елементом у читачу. Његов испоручилац даје адресу и порт на којима слуша.

  1. Отворите Подешавања, картицу Окружење и ПФР, за окружење у ком радите.
  2. За Режим рада изаберите Л-ПФР.
  3. У поље Л-ПФР адреса унесите адресу коју је дао испоручилац, на пример http://localhost:8888, или адресу рачунара у локалној мрежи ако Л-ПФР ради на другом рачунару.
  4. Сачувајте и погледајте статус везе на истој картици. Он се очитава уживо, при сваком отварању Подешавања и почетне стране.

Веза са Л-ПФР-ом иде преко обичног HTTP-а у локалној мрежи, како прописује Технички водич, и на њој се не шаље никакав сертификат: према безбедносном елементу аутентификује се сам Л-ПФР, преко читача картица. Ако статус јавља да ПФР није доступан, проверите да је Л-ПФР покренут, да је на истој мрежи и да су адреса и порт тачни. Ако јави да картица није убачена или да тражи ПИН, то решава Л-ПФР, не Откуцај.

Уколико се уместо Л-ПФР-а користи В-ПФР Пореске управе, режим се поставља на В-ПФР, а адреса мора почињати са https://: обичан HTTP се одбија при чувању, зато што се преко њега безбедносни елемент не шаље. Сертификат и ПАК се уносе по Упутству за конфигурацију.

4.8 Провера инсталације

  1. Отворите /zdravlje у прегледачу. Одговор мора бити {"ok":true,"app":"kasir","version":"1.3.6"}. То значи да и програм и база раде.
  2. Пријавите се налогом из поглавља 4.6.
  3. Отворите Подешавања и проверите да картица Окружење и ПФР показује очекивани режим и жив статус везе.
  4. Издајте један рачун врсте Обука и одштампајте га, тачно као у поглављу 3.5, укључујући мерење QR кода.
  5. Покушајте да у прегледачу отворите адресу апликације уз додатак /app/config.php, па исто са /private/vpfr-sandbox.p12. Оба захтева морају вратити грешку, а не садржај: те датотеке су ван директоријума који веб сервер служи.

5.Надоградња верзије

Надоградња мења само програм. Преко постојеће инсталације се препишу директоријуми app, public и bin из новог пакета, па се покрене php bin/migrate.php. Пре тога направите резервну копију базе по поглављу 6.

Оно што надоградња не дира: app/config.php (не налази се у пакету и никада се не преписује), директоријум private са безбедносним елементом, цела база података са рачунима, артиклима, корисницима и подешавањима, и серијски број инсталације, који остаје исти и после надоградње и после враћања резервне копије, зато што је уписан у базу. Ако је апликација инсталирана на уређај касира, нова верзија се преузима сама при следећем отварању.

6.Резервна копија и враћање

Цело стање инсталације чине три ствари: база података, датотека app/config.php и директоријум private. Програм се увек може распаковати поново из пакета, па се не архивира. Копија базе се прави уобичајеном алатком:

mysqldump -u kasir -p kasir > kasir-2026-08-21.sql

Правите је најмање једном дневно и држите је ван тог рачунара. Враћање иде обрнутим редом: распакујте програм, вратите app/config.php и private, увезите копију базе и покрените php bin/migrate.php. Пошто app_key из конфигурације отвара лозинку сертификата, копија базе без те датотеке није довољна: сачувајте обе.

7.Деинсталација

Апликација на уређају касира. На Windows-у: Подешавања, Апликације, пронађите Откуцај, па Деинсталирај, или у Chrome-у отворите chrome://apps и уклоните икону. На Android-у: дуги притисак на икону, па Уклони. На iPhone-у и iPad-у: дуги притисак на икону, па Уклони апликацију. Тиме се уклања само пречица и локална копија; подаци остају у бази на серверу.

Локална инсталација. Зауставите веб сервер, обришите директоријум програма и обришите базу и њеног корисника. Пре брисања базе обавезно направите копију по поглављу 6: у бази су сви издати рачуни, а фискални рачун не сме нестати само зато што је програм уклоњен. Изричито проверите да сте обрисали и директоријум private, у ком стоји безбедносни елемент.

8.Контролна листа после инсталације

Инсталација се сматра завршеном када сваки ред испод буде потврђен. Редови 5 до 8 односе се само на локалну инсталацију.

#ПровераПотврђено
1Пријава радним налогом успева, а екран Касе се отвара.
2Подешавања, Окружење и ПФР приказују очекивани режим и жив статус везе.
3Издат је рачун врсте Обука и види се у регистру рачуна.
4Тај рачун је одштампан: ниједан ред не излази са ивице папира, QR код измерен лењиром износи од 40 до 50 mm и чита се камером телефона.
5Адреса /zdravlje враћа ok: true и очекивану верзију.
6app/config.php и директоријум private нису доступни преко прегледача.
7app_key је нов за ову инсталацију, дуг 64 хексадецималне цифре, а debug је false.
8Направљена је прва резервна копија базе и app/config.php, и држи се ван тог рачунара.
9Серијски број инсталације је записан: Подешавања, Подаци о обвезнику, О апликацији.
10Прочитано је Упутство за конфигурацију и његова контролна листа је заказана пре првог правог рачуна.
Инсталација није дозвола за издавање фискалних рачуна. Свеже инсталиран Откуцај ради у тест окружењу, у демо режиму, и сваки рачун носи ознаку ДЕМО. Прелазак на стварно издавање описан је у Упутству за конфигурацију и могућ је тек кад обвезник има безбедносни елемент и кад ЕСИР има евиденциони број Пореске управе.