Flera kassor
Två eller fler kassor i samma butik är i R-GO två eller fler installationer. Varje kassa är ett eget kassaregister i lagens mening: den har sin egen journal, sina egna löpnummer, sina egna X- och Z-rapporter och sin egen registrering i kontrollenheten. Det delas aldrig, och det ska inte delas.
Annat går att dela, och mer kommer att gå att dela. Det här kapitlet beskriver hur flera kassor sätts upp i dag, och vad som fortfarande är per kassa.
Varje kassa för sig
Installera varje kassa som i Allt i ett eller
Modulär. Det som skiljer kassorna åt är posId i varje
kassas config/company_info.json - kassans beteckning. Samma värde
används överallt: mot kontrollenheten (två kassor med samma id är för
kontrollenheten samma kassa), på kvitton och rapporter, och i namnet på
kassans katalog i exportarkivet. Ge kassorna korta, unika beteckningar,
till exempel 1, 2, 3.
Ändra inte posId på en kassa som redan är i drift: kontrollenheten är
parad mot id:t, och ett nytt id tar en ny plats av de få den har.
Kontrollenhet
Varje kassa ska vara ansluten till en kontrollenhet. Vi utgår från en dosa per kassa (klass A). En CleanCash kan betjäna flera kassor, men bara ett begränsat antal - hur många beror på dess licens. När kontrollenheten är full svarar den “License exceeded” för nya kassor. Behöver kassorna egna kontrollenheter sitter de på var sin serieport, med var sin brygga.
En kontrollenhet per kassa, på samma dator
Kontrollenheterna behöver inte sitta vid kassorna. En dator kan vara
kontrollenhetsserver: alla dosor sitter där, var och en på sin
serieport. Det är till för bärbara kassor, till exempel en kortterminal
som kör kassan vid bordet. Ingen dosa behöver då kopplas till en enhet
som bärs runt, och kassan når sin dosa över nätet. Varje dosa får då en
egen brygga, alltså en egen receiptprinter, som lyssnar på en egen port.
Varje kassa pekar ut sin brygga i config/cleancash.json.
I Windows-paketet läggs en brygga till som en ny post i
C:\ProgramData\R-GO\services.json. Posten får ett eget namn och en egen
port:
"receiptprinter-kassa2": {
"exe": "{bin}\\receiptprinter.exe",
"args": ["--serial-only", "--serial-port", "COM4", "--ws", "0.0.0.0:8766"]
}
Kör sedan Installera.cmd igen. Varje post i services.json blir en
tjänst, här rgo-receiptprinter-kassa2. Tjänsten har en egen logg,
logs\receiptprinter-kassa2.log, och tas bort av avinstallationen som de
andra. Installationen öppnar också port 8766 i brandväggen för det lokala
nätet, eftersom posten lyssnar på 0.0.0.0. Kassa 2 pekar på
ws://<datorn>:8766/ws.
En brygga talar med en enda dosa. Låt aldrig två bryggor öppna samma serieport, och låt aldrig två kassor dela en brygga.
Kvittoskrivaren från andra datorer
I Windows-paketet lyssnar kvittoskrivartjänsten som förval bara på den
egna datorn (127.0.0.1:8088). Ska andra kassor eller handterminaler
skriva ut på den frågar installationen:
Ska kvittoskrivaren nås från andra datorer i butiken (andra kassor, handterminaler)? [j/N]
Svarar du j lyssnar tjänsten på nätet (0.0.0.0:8088). Brandväggen
släpper då in porten och mDNS (UDP 5353) från det lokala nätet, och
inget annat. Kassorna hittar tjänsten själva på inställningssidan, där
den annonseras som _rgo-printer med sin port. Frågan går att hoppa
över med install.ps1 -Natverk eller install.ps1 -BaraLokalt.
Brandväggsreglerna heter R-GO <tjänst> <port> och R-GO mDNS. De
stäms av vid varje installation mot services.json, så en tjänst du
själv har bundit till 0.0.0.0 får också sin regel. Avinstallationen
tar bort dem.
Det som kan delas i dag
- Skrivare. Flera kassor kan skriva till samma skrivartjänst: peka
deras
printer_service.jsonmot samma adress. Utskrifterna kommer i den ordning de skickas. - Exportarkivet för bokföringen. Arkivet är byggt för att delas: varje
kassa skriver i en egen katalog efter sin beteckning
(
<beteckning>_voucher_z000001/…). Låt kassorna använda samma skrivartjänst, eller samma delade katalog som export. - Varuregistret. Registret (
products.db) ligger hos en av kassorna, huvudkassan, och sköts i dess inställningar. De andra kassorna slår upp varor hos huvudkassans inställningstjänst - se nedan. - Tillgodo. Registret över tillgodokvitton (
values.db) ligger hos huvudkassan, och de andra kassorna utfärdar och löser in där - se nedan. - Fortnox. En Fortnox-tjänst kan leverera verifikaten från alla kassornas kataloger, var och en efter sin beteckning.
- Kortterminal. Varje kassa har normalt sin egen terminal; en Nets-terminal ringer upp en bestämd kassa.
Det som ännu är per kassa
Knappar och inställningar. Varje kassa har sin egen config/. Ska
kassorna se likadana ut kopieras filerna mellan dem.
Gemensamt varuregister
Varuregistret är en egen databasfil, products.db, och inställningarna
(web_setup) är tjänsten för den. I en butik med flera kassor ligger
filen hos en kassa - huvudkassan - och de andra kassorna frågar
huvudkassans inställningar när de slår upp en vara. Filen delas inte över
en nätverksdelning: databasens låsning är inte pålitlig över nätet, och
två kassor som skriver samtidigt kan skada den.
På huvudkassan ska inställningarna lyssna på nätet, så att de andra
kassorna når dem. I Windows-paketet: ändra "127.0.0.1:8092" till
"0.0.0.0:8092" under web_setup i C:\ProgramData\R-GO\services.json
och starta om tjänsten; öppna port 8092 i brandväggen för de andra
kassorna. Huvudkassan själv fortsätter läsa sin fil direkt.
Från andra maskiner går det bara att läsa varor. Inställningssidan, prisändringar och allt annat svarar “Inställningarna kan bara ändras på den här datorn” - det finns ingen inloggning, och priser ska inte kunna ändras från vilken dator som helst i butiksnätet. Varor läggs alltså upp och ändras vid huvudkassan.
På de andra kassorna pekas varuregistret dit, i
config/logic_settings.json:
"product_lookup": { "endpoint": "http://<huvudkassan>:8092" }
och kassan startas om. En skannad vara slås nu upp hos huvudkassan. Svarar huvudkassan inte säger kassan det (“varuregistret på … svarar inte”) - då går det inte att sälja på streckkod, men varugruppsknapparna fungerar som vanligt.
Tillgodo i flera kassor
Ett tillgodokvitto ska kunna lösas in i vilken kassa som helst i butiken,
men bara en gång. Därför finns ett enda register, hos huvudkassan, i
samma fil som huvudkassan själv använder (values.db). De andra kassorna
utfärdar, kontrollerar och löser in tillgodo hos huvudkassans
inställningar, på samma sätt som de slår upp varor.
En tillgodo är pengar, så här räcker det inte att bara kunna nå
huvudkassan. De andra kassorna måste visa kassanyckeln, en lång
slumpad kod som inställningarna skapar första gången de startar, i
huvudkassans config/kassanyckel.txt. Utan rätt nyckel svarar
huvudkassan som för allt annat: “Inställningarna kan bara ändras på den
här datorn”. Behandla nyckeln som ett lösenord: den ska inte skickas med
e-post eller ligga i en delad mapp, och den följer aldrig med i ett
installationspaket.
Signeringsnyckeln, den som QR-koderna och kontrollsiffrorna bygger på, lämnar aldrig huvudkassan. När en annan kassa skriver ut ett tillgodo får den koderna från huvudkassan, och när den läser ett tillgodo är det huvudkassan som kontrollerar det.
På huvudkassan behövs inget mer än för varuregistret: inställningarna
ska lyssna på nätet. Kassanyckeln finns i config/kassanyckel.txt så
fort inställningarna har startat en gång.
På de andra kassorna pekas registret dit, med nyckeln, i
config/logic_settings.json:
"value_documents": {
"endpoint": "http://<huvudkassan>:8092",
"key": "<innehållet i kassanyckel.txt>"
}
och kassan startas om. Saknas nyckeln vägrar kassan starta och säger varför. Svarar huvudkassan inte när ett tillgodo ska lösas in eller utfärdas visar kassan det (“tillgodoregistret på … svarar inte”), och inget registreras: kunden får betala på annat sätt, eller vänta tills huvudkassan svarar.
Byts nyckeln - radera kassanyckel.txt och starta om inställningarna på
huvudkassan, så skapas en ny - måste den nya föras in på alla andra
kassor.