Bosanska lokalizacija Odoo open-source platforme, l10n_ba_edi v16.0.3.8.2, l10n_ba_edi_srv 1.22.0


Današnje izdanje bosanske lokalizacije Odoo platforme donosi dvije popravke u fiskalnom lancu — Odoo modulu l10n_ba_edi (v16.0.3.8.2) i fiskalnom EDI serveru l10n_ba_edi_srv (v1.22.0) — te jednu u alatu za produkcijski deploy.

Kontekst: FPrint “duplikat”

FPrint je jedan od dva podržana fiskalna drivera (uz OFS). Štampa duplikata računa se na uređaj šalje komandom 109, u dvije sintakse:

  • po datumu/vremenu (syntax 1) — mode=1
  • po broju dokumenta (syntax 2) — mode=2, novododano i sada je default

Korisnik bira način u dijalogu Podešavanja fiskalizacije → FPrint duplikat (Po datumu / Po broju), per-korisnik:

Podešavanja fiskalizacije — FPrint duplikat

Bug #1: duplikat vraća HTTP 404 wrong PIN

Nakon uvođenja varijante “po broju”, klik na Fiskalni duplikat je vraćao golu grešku:

FPRINT: GREŠKA duplikat! (HTTP 404)

Najzbunjivije: EDI server u svom logu nije bilježio nijedan duplikat zahtjev, iako je Test pristupa (ping) prolazio i prijavljivao ispravan PIN i verziju drivera (FPrint 1.22.0).

Dijagnoza

Server resolve-a fiskalni driver iz ?driver= query parametra, sa defaultom ofs:

def get_default_driver() -> str:
    return "ofs"

Pin-checked rute idu kroz zajedničku zavisnost koja onda validira PIN za taj driver:

def ensure_pin(pin, driver):
    if f"{pin}" != f"{driver.get_pin()}":
        raise HTTPException(status_code=404,
                            detail={"msg": "wrong PIN", "status": 1300})

Klijentski duplikat URL nije slao driver, pa je server koristio OFS driver (PIN npr. <PINOFS>) i poredio ga sa fprint PIN-om (npr. <PINFPRINT>) → 404 wrong PIN, i to prije ulaska u sam duplikat handler — zato u logu nije bilo nikakvog “duplikat” zapisa.

Dokaz uživo (curl na fiskalnu kasu):

GET /<PINFPRINT>/driver_info               → 404 {"status":1300,"msg":"wrong PIN"}
GET /<PINFPRINT>/driver_info?driver=fprint → 200 {"driver_name":"fprint",...}

Svi ostali fprint pozivi (ping, signed_by, dnevni/periodični izvještaj) već su slali driver=fprint; duplikat je bio jedini koji nije.

Popravka

l10n_ba_edi sada šalje driver (iz korisnikovog EDI tipa) u duplikat URL-u, i osim toga prikazuje stvarno tijelo odgovora servera umjesto golog (HTTP 404):

driver = current_user.l10n_ba_edi_type or 'fprint'
_url = f"{api_host}/{pin}/duplikat/{tip}/{broj}?mode={mode}&driver={driver}"
...
# kod ne-200: mapiraj status 1300 ("wrong PIN") u jasnu poruku + ispiši URL

Bug #2: prebrzo čitanje fajl odgovora (novi parametar)

FPrint međusloj komunicira preko fajlova: zahtjev se upiše u c:\fiscal, a odgovor uređaja se pojavi u c:\fiscal\answer. Rijetko (~1–2× mjesečno na stotine računa) server bi pročitao answer fajl u trenutku kad ga međusloj još upisuje → prazan ili djelimičan sadržaj → lažna greška, iako je fiskalizacija na uređaju uspjela.

Rješenje je kratka grace pauza nakon što se answer fajl pojavi, prije čitanja — kroz zajednički helper settle_answer_file() primijenjen na svih 7 fprint čitača odgovora (račun, duplikat, nuliranje, nasilno zatvaranje, periodični/dnevni izvještaj, polog).

Novi server-side parametar (u dbos-config.yaml, sekcija application.driver.fprint):

application:
  driver:
    fprint:
      pin: '5555'
      timeout: 240
      answer_settle_seconds: 1.0   # pauza (s) nakon pojave answer fajla, prije čitanja (default: 1.0)
DEFAULT_ANSWER_SETTLE_SECONDS = 1.0

def settle_answer_file(answer_file, logger=None):
    delay = get_answer_settle_seconds()   # answer_settle_seconds, default 1.0
    if delay > 0:
        time.sleep(delay)

Default je 1.0 s; vrijednost se po potrebi može povećati na sporijim kasama ili spustiti na 0 za isključivanje.

Današnji commiti

l10n_ba_edi (Odoo modul, v16.0.3.8.2):

  • fix: send driver= in FPrint duplikat URL (avoid 404 wrong PIN)
  • l10n_ba_edi: FPrint duplikat po broju (109 syntax 2) + mode config

l10n_ba_edi_srv (fiskalni EDI server, v1.22.0):

  • fprint: settle delay after answer file appears (fix rare false errors)
  • l10n_ba_edi: FPrint duplikat po broju (109 syntax 2) + mode config
  • bump version → 1.22.0

Napomena

Generisano od strane Claude 🤖


Ernad Husremović, hernad@bring.out.ba