Nastanak
U proljeće 1993-će godine dobivam novo radno mjesto u Sesvetama, u firmi Price Cutters, koja se bavi maloprodajom. Oformljava se ekipa koju predvodi Nikola Dujmović kao glavni strateg i vođa, a osim mene tu su Branko Sinković, Branko Banda, Milorad Maričić i Mladen Popović. Posao smo grubo podijelili na razvoj novih aplikacija (Milorad i ja) te održavanje, test i instalacije (Mladen i Branko Banda), dok je Branko Sinković povezivao cijelu grupu i radio gdje je bilo potrebno.
Razvoj novih aplikacija Milorad i ja smo podijelili tako da budemo što efikasniji: ja sam radio program za maloprodaju (POS), zajedničku biblioteku funkcija i razne pomoćne programe, dok se on uglavnom orijentirao na knjigovodstvene programe.
Kad sam došao, u Price Cutters-ima koristili su POS program koji je napisao Danko Krenčić. Taj program je osnovnu funkciju POS-a obavljao dobro, ali nije bio dovoljno fleksibilan.
Razvoj
Platforma na kojoj je program razvijan je DOS verzija 6.22, a mrežni sustav bio je baziran na Novell Netware verzija 3.1x. Korišten je programski jezik Clipper verzija 5.2e i dodatna biblioteka SIX za indeksiranje "baza" podataka (Clipper koristi DBF format datoteka, poznat iz dbase III programa). Valja napomenuti, kako u to doba RDBMS sustavi nisu živjeli na PC strojevima (a tadašnji, moj razvojni, PC stroj je bio zasnovan na 486 procesoru i imao je 8Mb RAM-a). Ubrzo sam Clipper-ov originalni linker zamijenio efikasnijim Blinker-om.
Osnovne funkcije programa za blagajnu su jednostavne i stoga se i pojavilo
mnoštvo programa na tržištu. Programi su se razlikovali po
robusnosti, fleksibilnosti, brzini rada i jednostavnosti upotrebe.
Ograničen s 640 Kb RAM-a, koliko neće trebati nijednom programu
, u koje je često
trebalo staviti i programe za pristup mreži i dodatne pogonske programe, to
je znao biti zahtjevan zadatak.
Jedna od osnovnih stvari koje je program morao podržavati je oporavljanje nakon nestanka struje ili namjernog gašenja računala. To je postignuto ekstenzivnom provjerom stanja prilikom svakog pokretanja programa. Program se nije mogao oporaviti u slučaju oštećenja njega samoga ili DBF datoteka na disku, ali to su stvari koje se relativno rijetko događaju; do te mjere rijetko, da su blagajnice nerijetko gasile i palile blagajnu kad bi pokrenule neku naprednu funkciju (poput ispisa pomoći :-)) iz koje se nisu znale vratiti.
U program je ugrađeno praktično znanje stjecano na terenu, pa je tako npr. program N puta u sekundi palio "num lock" jer blagajnice imaju duge nokte, pa ga slučajno isključe tipkajući barcode na numeričkoj tipkovnici.
Podrška za ICL blagajne
ICL Atrium i TeamPOS serije blagajni prouzročile su programerima puno muka. ICL Atrium ja zasnovan na Intel 386 procesorima, a TeamPOS je dolazio u dvije varijante: DX2-66 ili DX4-100 (koje, naravno, s programerske strane nisu bile jednake). Do dokumentacije je bilo gotovo nemoguće doći (u to doba Internet nije bio razvijen kao danas, a Google nije postojao), a primjeri koje smo dobili u C-u radili su dobro jednostavne funkcije. Kad je trebalo napraviti složeniju operaciju i to iz Clipper-a, nailazili smo na svu silu problema. Možda najgori problemi vezani su za vremenske time out-e koje je trebalo postavljati između pojedinih operacija. Na kraju, svelo se na niz testova koje je trebalo napraviti i isprobavati u raznim situacijama. Tu mi je veliku pomoć pružio Branko Banda.
Kad sam konačno došao do skupine C funkcija koje sam mogao pozivati iz Clipper-a, stvar je bila puno jednostavnija. Koliko je to bilo dobro rješenje, govori i anegdota, da sam telefonski pomagao drugom (jadnom) ICL programeru kojem nije preostalo ništa drugo nego da zove iz Kaira !
Podrška za ostale blagajne
Program je morao raditi na SalesPoint i ABS blagajnama, koje su u to vrijeme korištene u Price Cutters-ima. ABS blagajna imala se vrlo specifičnu tipkovnicu: slova su poredana po abecedi, grupirana u kvadratni raspored ! Snalaženje na toj tipkovnici bilo je zanimljivo iskustvo :-)
Širenje programa
Program se vrlo brzo pokazao stabilnim i robusnim. Price Cutters-i su se tada brzo širili, pa smo program instalirali na 30-tak lokacija širom RH. Većina instalacija bili su mali dućani, s jednom ili dvije blagajne i modemskom vezom prema centrali u Sesvetama. Program je radio dnevne datoteke koje su se slale u centralu. Sve promjene cijena rađene su u centrali i zatim distribuirane udaljenim blagajnama (modemom ili disketom). Kako je cjenik ubrzo postao prevelik za svakodnevnu distribuciju, napravljene su tzv. AMD datoteke (Add/Modify/Delete ili datoteke izmjena), kojima su se prenosile samo promjene (što je drastično olakšalo rad na terenu). Ideju za AMD datoteke, Branko Sinković preuzeo je iz WHO Drug dictionary, gdje se na taj način ažurirala baza lijekova.
Konfiguracija
Sve konfiguracijske datoteke imale su format ini datoteka poznat iz ranih verzija Windows-a. Podijeljene su u dva dijela: zajedničke, "sistemske" datoteke (u sys poddirektoriju) i specifične INI datoteke (u ini poddirektoriju). U zajedničkim datotekama nalaze se opisi pojedinih hardware-skih komponenti.
INI datoteke hijerarhijski su organizirane prema lokaciji blagajne. U vrhu hijerarhije nalazi se oznaka države ("HR"), nakon čega slijedi oznaka lokacije ("ZGSE": Zagreb, Sesvete) i oznaka dućana ("D1"). Na kraju je sama blagajna ("PC0001"). Na svakom nivou može postojati ini datoteka, a što je specifičnija (dalje od vrha hijerarhije), to su postavke u njoj veće težine. Tako je moguće općenite stvari definirati na vrhu, odakle se nasljeđuju prema "nižim" nivoima (na kojima mogu biti redefinirane). Na nivou blagajne ("pc0001.ini") definiraju se hardware UI (ulazno/izlazni) sklopovi koje blagajna ima ugrađene (tu je moglo biti više ili manje definicija: navedu se štampači, čitači linijskog koda, čitači magnetskih kartica i tipkovnica; ne navode se dijelovi poput procesora ili diska).
INI varijable imale su ponekad živopisna imena i značenja, npr.: OTVORI LADICU = DA značilo je da blagajna nema nikakav zvučni signal, pa kad je program trebao reći "beep", a nije bilo zvučnika, on bi "bubnuo" blagajnicu ladicom u želudac.
Definicije ispisa
Tijekom prilagodbe programa potrebama Školske knjige (1994-ta godina), jedna od najbitnijih izmjena bila je definiranje svih ispisa u vanjskim tekstualnim datotekama. Jasno je kako se morao raditi kompromis: nije moguće u takvom okruženju napraviti općeniti generator izvještaja. Učitavanje i parsiranje definicija radi se kod pokretanja programa, ponešto ga usporavajući, ali sam rad nije osjetno usporen. Kasnijom pojavom brzih strojeva svaki spomen brzine postao je bespredmetan.
Ovako izdvojena definicija ispisa, uz ranije definicije štampača, omogućila je upotrebu programa u vrlo šarolikom hardware-skom okruženju:
- na specijaliziranim blagajnama (poput ICL Atrium, ICL TeamPOS, IBM SureOne)
- na blagajnama sklopljenim od različitih komponenti (poput EuroTera, GlobalPos rješenja)
- na jeftinim PC-ima kojima je dodana ladica i POS printer, moguće čitač linijskog koda
Namjenske kartice
Kod implementacije u TrgoFolijaPlast d.o.o. (1997 godina) programu je trebalo dodati podršku za kartice koje je vlasnik dijelio svojim kupcima i poslovnim partnerima. Napravljeno je nekoliko serija kartica s različitom namjenom, općenito jednom vrstom popusta.
Na sličnu ideju uskoro su došli u Školskoj knjizi, osmišljavajući svoj klub čitatelja. Paralelno s popustima đacima, studentima i umirovljenicima ta je akcija dovela do zbrke, dok nije razjašnjeno da se po računu može davati samo jedan (najveći po bilo kojoj osnovi) popust.
Druge verzije programa
Jedna specifična verzija programa radila je u butiku Super Stuff. Vlasnik je imao udaljeno skladište za koje je napravljen program u Visual Basic-u. POS program u butiku imao je ugrađen dio za modemsku komunikaciju, zasnovan na telepathy biblioteci (engl. library) koji je komunicirao s Clipper programom u skladištu. Prenosile su se datoteke u kojima su informacije putovale između POS programa i VB programa u skladištu.
Za (propale) pregovore s Gavrilovićem, napravljena je posebna verzija programa koja je komunicirala s Mettler Toledo vagom. Dobio sam specifikaciju protokola i napisao Clipper proceduru koja je slala vagi podatke o proizvodima koji se mogu vagati (PLU kod, naziv proizvoda, jedinična cijena) i proceduru koja je s vage "čitala" podatke o izvaganim proizvodima. Kasnije su te procedure korištene u TrgoFolijaPlast dućanima.
Korisnici i prava
Program radi na stroju koji obavlja funkciju blagajne te stoga nema potrebe za posebnom zaštitom. Tko ima fizički pristup stroju može pokupiti novce iz ladice (ako zna kako ili ima veliki čekić). Ipak, implementira se osnovna zaštita: nakon učitavanja konfiguracije program traži unos imena i lozinke. Popis korisnika, njihovih lozinki i pripadnost grupama nalaze se u usr poddirektoriju.
Zaštita od kopiranja
Kako se pojavila realna opasnost širenja kopiranih verzija programa, ugrađena je zaštita od kopiranja. Zaštita nije sprečavala samo kopiranje, ali kod pokretanja kopiranog programa tražila je unos licence. Postupak je slijedeći:
- sekvenca koja služi za licenciranje generira se dinamički na blagajni
- sekvencu treba javiti telefonom u Items
- programom za licenciranje (u Itemsu) generira se kod koji "otključava" blagajnu
- kod koji "otključava" blagajnu treba upisati na predviđeno mjesto
Postupak se svodi na izmjenu dvije alfanumeričke sekvence. To je omogućilo kontrolu broja kopija programa.