()),
+ );
+ });
+}
diff --git a/billsplit/test/fixtures/sample_receipt.json b/billsplit/test/fixtures/sample_receipt.json
new file mode 100644
index 00000000..21a99112
--- /dev/null
+++ b/billsplit/test/fixtures/sample_receipt.json
@@ -0,0 +1,779 @@
+{
+ "protoVersion": "000",
+ "IDZ": "c=068b8822a7d1459697c518bacdc26abf|g={b6b16726-f935-4e67-b756-bca881c12124}|s=5834|p=1|t=4320",
+ "deviceType": 2,
+ "printed": false,
+ "data": "eyJhbGciOiJSUzI1NiIsIng1YyI6WyJNSUlGUVRDQ0F5bWdBd0lCQWdJRERxR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR2JNUXN3Q1FZRFZRUUdFd0pRVERFVU1CSUdBMVVFQ0F3TFRXRjZiM2RwWldOcmFXVXhFVEFQQmdOVkJBY01DRmRoY25ONllYZGhNU1F3SWdZRFZRUUxEQnREWlc1MGNuVnRJRU5sY25SNVptbHJZV05xYVNCbExVdGhjM2t4R3pBWkJnTlZCQW9NRWxCdmMyNWxkQ0JRYjJ4emEyRWdVeTVCTGpFZ01CNEdBMVVFQXd3WFVFOVRUa1ZVSUdVdFMyRnplU0JTYjI5MElFTkJJREV3SWhnUE1qQXlNekV4TWprd05qRXlNakZhR0E4eU1ETXpNVEV5T0RBMk1USXlNVm93T3pFTE1Ba0dBMVVFQmhNQ1VFd3hGakFVQmdOVkJBTVREVVZCV2pJeU1ESXhOakF4T1RZeEZEQVNCZ05WQkFvVEMxQnZjMjVsZENCVExrRXVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXQrSUxlZlJWNjhqcFdDa2RveitZZWprRnU1dkh3N01vYjgxSFIyQnhqUVp6eENhN2drMjExTEs5T1J6Y2ZIcW1YeU5aV3c3U0tpcUp1U0ZhM1Z5R29CaDFFMmF6VWxvcU5Db3g0TFNaM0FwQ3U1d0NIOVFaaS94YW5nQ2pReUtybG44bFFZaWtkNENTYTJyYlQycWVUZytRckJEdHBreVpmc3hQTWF6aFFuek9MNTRWMlZqQ2ZWUzFTajRNQ3lHeHVwQnl5RFY3UzlaKzRPOEdqZ0JYL3RSa1pxRW1SQmpELy83N2o4cjJWTkIyTHlPUXM3alN6RE1zbFo0VUFFN1lzMm1WNHhnZmtLYlh5TUhQK013VjFoZGpMMDJzR3E4ckFUK25aWXFtdURQNGJZKzJiWG5LNzZWQk1uT0pLVEQ0M0NQamhEVXErYjJsd2k4RUZmSlNxUUlEQVFBQm80SG9NSUhsTUF3R0ExVWRFd0VCL3dRQ01BQXdIUVlEVlIwT0JCWUVGQkRiZUErelZVTCtQYnBXam5sVFNlcmlrN0FkTUI4R0ExVWRJd1FZTUJhQUZFNElhYlJWR0FHTFJkSGlwZVNaeldHQmo0MUpNQTRHQTFVZER3RUIvd1FFQXdJRjREQTFCZ05WSFI4RUxqQXNNQ3FnS0tBbWhpUm9kSFJ3T2k4dlpXc3VjRzl6Ym1WMExtTnZiUzV3YkM5amNtd3ZjbU5oTVM1amNtd3dUZ1lEVlIwZ0JFY3dSVEJEQmdzckJnRUVBWU9mYmdFQkFUQTBNRElHQ0NzR0FRVUZCd0lCRmlab2RIUndjem92TDJWckxuQnZjMjVsZEM1amIyMHVjR3d2WTNCekwzSmpZVEV1YUhSdGJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFrUk5nNEhuMXUrM2tzeEZ2SmFTMHplYnBqQ3pVb2hyYldTZ3dHaGZWTUk1ZnJaZG5Id0V0SytPL1FuT2FIZXdzblZ0am5Samx0NWIrWHA3bFZNVFdMYnpYNjRVTUZQZkhzVER1OER6Zml6NVZjRUJ0MkNnSTlacFVSNHgyR0VJTDlSQmJzTzRqanFZajh1YnA3OWdsckgxMjF6Y3BhNmhSYkpZOHFReHNSTnkxZkNTL3ppazlQTTFla214eWc5b3pxOUJ4WmxKMnREZW12Y0pxbUhMaWNTUCsxWkRZWGR2SnJiNVJHMmFWL2JLeFJmTm15NGZxUVRNSFlucC94K2FBRlByTFdjV3lDbUMya1FodnNFYVJ1cWZDdlJ0TEtsT0t0UC9zdzRxQzlXbVdzbG8zeXl4YW9WRkRsYk5NZ3lWWWpicmtWZ0U1SXBPRWJpUG1GZTY4cUNKMk5KL0tsNFNWUGJiN2RSWXJyeHdYYVAzN2VUSXJKQ3NwbUMrWC9oNzQ3ak5mYTQxeXd3OCsrb1BMblNpby9PcFpNT0IzZmtBaWdjODlnNEtRalJLNDFsOGRJQnYvRmpMZm9XM3JidW5YQTM4R0VKT1ZhY1ZYM3ZQcUNoWExVYTN3dHBQTWRWbm9NbkFRMUJCOEU4RUs1YUtrK0tyQ1NzVnVPdmE0dTlsbURPdXFaMGt1Snd1M2RhM0c2TUpzSm90cloyTWNpMTV0S215UkU1VVViYlhBcXN6a2hXZTZ2bUdMa0ZTemliemZ2TXZmQ0xoMkxvQTBDakNCMGJLVHFydUdsSUpGZ0NhNFpKTDRnTHBiV2d0K2lMZDg3UEZwdGtBMUVHSldHSXNSVFBzVnhLNFQvWE5MME5td3hzTHdPTHhXZ2JxK1hjNDlZNUhYb0MzNDRSND0iXSwianBrbWV0YWRhdGEiOiJleUpqYjNKeVpXeGhkR2x2Ymtsa0lqb2lWRVpFTGtWQldqSXlNREl4TmpBeE9UWXVNakF5TkMwd05pMHdOVlF3T0RveE1Eb3dNQzQyTkRGYUluMCIsImVQYXJhZ29uLm1mLmdvdi5wbCI6ImV5SjNaWEp6YW1FaU9pSktVRXRmUzBGVFFWOVFRVkpCUjA5T1gzWXlMVEFpTENKS1VFdEpSQ0k2SWpBd01UQXdNREF3TURBd01EWXhNREl4TXlJc0ltUmhkR0ZLVUVzaU9pSXlNREkyTFRBM0xUTXdWREUzT2pJeE9qRTVMakF3TUZvaUxDSktVRXRTUlVZaU9uc2lTbEJMU1VRaU9pSXdNREV3TURBd01EQXdNREEyTVRBeU1URWlMQ0pUU0VFeU5UWWlPaUl6TXpVNVFrRkVRa0kzTURSRE5UZzBNVVk1T1RBd01ERkdOREE1T1VGRVJUSkZSVVF6TUVFME4wRkZSa1JDT1RNd05rVTFRVUZEUlRoRk0wVTJOak00SW4xOSJ9.eyJkb2t1bWVudCI6eyJuYWdsb3dlayI6eyJ3ZXJzamEiOiJKUEtfS0FTQV9QQVJBR09OX3YyLTAiLCJkYXRhSlBLIjoiMjAyNi0wNy0zMFQxNzoyMToxOS4wMDBaIn0sInBvZG1pb3QxIjp7Ik5JUCI6Ijc3OTEwMTEzMjciLCJuYXp3YVBvZCI6IkpFUk9OSU1PIE1BUlRJTlMgUE9MU0tBIFMuQS4iLCJhZHJlc1BvZCI6eyJrb2RQb2N6dCI6IjM0LTMyNSIsIm1pZWpzYyI6IsWBT0RZR09XSUNFIiwidWxpY2EiOiJCRVNLSURaS0EgOCJ9LCJuclVuaWsiOiJFQVoyMjAyMTYwMTk2IiwibnJGYWJyIjoiUE8xMTQwNTQzOTEiLCJuckV3aWQiOiIyMDI0LzAwMDA5MjEyNiJ9LCJwYXJhZ29uIjp7IkpQS0lEIjo2MTAyMTMsInBhbWllY0NociI6MSwibnJEb2siOjYwODgyNywicG96eWNqYSI6W3sidG93YXIiOnsiYnJ1dHRvIjo1NDksImNlbmEiOjU0OSwiaWRTdFBUVSI6IkEiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IlRvbmljICAgICAgICAgICAgICAgICAgICBBIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NTQ5LCJjZW5hIjo1NDksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJDaXRydXMgbWl4ICAgICAgICAgICAgICAgQSIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjE3OTgsImNlbmEiOjg5OSwiaWRTdFBUVSI6IkEiLCJpbG9zYyI6IjIiLCJuYXp3YSI6Ik5hcEdhekNvY2FDb01JWDIsNWwgICAgICBBIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTc5OCwiY2VuYSI6ODk5LCJpZFN0UFRVIjoiQSIsImlsb3NjIjoiMiIsIm5hendhIjoiTmFwR2F6Q29jYUNvTUlYMiw1bCAgICAgIEEiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjo0NDksImNlbmEiOjQ0OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6Ik9zaGVlVml0YW1NYWduZXoxLDFsICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NzE0LCJjZW5hIjoxMTksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiI2IiwibmF6d2EiOiJQb2xhcmlzIE5HYXogIDEsNWwgICAgICAgQSIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjE1OTYsImNlbmEiOjM5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjQiLCJuYXp3YSI6IlRvc3QgTWHFm2xhbnkgNTAwZyAgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjc5OTgsImNlbmEiOjUzOTksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiIyIiwibmF6d2EiOiJXw7Nka2FCIEJvY2lhbiAwLDdsICAgICAgIEEiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMjgwMH19fSx7InRvd2FyIjp7ImJydXR0byI6OTk5LCJjZW5hIjo5OTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJPbGVqUnplcFpPbGl3V3liMWwgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjY0OSwiY2VuYSI6NjQ5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiR3Jhbm9sYU1sZWN6Q3plazM1MGcgICAgIEMiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjozOTksImNlbmEiOjM5OSwiaWRTdFBUVSI6IkEiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IlBvZHBhxYJOYXR1cjY0S29zdGtpICAgICAgQSIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjk5OSwiY2VuYSI6OTk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiR3Jhbm9sYUZpdE5lc09hdDMwMGcgICAgIEMiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjo5OTksImNlbmEiOjk5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IkdyYW5vbGFGaXROZXNRdWkzMDBnICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6Nzk4LCJjZW5hIjozOTksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiIyIiwibmF6d2EiOiJETyBNT0pFSiBJRMSYICAgICAgICAgICAgIEEiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjoyMTY5LCJjZW5hIjozMjkwLCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMCw4NzEiLCJuYXp3YSI6IktpZcWCYkJyb2NrYVNva2_FgmtnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotNjk3fX19LHsidG93YXIiOnsiYnJ1dHRvIjoyMDcyLCJjZW5hIjozMjkwLCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMCw4MzIiLCJuYXp3YSI6IktpZcWCYkJyb2NrYVNva2_FgmtnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotNjY1fX19LHsidG93YXIiOnsiYnJ1dHRvIjozNzQ1LCJjZW5hIjo3NDksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiI1IiwibmF6d2EiOiJHdWFuY2lhbGVDdWJHQjE1MGcgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjExMzcsImNlbmEiOjM3OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjMiLCJuYXp3YSI6IkJhZ2lldGthIDE3NWcgICAgICAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NTk5LCJjZW5hIjo1OTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJNYXNsb0Vrc3RyYTIwMGcgICAgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjc0OSwiY2VuYSI6NzQ5LCJpZFN0UFRVIjoiQSIsImlsb3NjIjoiMSIsIm5hendhIjoiTmFwR2F6S2lubGV5TWl4MWwgICAgICAgIEEiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjo0OTksImNlbmEiOjQ5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IkNlYnVsYSAxa2cgb3BhayAgICAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NzM4LCJjZW5hIjozNjksImlkU3RQVFUiOiJCIiwiaWxvc2MiOiIyIiwibmF6d2EiOiJNdXN6U2FyS2FtMTg1ZyAgICAgICAgICAgQiIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjI5OSwiY2VuYSI6Mjk5LCJpZFN0UFRVIjoiQiIsImlsb3NjIjoiMSIsIm5hendhIjoiRElQIE9SSUVOVEFMTlkgQ1pPU04gICAgIEIiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjoyOTksImNlbmEiOjI5OSwiaWRTdFBUVSI6IkIiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IlByenlwRG9Tb0FtZXJLYW1pMjBnICAgICBCIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTI5OSwiY2VuYSI6MTI5OSwiaWRTdFBUVSI6IkIiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IktldFBpa2FudG55UHVkIDk5MCBnICAgICBCIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTA5OSwiY2VuYSI6MTA5OSwiaWRTdFBUVSI6IkIiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IlNvc0N6b3NNYWRYWEw4NjBnICAgICAgICBCIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTI5LCJjZW5hIjoxMjksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJaYXBhbG5pY3prU29sZWJvMXN6dCAgICAgQSIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjg0OSwiY2VuYSI6ODQ5LCJpZFN0UFRVIjoiQSIsImlsb3NjIjoiMSIsIm5hendhIjoiUsSZY3puaWsgUXVlZW4gMiA0ICAgICAgICBBIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6Mjc5OCwiY2VuYSI6MTM5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjIiLCJuYXp3YSI6IkphamEgVyBXeWIgTCAxMHN6dCAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTI5NywiY2VuYSI6MjE5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjAsOTI3IiwibmF6d2EiOiJNacSZc1pub2dpS3UgYiBrIGtnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotNzQxfX19LHsidG93YXIiOnsiYnJ1dHRvIjoyOTg5LCJjZW5hIjoyOTg5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiU2VyIEdvdWRhIMWad2lhdDFrZyAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NTQ5LCJjZW5hIjo1NDksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJNaXhTYcWCYXRSb3N6cG9WZjE1MGcgICAgIEMiLCJvcGVyIjpmYWxzZX19LHsidG93YXIiOnsiYnJ1dHRvIjozOTgsImNlbmEiOjE5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjIiLCJuYXp3YSI6IkxpbW9ua2Egc3p0ICAgICAgICAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6NTk5LCJjZW5hIjo1OTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJDeXRyeW5hIDUwMCBnICAgICAgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjEyOTksImNlbmEiOjEyOTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJQb21pZG9yUGFwcnljejUwMGcgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjU5OCwiY2VuYSI6Njk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMCw4NTYiLCJuYXp3YSI6IkJhbmFuIEx1eiAgICAgICAgICAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MzQwLCJjZW5hIjo4OTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIwLDM3OCIsIm5hendhIjoiT2fDs3Jla1N6a0x1eiAgICAgICAgICAgICBDIiwib3BlciI6ZmFsc2V9fSx7InRvd2FyIjp7ImJydXR0byI6MTQ5OCwiY2VuYSI6MTQ5OCwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IkJvcsOzd2thQW1lcnlrIDMwMGcgICAgICAgQyIsIm9wZXIiOmZhbHNlfX0seyJ0b3dhciI6eyJicnV0dG8iOjU1NiwiY2VuYSI6Nzk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiQ2hpcHN5Q3IxMzAtMTQwZyAgICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMjQzfX19LHsidG93YXIiOnsiYnJ1dHRvIjozNDUsImNlbmEiOjQ5NSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IkNoaXBzeVRvcEZyb21hZ2UxNTBnICAgICBDIiwib3BlciI6ZmFsc2UsInJhYmF0Ijp7Im9waXMiOiIxIiwid2FydCI6LTE1MH19fSx7InRvd2FyIjp7ImJydXR0byI6NjA1LCJjZW5hIjo4NjksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIxIiwibmF6d2EiOiJDaGlwc3lMYXkgczEyMGcgICAgICAgICAgQyIsIm9wZXIiOmZhbHNlLCJyYWJhdCI6eyJvcGlzIjoiMSIsIndhcnQiOi0yNjR9fX0seyJ0b3dhciI6eyJicnV0dG8iOjU1NywiY2VuYSI6Nzk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiQ2hpcHN5Q3J1bjEzMC0xNDBnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMjQyfX19LHsidG93YXIiOnsiYnJ1dHRvIjozNDcsImNlbmEiOjQ5OSwiaWRTdFBUVSI6IkMiLCJpbG9zYyI6IjEiLCJuYXp3YSI6IlByYcW8eW5raU5pZXRLZXQxMDBnICAgICAgQyIsIm9wZXIiOmZhbHNlLCJyYWJhdCI6eyJvcGlzIjoiMSIsIndhcnQiOi0xNTJ9fX0seyJ0b3dhciI6eyJicnV0dG8iOjU1NiwiY2VuYSI6Nzk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiQ2hpcHlDcnVuMTMwLTE0MGcgICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMjQzfX19LHsidG93YXIiOnsiYnJ1dHRvIjoxMzk5LCJjZW5hIjoxNjk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiUGl6emFLdXJQaWVjejYwMGcgICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMzAwfX19LHsidG93YXIiOnsiYnJ1dHRvIjoxMzk5LCJjZW5hIjoxNjk5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMSIsIm5hendhIjoiUGl6Um9kelN6eW5TZXI2MDBnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMzAwfX19LHsidG93YXIiOnsiYnJ1dHRvIjoxMzk4LCJjZW5hIjo2OTksImlkU3RQVFUiOiJDIiwiaWxvc2MiOiIzIiwibmF6d2EiOiJTenlua2FLb25zZXJ3b0tXMjAwICAgICAgQyIsIm9wZXIiOmZhbHNlLCJyYWJhdCI6eyJvcGlzIjoiMSIsIndhcnQiOi02OTl9fX0seyJ0b3dhciI6eyJicnV0dG8iOjY3OCwiY2VuYSI6MzM5LCJpZFN0UFRVIjoiQyIsImlsb3NjIjoiMyIsIm5hendhIjoiTWFrYXJvblBlbm5lUGE1MDBnICAgICAgIEMiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMzM5fX19LHsidG93YXIiOnsiYnJ1dHRvIjoyODc0LCJjZW5hIjo0NzksImlkU3RQVFUiOiJBIiwiaWxvc2MiOiIxMiIsIm5hendhIjoiUElXTyBIRUlORUtFTiAwLDVCICAgICAgIEEiLCJvcGVyIjpmYWxzZSwicmFiYXQiOnsib3BpcyI6IjEiLCJ3YXJ0IjotMjg3NH19fV0sInN0UFRVIjpbeyJpZCI6IkEiLCJ3YXJ0IjoyMzAwfSx7ImlkIjoiQiIsIndhcnQiOjgwMH0seyJpZCI6IkMiLCJ3YXJ0Ijo1MDB9LHsiaWQiOiJEIiwid2FydCI6MH0seyJpZCI6IkUiLCJ3YXJ0IjoiWlcifSx7ImlkIjoiRiIsIndhcnQiOjE3MDB9LHsiaWQiOiJHIiwid2FydCI6MH1dLCJwb2RzdW0iOnsid2FsdXRhIjoiUExOIiwic3VtYUJydXR0byI6NTkwNTUsInN1bWFQb2QiOjU1ODgsInN1bWFPcHVzdCI6LTEwNzA5LCJzdW1hTmV0dG8iOlt7ImlkU3RQVFUiOiJBIiwiYnJ1dHRvIjoxOTIwNCwidmF0IjozNTkxfSx7ImlkU3RQVFUiOiJCIiwiYnJ1dHRvIjozNzM0LCJ2YXQiOjI3N30seyJpZFN0UFRVIjoiQyIsImJydXR0byI6MzYxMTcsInZhdCI6MTcyMH1dfSwidG90YWwiOnsiemFwbFp3cm90Ijo1OTc1NX0sIm9wYWsiOnsiZGFuZU9wYWsiOlt7ImNlbmEiOjUwLCJpbG9zYyI6MTQwMDAsIm5hendhIjoiQnV0IFBsYXN0aWsga2F1Y2phIn1dLCJ3YXJ0Ijo3MDB9LCJwbGF0bm9zYyI6W3sicmVzenRhIjpmYWxzZSwiZm9ybWEiOiIyIiwid2FydCI6NTk3NTUsIm5hendhIjoiVklTQSBDQVJEIDA3IDEifV0sInpha1NwcnplZCI6IjIwMjYtMDctMzBUMTc6MjE6MTkuMDAwWiIsIm5yS2FzeSI6Ikthc2EgMSIsImthc2plciI6Ikthc2plciBuciAyNyIsIm5yUGFyYWciOjQxOSwiZ3JhZmlrYSI6MX19fQ.mISQbxs3V0GxEIPLaUviW3n2bgAewkMHOV3dmMo64RFMBXPQin3nMg5BUtX_irNEAjaKqpfHJTXy9sxDncqgo1KbynblPschfOeZWuJmY4wyBHjLkdEJYcqAATGBorl4Awo2kTAoSK0_fiRD6EkOk5ooMS5CiSDueV2t-AJW4POmuhq_KNX7TXyxqGDvKcrFHe2hPoGx4cmayC59ymDJKWcSOyStFkUWm_hpui2IObLmXgPxCj8KjTVtWA6_Qsq8JDLuAcAyCzWvi23AFbCelDUo846IUVe9m-DSUCgiuDDCMLmYCBnul0Q049tY5kMc2IhOOCl5F_Qy9SHTi_k4SQ",
+ "header": [
+ {
+ "image": {
+ "id": "EAZ2202160196-1-445785",
+ "hash": "DmwwvSQRHLaIxnrFwFSH2ZMvlLZHRrslUP5n/gwzXpU=",
+ "data": "Qk02FwAAAAAAAD4AAAAoAAAAMAEAAJMAAAABAAEAAAAAAPgWAAAjLgAAIy4AAAAAAAAAAAAAAAAAAP///wD//////////////////////////////////////////////////wAA//////////////////////////////////////////////////8AAP//////////////////////////////////////////////////AAD//////////////////////////////////////////////////wAA//////////////////////////////////////////////////8AAP//////////////////////////////////////////////////AAD//////////////////////////////////////////////////wAA//////////////////////////////////////////////////8AAP//////////////////////////////////////////////////AAD//////////////////////////////////////////////////wAA//////wAAf////////////////////////////////////////8AAP/////AAAAf////////////////////////////////////////AAD////+AAAAA////////////////////////////////////////wAA////+ABVVAD///////////////////////////////////////8AAP///+AAAAAAD///////////////////////////////////////AAD///+AVaqqqAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf/////wAA////AAAAAAAFVVVVVVVaqqqqqqqqqqqqVVVVVVVVVVVVQD////8AAP///wqqVVVVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH////AAD///8AAAAAAAAqqqqqqqVVVVVVVVVVVVWqqqqqqqqqqqqlUf///wAA////FVJUqqqoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB///8AAP///wAFqgAAABVVVVVVWqqqqqqqqqqqqlVVVVVVVVVVVVqqn///AAD//x8KqlVAFVUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//wAA//4fFVWqAAAAA////////////////////////////////VVX//8AAP/8HwqqVAACqoFVVVVVWqqqqqqqqqqqqlVVVVVVVVVVVVqAAP//AAD//A8VVagAAAAB////////////////////////////////+qp//wAA//gPCqpQAAVVUKqqqqqlVVVVVVVVVVVVqqqqqqqqqqqqpVYAP/8AAP/wDxVVoAACAAB/////////////////////////////////1V//AAD/4IYKqlAAAVKoVVVVVVqqqqqqqqqqqqpVVVVVVVVVVVVaqqAP/wAA/8EAFVWgAAKoAD/////////////////////////////////6p/8AAP/CgAqqUAABVVUKqqqqpVVVVVVVVVVVVaqqqqqqqqqqqqVVUAP/AAD/hUAVVagAAqoAH///////////////////////////////x/1V/wAA/wqACqpUAAVVKoVVVVVaqqqqqqqqqqqqVVVVVVVVVVVVWqKqAf8AAP8FQBVVqgAKqoAH//////////H////8f///x///x/8fD//j/6r/AAD/CoAKqlVAVVUBQqqqD4FgEBjAYxjEcBWjEYOYxwGqCgY40VUA/wAA/hVAFVWqqqqqgAf//AcAwDAYxmMYzGMf4xmZmMYx/ExmePH/1X8AAP4VQBVVqqqqqoAH//wHAMAwGMZjGMxjH+MZmZjGMfxMZnjx/9V/AAD+KqAKqlVVVVVAoVVYZjxGKOiP4xjEY+pjEXkBRn9U+P44oKqAfwAA/BVABVWqqqqqgAP/+P48Rjx4gGMYzGAf4xnhh8YB/PgGeOD/6r8AAPwqoAqqVVVVVUBQqrGqPEY2KI5jGMRjlaMRgoPGOajs5jjEVUA/AAD4VVAFVaqqqqqAAf/x/jzGPzjOYxjMc5/jGY+Rxzn8TOZ4jH/1XwAA+CqgCqpVVVVVQAhVUVUAoDAIwKAoBHAqYBFBGMcDVgYOAIoqoB8AAPhVUAVVqqqqqqAA//H/gfEwH+DgeB/4P+B/45//h/8fHgP///qvAADwqqgCqlVVVVVAFKqouqVVNVVVVVVVVVWqqqqaqqqqqqqlVVVQDwAA8VVQBVWqqqqqoAD/+Gf//z///////v//////n////////////U8AAPCKqAKqVVVVVVAIVVQFWqoqqKqqqqxqqlVRVRVFVVVVVVqqqqgHAADxFVQFVaqqqqqoAH/+D///P/j////8f///+f+fx//////////+pwAA4AqoAqpVFVVVVAQqqqqlVVVVVVVVVFVVqqiqqqqqqqqqpVVVVAcAAOAFVAFVqAKqqqoIf/////////////////////////////////9TAADiCqoCqlAAVVVUBFVVVVqqqqqqqqqqqqpVVVVVVVVVVVVaqqqqAwAA4AVUAVWgACqqqqp//////////////////////////////////qsAAOIKqgCqQABVVVVUKqgABVAVwo1UIQNBVawA6wKoLAqgKoIQVVUDAADgBVUBVYAAKqqqqj/4AAP4PwAD+AADwf/wAD8D+DwPwD8AAH//UwAA4gqqAKoAABVVVVQVWqqkqSpVU6VVUtWqaqqVKVK0pSpUpVVqqgMAAOAFVQFVgAAqqqqqP/gAAPg+AAHgAAPB/8AADwP4PA8A/AAAf/+rAADiCqqAqgAAFVVVVCqpX1patKVBSoKrSVXVAUtSqS1KVKlH6lVVAwAA4AVVQFWAACqqqqo/+BuAeDwf/8B+A8H/gPwHA/g8DAP4HqB//1MAAOIKqoAqAAAVVVVUFVq/5WkpWqrV1VLVq6uqpSlStKKlUr/1aqoDAADhFVVAVYAAKqqqqj/4FUB4OB//wP8Dwf+B/gcD+DwAD/AlUH//qwAA4rqqoCoAABVVVVQqqV/aWrqgAMqrK0tVlVdXUqktVUq1f/pVVQMAAOF1VUAVgAAqqqqqf/gawHg4AADA/wPB/4H+BwP4PAAf8Dqwf/9TAADguqqgKkAAVVVVVFVav6VpKVVU1dVS1KurqqWpUrSipVK/9WqqAwAA4X1VUBWgAKqqqqp/+AAA+DwfwMB+A8B/gPwHA/A8CAf4HWB//qcAAPC+qqgKUAFVVVVUKqlVWVq0uulKnqtKlZVVS1SlLUlSqUfqVVQHAADxfUFUBagCqqqCqH/4AAf4PA+B4AADwAHAAA8AADwOAfwAAH/9VwAA8L6AKApVVVVUAVRVWqqiqSpVUqVUUtRUSqqVKKq0pSpUpUVqqA8AAPBfABQFqqqqqgKo//gcA/g/AAf4AQPBgfAAPwIAfA+AfgAQf/qvAAD4vgAKAlVVVVQBUKqpX1lQFQqFVKErQUGsAOsCAK1KgCsAMFVQDwAA+F4ABQGqqqqoAqj/+BUB///gP/8PA//////////8D///////9V8AAPgsAAKCVVVVVAFRVVq/paqqqqqqqlKqqlVVVVVVVKVVVVqqqqAfAAD8XAAFAaqqqqgCof/4GwH///////8D//////////wP///////qvwAA/CwAAoBVVVVUAVKqqV9ZVFVVVVVVK1VVqqqqqqqtSqqqpVVVQD8AAP4UAAFAKqqqqAKj//gAA/g//////wP//////////A///////9U/AAD+CgACoBVVVVQFRVVaqqK1WqqqqqpSqqpVVVVVVVSlVVVaqqqAfwAA/hYAAVAqqqqqAoP/+AAH8B//////A//////////8D///////qn8AAP8LAAKgFVVVVRUCqqgABVKVVVVVVStVVaqqqqqqrAqqqqVVVQD/AAD/BYAFUAqqqqqqj//////4P/////+H//////////////////9U/wAA/4KAAqgFVVVQFRVVVVVaqqqqqqqqqqqqVVVVVVVVVVVVWqqoAf8AAP+BQAVUAqqoAAIf////////////////////////////////+qv/AAD/wrAKqgFVUAAAKqqqqqVVVVVVVVVVVVWqqqqqqqqqqqqlVVAH/wAA/+FcFVWAqoAAAA/////////////////////////////////1T/8AAP/wr+qqQFUB//wFVVVVWqqqqqqqqqqqqlVVVVVVVVVVVVqqgB//AAD/+Ff1VaAoB///gf///////////////////////////////qq//wAA//wr+qpAUB/4D8CqqqqlVVVVVVVVVVVVqqqqqqqqqqqqpVQAf/8AAP/+Ff1VoCB/gAHwf//////////////////////////////VVP//AAD//wqCqlAA/wAAeBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//wAA//+FAFWoAfwAADwFVVVaqqqqqqqqqqqqVVVVVVVVVVVVWqqn//8AAP//wIAKVAP4AAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///AAD//+BAD6oH8AAAD4KqqqVVVVVVVVVVVVWqqqqqqqqqqqqlVD///wAA///4IAfVD/AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///8AAP///BQH+h/gAAADwVVVWqqqqqqqqqqqqlVVVVVVVVVVVVqH////AAD///4Cq/wfwAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf////wAA////AFWoP8AH/AHg//////////////////////////////////8AAP///8AKVH+A///g8P//////////////////////////////////AAD////wACh8g/////B//////////////////////////////////wAA/////AAA/g/////4f/////////////////////////////////8AAP/////gAP8f///B+H//////////////////////////////////AAD//////gH/j///gPw//////////////////////////////////wAA///////h/+///5j8P/////////////////////////////////8AAP//////4f////+I/D//////////////////////////////////AAD//////+H///H/w/4//////////////////////////////////wAA///////D///h///+H/////////////////////////////////8AAP//////w///wP///h//////////////////////////////////AAD//////8P//4D///4f/////////////////////////////////wAA///////D//+A///+H/////////////////////////////////8AAP//////w///AP///h//////////////////////////////////AAD//////8P//wH/+H4f/////////////////////////////////wAA///////D//8B//B+H/////////////////////////////////8AAP//////4//+Af/gfh//////////////////////////////////AAD//////+P//gH/4H4f/////////////////////////////////wAA///////h//4D/+B+P/////////////////////////////////8AAP//////4f/+A//AfD//////////////////////////////////AAD//////+H//gf/wPw//////////////////////////////////wAA///////h//+H/8D8P/////////////////////////////////8AAP//////8P//D/+B+H//////////////////////////////////AAD///////D//x//gfh//////////////////////////////////wAA///////4f////6Pwf/////////////////////////////////8AAP//////+H/////H8P//////////////////////////////////AAD///////g/////h+D//////////////////////////////////wAA///////4H////9/A//////////////////////////////////8AAP///////B//////wf//////////////////////////////////AAD///////4P/////4P//////////////////////////////////wAA///////+B/////8D//////////////////////////////////8AAP///////wP////+B///////////////////////////////////AAD///////+B/////A///////////////////////////////////wAA////////AP////gf//////////////////////////////////8AAP///////gA////gP///////////////////////////////////AAD///////wYD///gH///////////////////////////////////wAA///////8HAH//gH///////////////////////////////////8AAP//////+D4Af/AD////////////////////////////////////AAD///////B/AAAAB////////////////////////////////////wAA///////g/8AAAB////////////////////////////////////8AAP/////wAf/wAAB/////////////////////////////////////AAD/////4Af//AAf/////////////////////////////////////wAA/////+Af//wf//////////////////////////////////////8AAP/////gP//+H///////////////////////////////////////AAD/////8H///h///////////////////////////////////////wAA//////////8f//////////////////////////////////////8AAP//////////D///////////////////////////////////////AAD//////////4f//////////////////////////////////////wAA///////////D//////////////////////////////////////8AAP//////////4MP/////////////////////////////////////AAD///////////AB/////////////////////////////////////wAA///////////8Af////////////////////////////////////8AAP///////////4H/////////////////////////////////////AAD////////////D/////////////////////////////////////wAA//////////////////////////////////////////////////8AAP//////////////////////////////////////////////////AAA="
+ }
+ },
+ {
+ "headerText": {
+ "headerTextLines": "BIEDRONKA "CODZIENNIE NISKIE CENY" 5834
34-325 ŁODYGOWICE UL. BESKIDZKA 8
JERONIMO MARTINS POLSKA S.A.
62-025 KOSTRZYN UL.ŻNIWNA 5
"
+ }
+ },
+ {
+ "headerData": {
+ "tin": "7791011327",
+ "docNumber": 608827,
+ "date": "2026-07-30T17:21:19.000Z",
+ "CPS": 56
+ }
+ }
+ ],
+ "body": [
+ {
+ "sellLine": {
+ "name": "Tonic A",
+ "vatId": "A",
+ "price": 549,
+ "total": 549,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Citrus mix A",
+ "vatId": "A",
+ "price": 549,
+ "total": 549,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "NapGazCocaCoMIX2,5l A",
+ "vatId": "A",
+ "price": 899,
+ "total": 1798,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "NapGazCocaCoMIX2,5l A",
+ "vatId": "A",
+ "price": 899,
+ "total": 1798,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "OsheeVitamMagnez1,1l C",
+ "vatId": "C",
+ "price": 449,
+ "total": 449,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Polaris NGaz 1,5l A",
+ "vatId": "A",
+ "price": 119,
+ "total": 714,
+ "quantity": "6",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Tost Maślany 500g C",
+ "vatId": "C",
+ "price": 399,
+ "total": 1596,
+ "quantity": "4",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "WódkaB Bocian 0,7l A",
+ "vatId": "A",
+ "price": 5399,
+ "total": 10798,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 10798,
+ "value": 2800,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "A"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "OlejRzepZOliwWyb1l C",
+ "vatId": "C",
+ "price": 999,
+ "total": 999,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "GranolaMleczCzek350g C",
+ "vatId": "C",
+ "price": 649,
+ "total": 649,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PodpałNatur64Kostki A",
+ "vatId": "A",
+ "price": 399,
+ "total": 399,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "GranolaFitNesOat300g C",
+ "vatId": "C",
+ "price": 999,
+ "total": 999,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "GranolaFitNesQui300g C",
+ "vatId": "C",
+ "price": 999,
+ "total": 999,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "DO MOJEJ IDĘ A",
+ "vatId": "A",
+ "price": 399,
+ "total": 798,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "KiełbBrockaSokołkg C",
+ "vatId": "C",
+ "price": 3290,
+ "total": 2866,
+ "quantity": "0,871",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 2866,
+ "value": 697,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "KiełbBrockaSokołkg C",
+ "vatId": "C",
+ "price": 3290,
+ "total": 2737,
+ "quantity": "0,832",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 2737,
+ "value": 665,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "GuancialeCubGB150g C",
+ "vatId": "C",
+ "price": 749,
+ "total": 3745,
+ "quantity": "5",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Bagietka 175g C",
+ "vatId": "C",
+ "price": 379,
+ "total": 1137,
+ "quantity": "3",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "MasloEkstra200g C",
+ "vatId": "C",
+ "price": 599,
+ "total": 599,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "NapGazKinleyMix1l A",
+ "vatId": "A",
+ "price": 749,
+ "total": 749,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Cebula 1kg opak C",
+ "vatId": "C",
+ "price": 499,
+ "total": 499,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "MuszSarKam185g B",
+ "vatId": "B",
+ "price": 369,
+ "total": 738,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "DIP ORIENTALNY CZOSN B",
+ "vatId": "B",
+ "price": 299,
+ "total": 299,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PrzypDoSoAmerKami20g B",
+ "vatId": "B",
+ "price": 299,
+ "total": 299,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "KetPikantnyPud 990 g B",
+ "vatId": "B",
+ "price": 1299,
+ "total": 1299,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "SosCzosMadXXL860g B",
+ "vatId": "B",
+ "price": 1099,
+ "total": 1099,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ZapalniczkSolebo1szt A",
+ "vatId": "A",
+ "price": 129,
+ "total": 129,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Ręcznik Queen 2 4 A",
+ "vatId": "A",
+ "price": 849,
+ "total": 849,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Jaja W Wyb L 10szt C",
+ "vatId": "C",
+ "price": 1399,
+ "total": 2798,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "MięsZnogiKu b k kg C",
+ "vatId": "C",
+ "price": 2199,
+ "total": 2038,
+ "quantity": "0,927",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 2038,
+ "value": 741,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Ser Gouda Świat1kg C",
+ "vatId": "C",
+ "price": 2989,
+ "total": 2989,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "MixSałatRoszpoVf150g C",
+ "vatId": "C",
+ "price": 549,
+ "total": 549,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Limonka szt C",
+ "vatId": "C",
+ "price": 199,
+ "total": 398,
+ "quantity": "2",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Cytryna 500 g C",
+ "vatId": "C",
+ "price": 599,
+ "total": 599,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PomidorPaprycz500g C",
+ "vatId": "C",
+ "price": 1299,
+ "total": 1299,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "Banan Luz C",
+ "vatId": "C",
+ "price": 699,
+ "total": 598,
+ "quantity": "0,856",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "OgórekSzkLuz C",
+ "vatId": "C",
+ "price": 899,
+ "total": 340,
+ "quantity": "0,378",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "BorówkaAmeryk 300g C",
+ "vatId": "C",
+ "price": 1498,
+ "total": 1498,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ChipsyCr130-140g C",
+ "vatId": "C",
+ "price": 799,
+ "total": 799,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 799,
+ "value": 243,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ChipsyTopFromage150g C",
+ "vatId": "C",
+ "price": 495,
+ "total": 495,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 495,
+ "value": 150,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ChipsyLay s120g C",
+ "vatId": "C",
+ "price": 869,
+ "total": 869,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 869,
+ "value": 264,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ChipsyCrun130-140g C",
+ "vatId": "C",
+ "price": 799,
+ "total": 799,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 799,
+ "value": 242,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PrażynkiNietKet100g C",
+ "vatId": "C",
+ "price": 499,
+ "total": 499,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 499,
+ "value": 152,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "ChipyCrun130-140g C",
+ "vatId": "C",
+ "price": 799,
+ "total": 799,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 799,
+ "value": 243,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PizzaKurPiecz600g C",
+ "vatId": "C",
+ "price": 1699,
+ "total": 1699,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 1699,
+ "value": 300,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PizRodzSzynSer600g C",
+ "vatId": "C",
+ "price": 1699,
+ "total": 1699,
+ "quantity": "1",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 1699,
+ "value": 300,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "SzynkaKonserwoKW200 C",
+ "vatId": "C",
+ "price": 699,
+ "total": 2097,
+ "quantity": "3",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 2097,
+ "value": 699,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "MakaronPennePa500g C",
+ "vatId": "C",
+ "price": 339,
+ "total": 1017,
+ "quantity": "3",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 1017,
+ "value": 339,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "C"
+ }
+ },
+ {
+ "sellLine": {
+ "name": "PIWO HEINEKEN 0,5B A",
+ "vatId": "A",
+ "price": 479,
+ "total": 5748,
+ "quantity": "12",
+ "isStorno": false
+ }
+ },
+ {
+ "discountLine": {
+ "base": 5748,
+ "value": 2874,
+ "isDiscount": true,
+ "isPercent": false,
+ "isStorno": false,
+ "vatId": "A"
+ }
+ },
+ { "discountSummary": { "discounts": 10709 } },
+ {
+ "vatSummary": {
+ "currency": "PLN",
+ "vatRatesSummary": [
+ {
+ "vatId": "A",
+ "vatRate": 2300,
+ "vatSale": 19204,
+ "vatAmount": 3591
+ },
+ { "vatId": "B", "vatRate": 800, "vatSale": 3734, "vatAmount": 277 },
+ { "vatId": "C", "vatRate": 500, "vatSale": 36117, "vatAmount": 1720 }
+ ]
+ }
+ },
+ {
+ "sumInCurrency": {
+ "fiscalTotal": 59055,
+ "totalWithPacks": 59755,
+ "currency": "PLN",
+ "printBig": true,
+ "printable": true
+ }
+ },
+ { "section": { "type": 0 } },
+ { "section": { "type": 1 } },
+ {
+ "pack": {
+ "name": "But Plastik kaucja",
+ "price": 50,
+ "quantity": "14",
+ "total": 700,
+ "isNegative": false
+ }
+ },
+ { "section": { "type": 100, "amount": 700, "currency": "PLN" } },
+ { "section": { "type": 101, "amount": 59755, "currency": "PLN" } },
+ { "section": { "type": 3 } },
+ {
+ "payment": {
+ "type": "2",
+ "amount": 59755,
+ "name": "VISA CARD 07 1",
+ "currency": "PLN"
+ }
+ },
+ {
+ "fiscalFooter": {
+ "billNumber": 419,
+ "uniqueNumber": "EAZ2202160196",
+ "cashNumber": "Kasa 1",
+ "cashier": "Kasjer nr 27",
+ "CPS": 56,
+ "date": "2026-07-30T17:21:19.000Z"
+ }
+ },
+ {
+ "addLine": {
+ "id": 0,
+ "data": "Nr transakcji:4320
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ {
+ "addLine": {
+ "id": 30,
+ "data": "Numer:5834260730432001
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ {
+ "addLine": {
+ "id": 41,
+ "data": "Udzielono łącznie opustów 107,09
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ {
+ "addLine": {
+ "id": 41,
+ "data": "w tym:
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ {
+ "addLine": {
+ "id": 41,
+ "data": " Promocje 107,09
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ {
+ "addLine": {
+ "id": 6,
+ "data": "Numer karty:99001*****936
",
+ "width": 80,
+ "CPS": 56
+ }
+ },
+ { "barcode": { "id": 5, "data": "MTAwMDA1ODM0NDMyMDI0MDIwMTgxOA==" } },
+ { "sysNumber": { "data": "4320", "width": 80, "CPS": 56 } }
+ ],
+ "sign": "9884906F1B375741B11083CB694BE25B79F66E001EC24307395DDD98CA3AE1114C0573D08A7DE7320E4152D5FF8AB34402368AAA97C72535F2F6CC439DCAA0A3529BCA76E53EC7217CE7995AE266638C320478CB91D10961CA80013181A2B978030A3691302848AD3F7E2443E8490E939A28312E428920EE795DADF80256E0F3A6BA1ABF28D5FB4D7CB1A860EF29CAC51DEDA13E81B1E1C99AC82E7DCA60C92967123B24AD1645169BF869BA2D8839B2E65E03F10A3F0A8D356D580EBF42CABC2432EE01C0320B35AF8B6DC015B09E943528F38E885157BD9BE0D2502822B830C230B9980819EE974434E3DB58E6431CD8884E38297917F432F521D38BF93849"
+}
diff --git a/billsplit/test/helpers.dart b/billsplit/test/helpers.dart
new file mode 100644
index 00000000..597fc2a5
--- /dev/null
+++ b/billsplit/test/helpers.dart
@@ -0,0 +1,78 @@
+import 'dart:io';
+
+import 'package:billsplit/state/app_state.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:provider/provider.dart';
+
+const _pickerChannel = MethodChannel('miguelruivo.flutter.plugins.filepicker');
+const _pathChannel = MethodChannel('plugins.flutter.io/path_provider');
+
+/// Mocks the file_picker method channel.
+///
+/// `pickResult`: bytes returned by pickFiles (null → user cancelled).
+/// `saveResult`: path returned by saveFile (null → user cancelled).
+/// `saveThrows`: saveFile raises a PlatformException.
+void mockFilePicker({
+ Uint8List? pickResult,
+ String? pickName,
+ String? saveResult,
+ bool saveThrows = false,
+}) {
+ TestWidgetsFlutterBinding.ensureInitialized();
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler(_pickerChannel, (call) async {
+ if (call.method == 'save') {
+ if (saveThrows) {
+ throw PlatformException(code: 'boom', message: 'disk full');
+ }
+ return saveResult;
+ }
+ // pickFiles ('custom'/'any'/...)
+ if (pickResult == null) return null;
+ return