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.
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.
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ě.
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í.
(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
(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.
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é.)
V řešení prosím uveďte, o kterou verzi se jedná.
Své řešení prosím zašlete e-mailem na adresu d@dcepelik.cz.
__name__ == "__main__"