# Programování v Pythonu - zkouška 11. 6.

<{ForumPost(poster="cyberMouse", timestamp=2019-06-11 18:53:53)}>
** Zkouška z Pythonu 11.6.2019**  
  
Napište jednoduchý program pro správu financí malé kavárny. Kavárna si udržuje soubor s údaji o zákaznících a stavu konta každého z nich. Zákazníci mohou na své konto převést peníze výhradně bankovním převodem.  
  
Požadovaný program dostane na vstupu jako jediné dva poziční argumenty cestu k souboru se zákazníky a cestu k souboru s platbami:  
  
Usage: ./balance.py CUSTOMERS PAYMENTS  
CUSTOMERS is the customer database.  
PAYMENTS is bank account transaction log file.  
  
Program projde soubor s platbami a každou platbu se pokusí přiřadit k zákazníkovi (pomocí variabilního symbolu), přičemž aktualizuje saldo (balance) jeho účtu. Program vypíše na standardní výstup aktualizovanou databázi zákazníků ve stejném formátu, v jakém je vstupní soubor CUSTOMERS.  
  
Jestliže se kteroukoli platbu nepodaří spárovat se zákazníkem, vypíše program na standardní chybový výstup chybovou hlášku. Přesné znění je na Vás, avšak mělo by být s její pomocí možné identifikovat transakci, kterou nebylo možné automaticky zpracovat.  
  
  
**Formát souboru CUSTOMERS**  
  
Soubor ve formátu JSON. Top-level objekt je pole, které obsahuje slovníky popisující zákazníky. Známe jméno, příjmení a ID (variabilní symbol) každého zákazníka. Program dále pro každého zákazníka udržuje saldo (balance) v Kč (CZK) a datum a čas poslední platby uložený jako UNIXový time-stamp.  
  
Údaj last_payment je time-stamp poslední platby, která byla pro zákazníka zpracována. Při zpracování souboru s transakcemi ignorujte platby, které jsou vůči last_payment v minulosti, abyste je nezaúčtovali dvakrát. (Můžete předpokládat, že v souboru PAYMENTS jsou transakce uspořádány vzestupně dle sloupce timestamp.)  
  
Nezapomeňte hodnotu last_payment aktualizovat po zaúčtování platby.  
  
Korektní vstup obsahuje pro každého zákazníka všechny údaje s výjimkou last_payment, který nemusí být nastaven, nebo může být null.  
  
**Příklad takového souboru:**  

    [{"name": "Bob","surname": "Fulkerson","id": 201,"balance_czk": 0,"last_payment": 156010000},{"name": "Freddie","surname": "Gonzales","id": 666,"balance_czk": 200,"last_payment": 156010010},{"name": "Ahmad","surname": "Stevenson","id": 100,"balance_czk": 5200,"last_payment": 156030000},{"name": "Karel","surname": "Kvákal","id": 202,"balance_czk": -1600,"last_payment": null}
    ]

Pro parsování tohoto souboru použijte modul json. Nepokoušejte se psát vlastní parser.  
Formát souboru PAYMENTS  
  
**Jednoduché CSV s hlavičkou.**  

    vs,payment_id,timestamp,account_no,bank,amount,currency,note
    201,100,156020000,302-23020221,0100,300.44,CZK,Bob Fulkerson
    666,107,156020020,20842942,0100,2000000,GBP,FREDDIE GONZALES
    100,194,156020040,107-4392103928,0100,30000,EUR,AHMAD STEVENSON
    202,202,156020060,000288472,3100,15,USD,KVAKAL
    123,298,156020080,107-4248262858,3300,300.44,BTC,

Tento soubor lze zpracovat pár řádky Pythonu, není třeba hledat vhodnou funkci ve standardní knihovně.  
  
**Požadavky pro známku "dobře"**  
  
Můžete předpokládat, že všechny transakce jsou v měně CZK. Můžete ignorovat záhlaví souboru PAYMENTS a předpokládat, že sloupce jsou vždy ve výše uvedeném pořadí.  
  
    Program korektně aktualizuje databázi zákazníků údaji o platbách  
    Program identifikuje všechny transakce, které se nepodařilo zpracovat  
    Jsou korektně ošetřeny všechny chybové stavy, zejména:  
        Program neobdrží požadované argumenty (vypište usage)  
        Některý soubor nelze otevřít nebo přečíst  
        Některý soubor není v požadovaném formátu  
    Program je rozumně (ručně) otestovaný a nepadá na triviálních vstupech  
    Program je na vhodných místech komentovaný a přiměřeně čitelný  
  
**Požadavky pro známku "velmi dobře"**  
  
(Je nutné splnit požadavky pro známku "dobře".)  
  
Mnoho programů spoléhá na pevné pořadí sloupců v CSV souborech, přestože soubory mají hlavičku, která jejich pořadí jednoznačně určuje. Pro splnění rozšířeného zadání je požadováno, abyste byli schopni zpracovat soubor PAYMENTS s libovolným pořadím sloupců, tj. s kteroukoli hlavičkou.  
  
Můžete předpokládat, že soubor obsahuje všechny sloupce. Může ale také obsahovat nějaké navíc.  
  
Příklad hlavičky souboru PAYMENTS, který dokážete zpracovat:  
  
account_no,foo,amount,currency,note2,note,payment_id,timestamp,bank,bar  
  
**Požadavky pro známku "výborně"**  
  
(Je nutné splnit požadavky pro známku "velmi dobře".)  
  
Nepředpokládejte, že všechny měny jsou v CZK. Jestliže zákazník provede bankovní převod v jiné měně, než je měna jeho účtu, použijte kurzovní lístek pro převod na Koruny (CZK).  
  
Program přijímá třetí poziční argument EXCHANGE, což je cesta k souboru s kurzovním lístkem.  
  
Usage: ./balance.py CUSTOMERS PAYMENTS EXCHANGE  
CUSTOMERS is the customer database.  
PAYMENTS is bank account transaction log file.  
EXCHANGE is exchange rate sheet.  
  
Narazíte-li na platbu, která není v CZK, proveďte přepočet do CZK pomocí kurzovního lístku (zjevným způsobem). Jestliže pro danou měnu není kurz k dispozici, platbu nelze automaticky zpracovat.  
  
**Formát souboru EXCHANGE**  
  
Soubor je řádkově orientovaný. Každý řádek je tvaru currency_symbol = rate CZK. Příklad:  

    EUR = 25 CZK
    USD = 22.65 CZK
    GBP = 28.74 CZK

(Můžete předpokládat, že mezi sousedními tokeny je vždy bílé místo, takže řádek EUR= 25 CZK ani řádek USD = 25CZK nejsou platné.)  
Odevzdání  
  
V řešení prosím uveďte, o kterou verzi se jedná.  
  
Své řešení prosím zašlete e-mailem na adresu \[...]  
  
**Rady**  
  
    Postupujte od základního zadání ke složitějším  
    Pište přímočaře a nesnažte se o objektové konstrukce  
    Pro parsování JSONu použijte standardní knihovnu  
    Ošetřete chyby  
    Program alespoň ručně otestujte předtím, než ho odevzdáte  
    Nezapomeňte na hashbang a __name__ == "__main__"
<{/ForumPost}>

