Verze s Kivy (dole popis principu)

pod s buttonem pod zpet, nevim co s tim
- pokud nechces uzaverku blokovat spustenym terminálem, oprav to zde
	server_sqlite.py
	    	@app.post("/closure/save/",response_model=server_clsrep.ClosureReportOut)
		def save_closure_report(
- odstran chybu co popsal Milan v mailu (pro zuseni uzaverky kdyz vyberes stejny ucet k uzaverce to spadne)
- dodělej logiku ke slevam (absolutni, procentuelni, na položku a atributy nodiscountv ceniku)
- do uctu/UcPol dodělat cena_puv, vyndat mena (markuje se jen zakladni mene). Nebo prepocet dle kurzu? Zatim to tam nechat. 
- sleva na položku (cena, cena puv)
- zaokrouhlovani uctu, vracet sumu zaokrouhleni
   (do ceniku pridat slovnik atributu, atribut a hodnota, zde max sleva napr. 0)
- dopln na stale podrzeni butonu pro markovani do menu sleva na polozku
- dodělat bar rezim s automatickym odhlasenim po nastavene dobe
- otestuj spec. touche při markovani a editaci uctu
- jsou-li vyplneny ceny2 a cena3, pouzij ji pro 1/2 a 1/3 porce
- chody vyreseny (ještě do tisku)
- povinne zprávy při markovani kodem
- v posdialog se pouziva _popup_info z controlleru a jsou tam ještě definovany nejaky spec. sjednot to
- menu uzaverky (uzaverka s doplnenim id_ucty), meziuzaverka, tisk kopie uzaverky, mazani poslední uzaverky, posun uzaverky?
- presun messages ze setupu do ceniku 
- při vyberu cenove hladiny (pokud jsou oznacene nejake položky uctu), zmen všechny oznacene na vybranou
- rozmysli tiskarny bonu (muzou byt v setupu sklad -> bon printer)
- do posdialog a numpad udelej cteni RS232 a klavesnice pro vstup externich ctecek
- otestuj prihlaseni stejne id_kas se stejnym client_id
- tisky bonu do kuchyne (musíš pridat tiskárnu do ceniku, vazbu sklad printer do setupu)
- zjistit při pokusu zablokovat ucet ke stornu když probiha jeho storno na jinem terminalu
- do config.json pridat parametry pro velikost accountselect a posdialog (zejména počet buttonu v matici)
- upravit format uctu a bonu na terminalu
- zobrazeni konfiguracnich parametru při neuspesnem startu
- menu v accountselet (storno s vraceni na ucet, storno polozek z uctu)

Hotovo:
===== 063_8_KivyRq/059_8_KivyAPI ====================================================================================================
- pokud udelas zpet z menu privátních zprav dlouhe, namarkuje se ti polozka 
- vyber vse -> změna cenove hladiny -> uloz = položky zmizi z uctu (opraveno v Posdialog by Petr 21.4.)
- pokud při submenu na buttonu položky v leve casti objednávky (dlouhy stisk) (opraveno v PosDialog by Petr 22.4.) 
===== 061,2_8_KivyRq/059_8_KivyAPI ====================================================================================================
- nektere obecne konstanty pro beh frontendu presunty do modulu konstanty
- pri neuspesnem startu umozni zadat IP API serveru
===== 060_8_KivyRq/059_8_KivyAPI ====================================================================================================
- pokud edituji definci stolu, nejde ulozit
===== 059_8_Kivy ====================================================================================================================
- dodělej endpoint pro nahrani uzivatelu a permision (Milan_users.py)
===== 058_8_Kivy ====================================================================================================================
- opravena chyba pri vyberu defaultni hladiny (front end havaroval pri pokusu nastavit hladinu na prazdne misto ci link na jinou stranku)
- opraveno menu pro vyber hladin, pridam scroll (u polozky i defaultni) pro zobrazeni neomezeneho poctu hladin
- editor mapy stolu nyni umistuje stul vlevo nahore
- doplneno menu editoru stolu (nova mistnost, smaz mistnost, do menu stolu doplnen delete stolu)
- menu mistnosti jak v editoru tak pri vyberu mistnosti je nyni scrollovaci (nemomezeny pocet mistnosti)
- defautni id stolu je nyni tvoreno kombinaci jmena mistnosti a cisla stolu (zabranuje to nechtenemu sdileni uctu v ruznych mistnostech)
- automaticke zarovnavani stolu do mrizky
===== 057_8_Kivy ====================================================================================================================
- vzorovy program pro nahrani mapy stolu z foodu Milan_mapastolu
- mapa stolu a jednoduchy editor, ktery ji ulozi na server primo v pokladne
- endpoint na mapu stolu
===== 056_8_Kivy ====================================================================================================================
- do info v menu uzaverky doplneny info o verzi serveru, frontendu a jmenu aktualni database pouzivane serverem
- endpoint na ucty co nejsou v uzaverce (test/vzor milan_ucty_notinclsrep)
- hotovo cena_puv
- v uctech je cislo skladu pro odtezovani
- dodělej endpoint pro nahrani mapy stolu (test/vzor milan_mapastolu)
- do info zobraz verzi front endu i serveru (server to muze vrátit při prihlaseni)
===== 055_8_Kivy ====================================================================================================================
- normalni platba, pokud je něco vybrano take zaplati jen vybrane (ale korektne, zbytek uctu tam zustane). Pak nemá smysl platba vybraneho?? nema
- vyndej ze server_sqlite heartbeat, at to muzes distribuovat oddelene
===== 054_8_Kivy ====================================================================================================================
- do serveru doplneny 2 endpointy pro nacteni uzaverky z FOODu. Vzor pouziti Milan_nacti_uzaverky
- mas-li oznacene nejake položky na uctu a udelas platbu vseho hotove, zaplati se vybrane a zbytek uctu zmizi 
- lze definovat buttony pro ruzne sirky
- opravena migrace v DB pro pridani sirky button matice
- exituji 2 typy zprav. obecne (jdou pripojit ke kazde polozce) a privatni (jdou jen k te polozce, co je ma uvedene v ceniku). Privatni se mohou delit na povinne a ostatni. Obecne se aktivuji dlouhym stiskem na nazev v namarkovane polozce uctu (jsou tam i vsechy zpravy mazat s vyjimkou povinnych), povinne se musi automaticky zadat pri markovani. Pokud je aktivovano Fastitemmenu (dlouhy stisk na button v matici vlevo) a polozka obsahuje povinnou zpravu, nejprve se Zada povinna zprava a az potom se objevi FastItemMenu. 
- povinne zprávy při markovani jsou vyreseny ale nemely by jit smazat a co s dlouhym stiskem?- implementuj do markovani nove data od Milana (Eany, povinne zprávy, permision pro markovani, atributy) 
- uprav FastMenuItem pro smyslupne markovani (vic voleb), mazani zvoleného zvyrazneno
- vic zprav k jedne polozce, zprávy jdou i mazat (po jedne i všechny)
- na serveru je automaticka migrace jsonu v ceniku s propisem do DB (nemigracni verze je 048_8_kivy, kdyby to moc zdrzovalo). nove pole musi mit default hodnotu, aby Pydantic nezarval pred uskutecnenim migrace
- při prepnuti cenove hladiny nejsou na matici pro markovani aktualni ceny
- doplneny dluhy stisk na levou matici
- zmen markovani kodem dle atributu kod (nyní je to id_card)
- uprav cenik pro import z Food (jen rozsirit pro kod misto id_card, eany, spec zprávy prirazene k polozce (povinne/nepovinne) a atributy 
- uprav dle vzoru z data.py rutiny pro zapis setupu (v setupu obecne zprávy)
- uprav dle vzoru z data.py rutiny pro zapis ceniku vcetne vzoru pro Milana
- při pocitani uzaverky musíš byt jediny zivy terminal (takze zadny ucet neni blokovan), nevim jestli je to nutne
- v ceniku je pos_pc resp. pos_mb misto prostého tuple list[tuple], coz umozni jednu položku umistit na libovolny počet stranek pomoci jednoho zaznamu v ceniku
- je-li vybran nejaky počet kusu (nejvic leve pole v položkách uctu), musíš při skrtani zprava do leva kontrolovat, aby vybrany počet kusu nebyl vetsi nez namarkovany
- zkontroluj, tisknou-li se bony do kuchyne nejen při operaci uloz, ale i při split, platba, castecna platba. Proste vždy když se objevi neodeslana položka na ucte. Když namarkujes nejake položky a soucasne nejake vyberes ke stornu a udelas storno polozek tak se opravdu vytisknou bony na neodeslane a storna na jiz předtím odeslane.
- na dlouhy stisk nove namarkovane polozky se pride message ze setupu 
- uzaverkoveho reportu pridej seznam otevrenych uctu se sumou
- při uzaverce, když je pusteny jiny terminal, vznikne neosetreny runtimeerror
- cenova hladina jde menit i na odeslanych polozkach
- pri prepnuti defaultni hladiny se prepisi ceny na buttonech
- uzaverka zjevne pocita poslední ucet z minule uzaverky jako první nasledujici (prekryvaji se).
- serad uzavrene ucty v menu accountselect dle cisla uctu
- nabizej jen cisla uctu po poslední uzaverce 
- ma generovani noveho cisla na serveru ochranu proti preteceni? Ma. Vyreseno.
- dodelana ochrana proti prihlaseni stejne id_ka se stejnym clientem, po logoutu se odstarni heartbeats
- uzaverka musí mit číslo uzaverky pro konkretni id_kas
- vylepsit popisky buttonu uctu jak v accountselect tak v closed_accountselect
- proved kontrolu odblokovani uctu po stornech (v closed_accountdialogu se to neobjevi, je to další atribut)
- funguje storno vcetne ochrany druhého stornovani a stornovani storna, funguje barevne rozliseni storen a stornovanych uctu
- hotova operace tisk kopie uctu, na serveru a v api_call je operace unblock dle ucisla
- operace v menu accountselect ted konci v controlleru v handle_closed_accountselect, zbyva dodělat jen z nej volane funkce
- spolecna rodicovska trida pro accountselect a closed_accountselect, na server pridano do jsonu uctu total_base_currency (pri sumdph spocte total v zakladni mene)
- hotove zobrazeni zaplacenych uctu k operacim v menu z accountselect
- pridan info pasek na TOP Posdialogu
- změna v refreshi accountselect, ted bezi porad dokud je activni i pod jinými okny
- do menu konfiguracni parametry (config.json) a take tisk vlastní IP adresy
- format uctu snesitelny
- doplneny všechny informace do uzavrenych uctu
- tisk uctu z Windows a RPI Debian na TCP printer funguje
- konfiguracni parametry (Android, Debian, Windows) -> vyzkouseno Windows, RPI Debian
- zablokovany ucet ma jinou barvu
- hotovy preview uctu



pouziva virtualni prostředí v_kivy nebo v311 na kivy UI (nutne zejmena na RPI debianu)
spousteni primo pod pythonem
v_kivy/Scripts/python.exe
idealni Python je v 3.11

pouzite externi moduly:
pydantic, pillow, qrcode, requests, fastapi, uvicorn, kivy


Zakladni princip.
Klient komunikuje s API serverem pomoci API callu. Všechny API calls jsou ulozeny v api_call.py
Je tam i mechanizmus pridelovani tokenu, autentifikace a identifikace privatnich tabulek zakazky. 
System rozeznava dva typy prihlaseni. 1. k zakazce, jmenem a heslem. Při uspesnem prihlaseni
dostane klient od servera token a refresh token, který jiz obsahuje i identifinaci zakazky a tim
i pristup k privatnim tabulkam zakazky. Klient provádí heartbeet (na jinem socketu), server ho zapisuje do centralni 
tabulky heartbeetu s aktuálním casem. Pokud server narazi na lock uctu, zkontroluje heartbeet (id_kas a 
terminalu) kasy, pokud je expirovan, nebere ho v úvahu.
Aplikace pouziva stale stejne 2 sockety, dokud nevypadnou na timeout nebo je server nezahodi. Prvni je
pro heartbeet, druhy pro chod frontendu (i ten provadi periodicke dotazy na otevrene ucty, pokud pokladna 
neni odhlasena (cisnik)
Dale se po startu prihlasuje cisnik (operator), jen PINem. Cisnik/user pak dostane seznam tzv. permitu, ktere
jsou pouzity pro autentifikaci operaci s omezenym pristupem. Funguje klasicke denni heslo Alta.
Nektere operace serveru defaultne lockuji ucty (v parametrech lze potlacit)
V budoucnu se na serveru da do extra modulu vse co souvisi s pristupem k DB (nyní SQLite), takze 
budou v modulech striktne oddeleny endpointy (routy) od DB operaci.
Klient je rozdelen na spousteci modul, který obsahuje tridu controller. Zde je veskera obchodni 
logika, ktera pracuje s daty ve forme, ve ktere jsou ulozeny na serveru. Server i klient pouzivaji stejny modul
data, kde jsou zakladni datove modely (cenik, ucet, setup...)
Z controlleru se vola modul accountselect (zde se zobrazuji otevrene ucty a zakladni menu pokladny, ve vrchni
casti je bud widget s otevrenymi stoly nebo mapa stolu zobrazene mistnosti.
Jeden stul muze byt zobrazen v nekolika mistnostech a mapa muze byt spolecna pro vice pokladen
Zatim neuzvazuji o sdileni stolu jednotlivymi pokladnami
Při vybrani uctu se z modulu posdialog instancuje trida posdialog. Ta pracuje s upravenymi definicemi
uctu, které jsou rozsireny o vlastnosti umožňující editaci (nektere jiné vlatnosti zase chybi)
Po ukonceni posdialogu se do controlleru vraci u_main, u_sec, a operace. Typicky u_main obsahuje 
zbytek původního uctu po operaci, u_sec položky vybrane k operaci.
Po provedeni operace controller pomoci api calls ulozi novy stav na server.
Nektere operace (platba, prevody mezi ucty...), volaji další okna (widgety), jako například payment.
V soucasne chvili klient nepouziva k persistenci nic jiného, nez serverove API calls. Tzn., pokud se něco stane,
po restartu klienta dostaneme stav pred začátkem rozpracovane operace. 
V budoucnu predpokladam po x vteřinách update rozpracovane operace na server. To ale trochu koliduje 
s pravidlem, ze jediny kdo operuje s daty na serveru je controller. Nicmene Posdialog není modalni, nebude 
to takovy problem screen managerem pustit update stavu. V podstate jde je o rozmarkovany ucet, mozna vyber 
v posdialogu.
Krome accountselect dialogu pro vybrani otevreneho uctu existuje jeste closed_accountselect dialog, ktery
slouzi k vyberu uzavrenych uctu (kopie, storna apod.) Oba tyto dialogy maji stejneho rodice.
V soucasne chvili je vyzkousena portace na Windows, Linux (jak 86 tak ARM procesory) a MacOS. System vcetne servera dobře funguje na
Rabsberry, napr. P400. Samozrejme je vyzkousen i provoz přes HotSpot a VPN. Server na Hluce, klient v Motole.
Pro Android je s Kivy k dispozici dozer, jeste jsem nezkousel.
Ve chvili, kdy zacnes editovat ucet ktery neexistuje se serveru vytvori dummy a zablokuje se. Tim se predchazi aby nedoslo k soucasne
editaci stejneho noveho uctu.



ToDo:
- vyhazej ze serveru endpointy pro users, které nejsou potřeba
- rozdelit server na endpointy a DB operace
- implementuj pojmenovane stuly
- automaticky test
	-vice pokladen, vice terminalu
	-blokace, release
	-relogin, refresh token 
	-start s novou databazi
- zkus jinou databazi (postgres nebo DuckDB)
- parametricky prohozeni ucty a matici v PosDialog z prave strany doleva nebo nahore a dole (vzajemne se prekryvajici)
