Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.json mot 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.