diff --git a/app-shell/src/_schema.json b/app-shell/src/_schema.json index 45d7ec8..a11b064 100644 --- a/app-shell/src/_schema.json +++ b/app-shell/src/_schema.json @@ -1,4 +1,5 @@ { "Initial version": "{\"iv\":\"OrVh79mBHSlENOPx\",\"encryptedData\":\"ZGSgYCXgppxoh21PEx6cX0iYLdW9KPgbV9wRsBJ4u5k1itlhg2rzOlZqR0SUmVe8U49P+ys5K0HCGXpuwt0rEfkdpuBHeoJGxUIrdBarujWuUzwF6TXMw3f9rwY9W4q4/vGE8GomHHd9spw/XI3pwoTldrp2n/lJOs/rhSjb1suvjDt1bak0gOhkzRDiATFJy/xIapzmqZp50kwY+D3S2Q341pz8I9y1TisCzM1oJ9/Z7yzENrpZ+r1YV8QTmi4jX1BLZ8nZUB3x/+8p3gvoLcgdDao5ZJbraBVcSniatmJha6wusIfoQk20FkDkMNLYz6H4O4eAWCMHors2OUSHGGaQkxXuYMSE/24cZLfg3P/To2NBm9IwzY/GDepvEvY24SZfHEyt3MvaUwtO81SDvNEZ3KhjF1ZNEhuKn64tfP1ZhVxjUh09/FN4IsFE60d40RoN+kmgZG2kso8ieyQqA46q9OzO0yeBYpQqVKQhjh8BZAzHEvDDV6ZDJ65kT7VG74eG2EKZC7bn7yEbQ4BHVbRZy4im5NXEL5YngcpX9DACrQpKCrJ0p/ZjrdrQvlgx1S+TD5M3/XgdPVi739DFUCwY9sqdzuCmJmqAl7BM+v3RYzzHZpOqMz2UrirZuURHVr+DK4DfzA8gu016/qbtITBZEIWWeB6bMFvLlKBuAeOn9t7dwo+UPg2KeNPk8SDEM27BujxQ4HKNvozqDI6dU3vFM9Vfxi1t6ivakXW4I0AOiGPAa+EBT0rnAt5So7gZz00ib+QQL6Um0gpdNbGqbBuUQ4BncvQdvDLMxh3cYvMwKIaGher4OEp89CQlIHmz2cyRu6CZYL2dqGO1yzn87TFWgSQY6xLvwK6rR8bH8kUBGbXuuTSC4qqI0DRBasJh4MlZpp0u7264Swpd/oARNqBJnIj6IjSvC9Rzed9YlKtZTZldCrLS3phBdOainDfYzl/U9My3q6YbPeTmGDCGrb8lNRCP5yoRWEu3tJ5mDUWw7a8QzxLGoXo2sUEZtkAC6aOO2Rfhb9oj35T//vvJuX0550c+lEb8jAcdLEwxlD/pGAE3EzCvd+qVcpsx8QKAG7OrSb8IQxYGjX+uKcalBqJEGNl7ahzlq79WTYSUjBgQ9rmT4UhTo7p1F+51oMo57UMc29W/BD6VqiD4QfxI5WRQRlLENan5gUdPJY/ZranfIWaGHdXu/AxQPsvByqp1LVLdCxBobaHIGh/7YHLT/SDo/mZ0eHZAhK4ZAiA9fmHF/Ql51mMSh5jcY89KYseU4WFjJk/lZMQ9Zbsgle2BdWg0jIhQYQceiWBVf4AfSRKzAgKwxRF1EmzS1fPZRfBmv0Q+gThZpUc2AjsgftKjgIDjdNcMhn0YpqigH10v62gNNDANYR7H7sONliCPtXtm0x/S+gb8bSfDhjFKdJmio+4q/0MoUxJ8SjDQpZxdRVFCekxcWp3dsJCK8nWZAR9Wuyv9W4bPsZSr0xXCg52kxT1ZCK3cYLGlr0rDLvRsMgLZ59RjBQUj3o3BfMg47RyfjXnnnXAidN/xW57F4sfu0WJPsA5GbVSvwqhmqj4zL5oKEaMDDjWjWFR8PUFjfV1ZTFsiH/tIHOUiHJPP9O4aHDQo5b/bdk1qqnmTfbKZeDZsYTQ63kMF0OBHsj1qh4HrgfmxYSgjMZHaO5ToOdkMprDd2cKZ3UrhEt+UjqdGwgVxmrNYRWa7W28rwB6WSRfdGyI1spKF8rWr2LPJHOLNXI+kDyc7IiVwTw12vNz+gZ93CH6g+th63DeULI6nVqJLGuRgtEpGSatrxWPrsVpx4uojCuQJAMOp8gQMiJQxRszDoH6f3mRN2GhcncpjCSwyfGqwNyTncv9IMOMbqzbLhB0DkfPko1LVMc+wZmZ/dMo6sSTJcCzjioPkLcI8htwhs3RBGXvhi38+5sm4vcp9xDuOTW69Bbq5DBS71gQ0Nlzx6qv4ppRKttrqu4eOl7fr9eTGiJXT5oSRs//cahfTJFQ1lCuHvFJwXB3VvHrv7zeQDqR2alUj948PH9AjyInfnEVr72zu0MhM0K+lgrZId3GPsLQ2jy0ZdbHr0eD3FRN5wkcfya3qQE3hPAXRnMnqu1xffAagLfE1qMORkiAxmWcO/GKl6UbwlfUwn6JskuDccinPv9onWxzV9DYA2C6L6QfAi1dJC0xQ8FC9Y07MFtEfwh4r2w1f9ZMbgyrSPmu6MfWNqPjYnlf4CKi3KNpfELPKq8AWpazBzcjDTsbY/BI7wfP2eekf+5p6CvWcBmQfI1cj8Q6Q4J3qblqtPjjpmBgMTRoSbccY/ZP8WZ1ulVPph/WCIoC8+EfmoCRRFVp8IcGiD2lZt6RxHgONwtg8v9EGoZCnGbRot5U3W7eSK5Eycb+As4eJDMnr9R0TOzRJRYOMSgr3wQ/KPD0ao1s2qsLEdHMEsJBftO+29Z2MWZ9MvODPXEI8nc1JoYpwN9yE6S6QpoVhjdSbMEJRaDtMyuoW8B+or8EUuYgojv0WSJwlWgFczuJaVOXsyWUYoXUA3okBwn1ccLDce2Hst3lzktYGCjFKV0/Yubo8+TfePqOLWvgGWto2+NJkSEbj5T6uoDwM4uts9Qa8ZdGeRkelwX1nGQ/jPwZhfZBRbqrkr1GagNHfyH3i7t5ZuVaUtIbHQ9JAJnH2jQRvrANHuf8Tsa+dtl+88PGPPPdsBiNHuoVs2lTAeHN+gVaq8mAhTfexWYRfmVeL2oBL8ksdWh+q1HD0ITspe6iWaObfrpP/HO9pek7ZR7Q528dgiYHPyqbVx23efJOSgiUiKc/3gxwQliru1gbJxd7ocUzsepf/wIv9sGoYHdDqZ9MKKYqJyL17Id0E+dsrsmyBezfIzmdsV+cBAqGKtvhy2Hq8suGN+xmR6lOpNeEH9hn31zB4TFkF/OVT4JOoNdDqNdmbxe0F2QV3IVRP+eC96tTQ5bMor+oPf0HPFbdKQaDErnF8zZ2EOBvXK0PGwgyzmzx6b1m/SXJeI95WchGKK5lDvz9Xj23opoY/4NK/5BK0qssTOSK+jtDcS1hhYnqZFshpfO1Sy//ebZdTsAAi2WD4BlkP1JDy8oMD+h0qvx6OMEMd+mDQrqoVyos0qlMCqcLyxQB1Sp65+vXXHOTWO7b0nfjS+mT4TE+sAwIGc+XUZ4Ow1UnwZlc0XxKaz5T10nbMoWq6hGu/GOEyTklxlHxVMTCExQDxwwvVFuqw8CQe8mHjeGNCrOD/5OybHTMe8fqB5NK2fbBF0vc4j6l/9HKW2SIV8MNZIF6HmLehdaRaTpNNsEV9rVzSZdAE7DgLQpesJYKMkY7WkyYPUSMUEqQvJDNaNwj/H2wBdVewRZfP6hKXGWpELNwM2fq/jKXL2tHdvrPDwIW944ZWu2FtAesfN4eqA/mRDFyTY+KNMFly/crky1Qg/XHVvTur68e0Qm/VIiHS5xqVtlMTsdSP4+QQ9CC5Ej5dCZaK8Z1F28olc/h1uWASEEoCU3HhsjfKh6n/TABtg5uZOn80CaOJQfnzhf1nJft9nfpX5MR5IZXf0MKjcT1GfmfS5KMEpEOf0bTS0j646K2Z5s2ZsbfLF+d5F5wFh0LFZSsISWVP6DGIeqGwaRE1YYlzVOTT0IhTjgeNXTpYjsN5ZpXuJ1F4hWhRulD658FLZCML5Bdz0XW1mXhfciW2qSygYvTMVnmXyyR3XkK19b714fS25e2Z6zCPBKm67gtA7lNsKdXhCGEGED8PWjle/ziXRtq+tVYcuFod9hJLif3ouo50fQqxgoC1cEV2Vt2VaZCfou+5Cvw7l/d10AiprU8csPibgOtcHV5wUFRRguYCQ7W7089VmhOKX6q1nF/L2B4gBNpPQ0N5Qmd0RSpyHPtsgqT1Mqf4nPEaijUFh6GsLtL2nbeXd2v3vMgWla629WMRGMe7SEPg/6+RLremmqQoRgXWoq4hLHAmLe5/Hdjl13pOABlZhruJzriLYnK8x/GmKG1hz/NLp2jyBenHmjVt70dSUIOv1ZZStRb6l2te/ZvwS0xqK/ou21hrxyy7Lj//bn6WbMpZUuOAinuKqRxbIe5drhV7OO+EcOvsTpTbn6U+s/fCSpz3Bs+QBVxnk9Q/L1oxY7tdyameKYjLEhwCcS12jOqbcPgV4h0mhGwd5N7di16vLet9ynw4uDYYG2GEAZKyxxgVHiBGFHKB9BKPwh6F3B/b03E71ZPTPnapoSjUcjOObrphedtczlwF5oCOXiYokZ1qr2nW5HyxsizZadW/v9Kr+QXI4f4GHlxL7hw3drkFAoWsnBNAOMH+OQyVEfUoSjVtWI49kugzFpuh0zkkC4bYMRDnY93gUK3mcCAAjxUxCQxaF2w3u95jalzUenTuUdWy1Tgke57U4hANaHt2RvUOmxCgIu2h3GkCcu5165srB/O9u08GbtC3EQy8JR21HOcbaLThTDAkdHUSYcKHondPpJP07di+/4oBfxMeBH6Fixkfh+BwyMiJmBQ016NDoySIKMM8XCEA7nEpi+NgjVLGnORWaSN6MIUme6C526aXwamgdkluhWPhQBcHoz+okv4uwlCaaONcRRw/ZUmQVGsWUGn9ufjXjSg6Rz0djVIpni7Mnm5pFl/vToVb5ja3eL3DWTcRJbrrFccdw/MsyEi304xLCqmRAvOCCCfCJifMhUiKAddB3iXqBbmxPLv++/K2PX8Hifr9uMsO0IabZ/u+qKg/WLhtkoKVyy/ilIeBkLrqvcOWvS6ejTQxo5yiJNlXaG3pLumOD031SAcgk2xElb2Dyngxcpx7Gkpm6f1iH86MMb3Vo2S1E8mSr9r5V7XOz7NvhtMaA73VWW7LRPfgRvzDeVdj1RMzqZW9wxVebFgXUTWsF4YY3qPa72kxCByZohHa9BK21Pn9UqWnUssBxT2+Nczwz036aPYLRDxG91tHcGTOANL/h2xAQEEqtGJyQ6v7JV3P5YVFwtjWCSjmsS1V5TqlH638qleR8z4WSbWyXOzBJHp+mz3r6pVen3K6PNaIdraewQybT/4P8VMV05xef2yeHXLO0pzd2IsHVEdM1WlYBmidVoBL6yF2pGd/ovhghFot2y1FbcxDpL05Vg+0cW4/ogRYL90Ys6L4cIuh12Gxi+EHq8QK1EGrzDzk3fYSyJCZHVtTfLT0+JMvdIResj4d5KkKuwBXKxPF2hT14KzVhG2h6w2PK9RdA1ngbZ9N743i4ZiEIM/i0b6fJXmNZul4lDOeTwz2yJYb5pF3c6jKM3XkgQPW8j72SzsF4cR1CpOWm0hO1qfVaWuOvqzqmeMk3K+8KItT7Cu9ReOPx+rAHa1Jvbd3pI5lFu4LNCJMzAVP7iZcjJsJ/KMHIp/akRuIlYFebBBVRZUEzhV0LK0KGU0fvTw0wawkRDB2W7nitjfBbrWraD4Q0Rp6FcWwM5Z2TK5zvzLKaNq2xZkNREVeC+nCbmiTXeZsF2uk7bjYrvkoAwYoB8g7u4wITvoLFi7JHdEZ9VipcJ5kh3bylpeHktMUlcDMPD1E2Qh8WBVsG5k/3sA1Lqye3QyYnDpWtlQovIy+Q3/00OFwNGH6A/RoDHWiGQ57xs4eIPqpHPGDBPh783NIcIkbLdRT5+ODI1gqyW0uwYvwKdvX0ESu7iOTOThVnhGTEw74ESNDh6xgirCkvgaHDihK/TCbYNahVNd+SyqBcImteb/nReuMfSKa8GKAV9dBxQBaD17IrRf4iBd1pF7Jllg0doWRefhYu5Zd6L/66bzJlcP25UX4waNc9Kg+rZpEhXWz9+KzJbfZAKC+i1RAU+WJagu7n75zHzGjG679GEwBBwwtR0id/RNSHToyORW7wmJm9A7MSAQ1P66gL13jGGfdDXduUq6ofV6bcUoKTrgPaC3FLv6flD8VcUXWuwBxbJ3/Pb2rLJMKzan1OM3NiyayzY9UocSjTiYHUg7J7aSMpEwuB1cGnPOCqMbkfde+NAge22pTb0m3xuQ+2CZT32NSzwxoiUrtultRuq0eKdfvPJNP90vfudJhJlAPYL8JHSns8a+QQESJIhhehUQZ2uOf4n1cBUZCU1cDOdtWxVowFKhIQd/6mj2ctNqg1M35yyiIRdF9XJwmstJ8jjeT1/+fx8eIQC+9qN2VSpk3xw1SfubF+RwOosT23juvUpZCJEUplZ/Akl8dweRUd2fnfOQT4mj3dVHQ6Yd2pJpE6kAik1uMZBEP0u6afVTrKjHC4eNWMj3kMdMGOOmBoAyzORAxO3DRQoKbLqGTLZxWl3UzYxWU3gC9Gyo0cfPIgarr1xeZ2E9/NPJbQaCj1REklLqLoXiNp1OH0A+kIQ2RfyxrZ52yIR8slj+BnprMn9GEufZakyDyEFLHLRulZeZpKCpmpLzWEmRE7tU/mNTZ2UmHJo38FLVPF/AiLBhKc9tlv1OkQkNWk7pWMCXptuGg/XWi48bOQhOgH1YFRlF/I651a0vvypzRbFS1H+sB/kXdzAyEaqLCDOuErJfk0sdflumqGN3Affke+QSZ8kG1ZTxstYi4LzWmcuBQh8rtJpXMU3ZikDev4+q3DmIUCpXEqB1hsrQeyNZMNDZb5xfq5zTIS+gHgV3/FKCCz/51kjUiQ1/yTeV/ueRu3caD6rjGUqREtZ8kBCQxSVtaUK4d9UkAmvGWLlqiHD0bD/aGlNymxtV13iuMh0TAWEcE56FGGX9vSvxHDjraWC52JJ8J6pEssIHY7o7rSJCtW1r9athHrFqIQIeelLw1ezIIgHRA13MB11XdazOHvYCEtDCU02+5zKb5guAur3ulh7qnM53ts4LeBN7R2gHg0oLoNiQ0f29IbEH2j17AZMCBKl+KSh781QIxVq5Ivl7b8DcHNJcv47/KTzjwyyD0JtYd/I6uQuOT/85KyHLeuvzT7tvguVPVZKBIhaoFcTLXGRDzg5iI88R0tejaiDDLC7vrtD+EnRv7Yo4HQjc9Vx+Ch5tqJS1r55YcLdDEsBeHpxMhb+lrRytRU+Ts9tG18AIvA0pj0fQ3Hz906FAHaJ+CRJkiRQbiH5m+zDQB6mIXGaL0jYURv0pE9CH7QY42TqwoIjyWayo2nprPTBErHyKAYRZ75AmYC1ndGAJUUGxGiL+FDfmyGdsVKi8qh9eqejSjRffrKekQ909tCnSmxJxTKuV0OKGUMSKYapWiEQ07TDXWUmTKInmhNJbNmsuGqEk9ZNm/Mb+87cPkWbWNAt06lg3ynJxndI1T6PIBOd53oE7HGGFcuVmX1Qu2j8aAh00W+2cBT3vYvEAV2vYykaf7bCmnL34+Y78BmgVhg21bJlwxL2IY6sehMeSolsqXTT+FeRu4S3aDLKdUPIV5/yqCxwEUBFf5RO/MXbf6uQQH/FKe+3Oz9nKKGMi1VwgCL+vU3YJ7xiuD8cI4IvyvlLgKWcP3/gEkrv3H/fN1jCOLMjmDitGZWKKbyj9HRfm82ho30Nt0UYSfq7abGM6h6I8+850cCh+23RRALCF0a3c1UBFYss8QvVqm1eLq7fwoB/LwIpVOQAl1y+GpyvZ9h78dRONcB2X81CaK75CsqmePuoXbG0nGY6Sxlb6IFjpkG8LUF4eUJftfgbJH96yqZTWpETnR047f6vhIzvz1HzWd558dq51nJKnyti6rrPTmc00/gHtnRn48o5bmEpPI6SR/HwS1zo66/QU84c4P72KOzpdrVsJGjyOEGfPs7SPfldf+fiG8zV9o4Z4+3m1y6ar+x4e5i9l56w3BoL+lo9jRADXLOnpd7vw9MJRqnGKSYWhhKFjyhBjwlW8WK2KUx1wPG9gXeTg3bXnnqSxc/yM7VHesTpKtnICIw7NOxAtN5B3/sO0y7fGaDoQSz6YsGJYpEzp2zX9/gy5C/x15C6OmrykxioMEaeoWeLePkHRz5eETuWEWeXtWl1B8GD9a10Bbj5eIyEgckUmV8ujfHTAsx7JYUsbxVboaRW1fqN2CRgZtKRKDSXMnD4Ip8HcLICIaQYb5xJhKurKN7gNDzn3jeyqVRZuRyw1LcgZstMlfymeyRDX1eWNHb9WIxNMz6mq2hGhJRRzqWhb9kI16rhWz7fV6bwjOGhfbfK0ezS63/3/Gcnh3b358LH4FjMtgOeSqgJ7T4ZkYlGNlWEHWm0Q4V3842ZA6Gc40PR9CoB+nR9UG2W/3eat0B1Lu9b7wPqU0w2pDRoDJv6dkNpWEleUCfFcxjZUX6RxoZb5KWqcqx0lY0bLTM/Nw1W62MMfYf5gQFoAbprOW7cF68KIR+eIz2LBhZJ8+Hs14yUwBTWxKRj6RtMfRCxTHP22m7xREHULwewsOodoJ1fNMfTXfE2Uob5IqlXHbxe31a3IUBUKtjQC7Hg/OB6wYPuQQ4dzLZZJ0uy1B8t94GobDvnuXTJcXz+lvjPM8C9EG/PpUjHC09yctuPHDOk+MV1qj72vkIlLMa3GphCQosGepiHZxvSg6brpyDBOlb73lkMA/o80at/c81qMBdvj6JivFAfaMXMOntHGpvvsh/DUqb9XOlWwBHiogHWP5LAkCOHkRG7yAxLPaJYkyBy5qCCzyzx/VU/cBvw6HtkqSqIVl+cEq3z4RCBZ7HTooVooBU0KGeXY3UOUzB11v/4tJvhNOxfR9MyaeOMlvuEfu0RFuOQN9EplAGVjkQLWfivD9eFRGr4X1+ynig5f7fUCkm58aUYwtKf00eHGXkhPTrjAPYab+cNLWHWl+gYX8IwEabwPsKJbpeGfHDRb4TSx76KIOMtsVfYY1KI25D4PdP+HNUuAWH3DqKjpiQG3FiKr6zu4R0SZnmh+WORtHMp6oUeYmBr4iG27xJlnv1VbalaGK9mMMFhlft8nMnzz4khD0yA/IzhGQgOEAAFkO7kM+xHxZXNE4coPja0dqfNm2vDnLX0jpNqyyqcxsZEeMvGK8ItwXpzu6fpJviwCfY369rmsKT17NPo5o1hTgWZ6HASsM5oxeXxUTsvF7BWpFs2p/mm/tx+mOnLdgdI0qJnaKYYGVCvgtLoXAmeBp5U3Ffy6Hzn38PP7NWRuQRWTMizP8zngX3iUqIOjL39oX8HmY+xfmWURrVzDvTQR4lRCriIG6Osp0TRztBcLpbiNErVDmmbSQnza/4bHaHJEiO4eT02Opwu/GkqBC4k28I3ee13bfZmat3E+GG/lqXTfqbtz3Av76TYvGen0xRm8t1E5h5n/T58ed0UqCbUO0tqgTy5bABwuX6Y3RlGpPQMg6VJU5s0LIp84TjDhP4L+rkgxtdMOi609V0DnuUrbg4v308i8+W5mLbH6WTvD6/xFvdhijf5GbK95pQoC247MHKbL74lqbiKfIDlKb2UeKf4SbFxJfbqT5FXa57nRSd9V6FVGNZY781OWVIBn0TzQoPF9yVGl+9+X3vyvaKW9OozlODR+y4zZW6i5ayRqoVBRvPkwKXzfLBuHg1BgmuWtWo6Ta2yE+pIpddJ2S7MSypFbicU73HrZEeyR8IgKQpE7Zq5RDRzPIJ7YnsUBLIRJ+X3xujh2SxTtbGVN5sVZt+xcmU24k01h+U6KvBhOqxtJ7H6TklxPsaRT4Ymbw4NV8873ZZr3ugkXS2TJzT5JSc/Ov8at4eHY0Vtt1rMbmZCR1pWHiE/FgDsV87lU+2DKm812RRneTXQ0WYUY3RYp9qY7tIQzqwsNpYr8rK3eLIksr6PJMfuMJW4VOoEQruVW08KRG3M9tBv0fepyWekotgkYJTgotQkXeI+Tg2t39jHR7XBITHDVmXr5CFPLCmN+Frfbwy+TQWGWTxVvW63XVbuKGGsBvg9TcLsAdg2jRG0ZVDKOtS5OgZiP9nhn+k/EKVztoSAHL6q4jcgTMv1w8as1Ozs63kjT34tezpo+AOrilfzYnOCWjAetJsI1d8O4JKkZMuWZ2rYQXsAyGuwThqQNCUmsKPI2/HeYV8zto/gowLAysajaykY4YeaESeMF6g0Vy9St9PgGLXPz8OTonrBFAOMLuQaeNHcn2p3dxwa1xVqH8G3zM50ULu2qO0vcNMuX9cBHVWQjH4whk1QuyZ0z4f43X/meRW/NexQ30iUos0hAdUxOhXBail1RVDLQsqsJyV4Gs34hsoXbiwUiAMAav5WTgWeto8ciTJ9kt7xF/qLd0RRlML1NIpvXpie5dmLVvcMEU2LPIrS3RFfdWi3l5qsAF116Ej0vvO0wY3VZpSO5b7S+98rnQjSHiSDUyXTd6JIdysOepbQm3+8HFIO0g5H2jjT/+FHbRIaZTljJWyDIseRsdB55uvnZMziDYZiVXO8R+L3vVoY+s+uuoRG4grFTIEZBxBQ6Hd5m3e6YwxQoXSJv8oLG1C5R0wCqUDbBhZRfvAW7Kig/BxBmSeFD0QzykjRqPNRZVGBIjSQEGSx5/lVhKnz3lAWOf0VHzSZNSevY+Z7EfIve2ySRclqwT6pl1u+kkXuIZArumKxSu/X5PlMMrTugWS7PuTqfWQ5jeEmWZuhkdcE5GvYwDKCoQWy4CjBbMZ5hfzlqVINqXsGPinURyChh7JpR0V5h39GOlhAZNNaN2j/VDUeBwXALlzeLB/ON9FIxebNhaRwrYLJQdAWq/5SWwsJ5iK0+dfeaap7BCyVIE1U0NEBsBlTi6ibXaZPFqarcKQ+xtHMTSqJJWCUFf8E23kBWJnBWSnOyLSO89IPog4Y6UcW0PKSWMvyl5Px/zWCu9Ugym3k79XWAGvsmwBzIOkfKJyLN4OhSgaV6oXQvg5pFCBN1TjN9inEy8XCvCQ/gVs+lQRWq7/Ebo0CNmWLriqXf5HyQ3IO/+RS4Wv9CK99KL98ncWRQFwr/CriwSKNyLPXJ/jdFE4qK+khIowsNzQLSm2x6pdOQO/W5HHOA/JTgoRVxZh9EBNfHzFW5cq+eLllI9ZosSoCi+6VKIRxIL30vBYMt1oGOAoV0kEEzdmv67tux3juebDGLPxPkHhestwYZhUuVnDMRuXXxnt6bG9Tl/jCGVSEcyZPXswFYzPqBJCHHMzlkp/5AL/hcjw1mWG9ecL53Zi+HVbGgD2tSU5k+86BsZJ6VYS0vXztTqxWHlUXe6nUwLPXmeRLSxUHZPzk1V6TkwkawRCsQsj4pYDh6e9sgQhtOw96LUlrhu0LsjmwiBy/4H2Nzn9c4nyggZRYoWtlk1/ubXVAk+IOT5Cibd98FksZa/tuLrr+bAMky7XtciZy9TKfBXa4W9E/0mpz+1j/5dF3dCvHNxmlNWx5340tsoBxuFsGDllUp6I96mhwofbpsPipwlxI3TilGW9S3Cvft6LlXZ0awyjNEuvIM88PXlr7bXZpTG+EafuIctpGz4VQk5GFhwTVBjeSXhjQNWhQIvDYw2GeXN5j1eWXpe+uOpa5nUG5sSoEjhaqT71i37baXOx8jkuKnhiySB6i7/C+7S5xjjwOGxt0tw9AdgsnaJ0V2ETnuqoqOAO2VKULrH8aOfmKkFefb8366bTHrxTmkpbI1DKgb5PxV4Y28xtULEgO33uc3umrZDRDV70vrv9FFt4MXLd+ObM2SClkIlmXJvJ3lsFo5/od/3+s6ixYaWZ1VyI71bpK5jU9kFsm6xUF6eGju16tXTGnS6QUdd/tNOcys+VC6h4Sbrq516uR+Pr0ysf9FMGkktxKxNXBFUIBjavbSvguA8oQ0mraPXYY5tr37JG1F7DFmmr1zssGgGC47jmznhucMyX5WdGPrHGNGGmVBzf4M8G+PLPxrvx+sFb5EUHMIyX20HoRA86Vy16sYn7863FmSSHTmiCme/xHTtdy0gJf6Y1E2Z7YrRFlBT388iQrtXSfITynPFFucmeWoxrLQYoTaYWYHFIhEUZEnzBdP3CmyMJEUwGYQKI5p/lEJqr4VnUTF0dUQJwP+4z0iO3odc8spAx/Lg4f5a+UUoQTYpKGxGV/K5DLN0mI0B7ajL/XnRVSgpX12D31pvCajJ28gVVl2SLhnDi0e9SEkcAzbtd/ByHZOsovmHyqSZxWdDWtmzkLfLUL1NZfbO05o0o4q/GdqLEUsSuIkrn+jbxtAsXLqT2iSlJ8EbeV6E10vAV8cNPvNj4s7WRA0xQyp7C3nCvO+fChxOImWl4TVvcDy2fJjsTU6oEnpH4oJW/8IsgjUm5H1hz7P31FuHMHnq3Pk1APe1fgxwHiLSL78dl94UlpNp7EUtJ2rOAHOv6XOU2hJquXhT3Xdz4TWQ0KFngdegkoCgmOs+7CN1bUXaf8XnTddbEmle28IWEq/RuJ6zbicehUMZ7FV+0QmuE0e5kATMsHVFfI2Mlr/x6BzEs2/dYJPSqY4YzH4/q1qtXlOK0Sziafbs6aiiKADrbDcOVQp5I/f59+AZsP6o+QAvLgwTddAHXAfskpXLpPa0AphYIPGLpe71dECLAKhs9IZcrI13lR9mF32Z2HWmo6+0O7sk8cYuZPZqcjQ9IVOPMbzoIMcR8PD9x46zJehvnvn8Xck3Jm14Kep6xD2TK6eQjpmnknnrAs5X7QbSc4rIlLGFhqc+N2QPzV/FAj0iEY09SI5FaictBqvQqlJeZ9oOJF65xyYW8F/dH6OH5rSe9XTkx6anb0NKCwrwOOREVjIvamECK/8YxgResW+n4iPNnve8uqJ+aKB8lxbtmzpMwTz31BFK8FSSPi5b1sbUaTfI5KELd8h7JNPYqXbq26G6LuOeek0cUxpFQYF4nqR2WTbeuZJDhJpMf/aB8TOE99XiPNuLMmUaHc5oRqtfl4cGvWfpGgm96wf5jZsP30I43xNSDTfwI0QvyMB+fUHURoErzXQ3SoDrGxbVHWgFYj1CP04JsB7XLJc0T4ihJ0n3CXcj5Wbd45ArAD2yGn/dkH15mjYWdZ3kGZoPaP3QVXydR0pd1pFpElRhA/NGl/eJu3zqoRVmaO98fCD+WcbCSHDQQKrLZyKcv4YrPFZ/y7q4y0Cmj/uh/OQOUxTbsGSo9WR22tP/Wgl0qdMXLj2CaJpSBDG+2DGXhpJAK1iejynxEnuBjMsL7++afd3LJ6kJrs8l1sUtwn2ai2CFY6ueiKjWOZUsVdCTwJBZXsKtikr+tEXmO3Gn8r2FVsKGTmjO61PMiJESrj39plxbC0GfbYEb3Gs65I6ScHpurbKlhc9pEs9Uv0XFBAJBiY43801kS8LPie2BfFhlByFEx03uzQj1nj8QZI4w8xXbSOEgUkroMkhkm1wjeEaHHzhNeqjZTBr/oF78XJjsq5lYHmVprvaVmhqN1/uCAMwqW8WtSVc+rqBt/yYpJR5L9qSrwLvFkKBryZ3e5sVGQ11D9TV4BB81RPu50hQw3IQFujpmJH2ja0/3X91dJYpulQNcbxlyX7CNSQNfTA5VIcd1wQ46uhsZNY8vLqfsdlG9sWpj0KPteRUgCeAQSeQAnDQEwmjttL1mfPFAxfcsK8rp2m6WCKBPXCJwoNjfXWgHq4S8S559sdchZsxo0eAMzx2hh3QQARxgOVNrJo1V1OFPDMVVEuLN5opTuSQWAacY4Xsc2AxypGPY7ViOMsR6qfF5LOxqyEhiTRl0UPd+Z9MOGeq5EpKIZ3p6e8/ata1KAWu9p3uIiIyiO26e4xbXUrWPcSKE+dMdISQOQ3OwIHA2zG5acC6IAKyTaucTsOFsaWeaGilqdYnwItDt6obDG8tIx59oCONsaFr/wbTZjLUBQmooHMO8kCV2+t3qz3OzjiKl5sX/Jf/XtCTPpZuOStZey7NdYhkPSUp50oc8Yu5xLPr8L7s8X72lgBvGDXvgisJ0JkMWZfjz9o7F1JYgvznnOFwB2qGPT21MPbbzoNzfiF5zUR7pOdFdY05AoDjjQGvYKdnQdk6WhaoTcH5LngTqVkLHkwVteAm9ahGvh6ch4LM/E9VkzGpkqHRpYbFWbxRnk1S0pVHgA6LxMCwTIL4fDgiWD6JoVYzDa8JtVMPD2m/yBxExedUuHcI4vV4KPM2QXYu65f9JSV7amsp3nDKo+kX0tV9Fs+rtkbVF4rX83vlF6KEuS8HKaRlaO5iBTsa4q6ty++uiqWDPQuZXX5oxt8vuNkO/ufpMBZtmGjO01fsca5J4qKDvnIswyzs9sDZvY7wOEx6Io3BEkk271RykYlsMwfVruZL6397mKptW6LPIgX8Il/VgrohK0DS3dX+6ZAZgyiUJHK/K/IPj/seyMd/nZEuP2Z2p1f9m+U24FQiCuAg8A3Da4ow1CjAT9WdFkcSRJsreWbHzDhRVy7UoZXditjSypC0PmVVtWM1n/DSy17JblArsvmNozqQSOUE/ksqhKPgOt1z/q8PXRVuXLFCBxDYgMZZSR/pkHHKbVGd/JPZ5QCcUe/387qoT71oZOL5JzAO24hNn2KyfBGZ7RaZ8c+2l/A4hR82MkSvd2CAn2E3TqursqUwK95zYhTn981CdgL3MOWplf/J3PqZFqm2nZAUvs0kGwRzeAnt2wLIjXf44Hz9uzzd7hwXHWaJH0+c2YN5NW9+536hscsjZXY5qNzig4TFJLalo7qHy/HHJBTOySs3FUxwMNMLr0C4/mQqbt9n+qyi3NKxojV0BRkSPsbsUlIhrGhTeylxY1HCHYDMtRJcRsQih6C0sX6tEP1gtTBbUmSoM/iPW0ipZTOXn2criyCKp3UumDCP2Gn+inGauzX4STsxoLowQl2lB1W21GtcJU6rwhdxojcydeyRjtfuqrTEl4D90ttvoznfMCSmGp8losEEULhDHTYoOzVJzU9RoAdUBACP5VxwpbiZd2BXYSQmufUmkNKHAEPQ5TsVjFKdYWsUrOs65RrwryomOhQB3AxX887Q24tGQG5ZvTj2nCHkplr3x2ZXg/RtwINYYhKnTJpRS8QIMLWfT8rrq6sNKKWT02CTzfnm9Jkn/ulUhv+UnruCwvnAV81hYjeOHBKrzXKhkQ03nmU5GFqaTHonnDKv07XuscSoclL9J+WcCv5RPYNjmdv2JegHdNIBZcAjx0OPdmQrlYhAmlgE4+EqHbXXwd0gUlL1NFfEvoCzlbPA1qWyq4gGELwpb2UjEslblDFE48UY0c2JpojmS4MNok9e8UZfF4B+Zg2R0hslz8t3cCg2HJH993OdkCKzQbIKIk56tXWZa3+6wLJLeVoQTHsw25o1CcjAyA/061/wjygI2MSvk3VkVxWGbPI5aZSZ3RBbOZEDJwRE/csKt1BrX0bf9UYCN8NcKpt3HXCqSlfh9EvPIOC3BQd0lMVxNJPca2J+stEP0MjTSEegUcVC071ZFqnZlDFuseqhxB+IhuL/u4DiLbmKsyDdkZCXjsaY4ZLSZ2Wo/pb8SKv2LEhDpNF/kfjgkQKmld0MQqg6mNA4l5wyeU8Sjn3XeK89TZhY44augUV5kLZtA3o13yKoApdG0jEK5hix0CWa3DrL3dY3S8gPXsssYduCDnQRCmYnibsBIaw5Q8NYzWnDD+AuWDGHlqD9AttRJlnaylqNuYsPx2GE8fXkiPkfQvBXlopHrSZ35GGv4RY3v+Y/NJRaf1/NEbtRonW3hXXCikVoskp1JVoVo6W7MHZ8/I5A8UZ2VTP7S6NbZyk7b7VCZhmGmj3iRby7PETAHKlZCkqUnK/ipO/hpTBuJp1TffzVsaZdKmxhIwf5TRMVDxjuqG2WIeU6R2NjT8YXRd4b2itGXHDY6jcLYVqWN1iP4TlZjCdc6hlxPr8a+k0A7sg4eYjC1xyFyoBP8cxoXuRnhEWDF3IYQEQUNuXx84OySjSrY0gpIrq84dtg/a5D6DD6F6tyP1OsGKcMt5I9pNR3XN6dCWEs8t7xfAuvFDJRS8IOuqEMXqh+8Mi2IsPGES1TwXptVBqNcM9TH1gBEPCx0AY7K5nq7Dthxwi9qABCCL7v916+CmVch8ZrMy8MldCli5DH13xeGSyddQOwIOQ0cEi4CXOFr2MySEPv2yJKutJJ1uscYV1NhvItel2kEUfG6F+uKUhk6dVmV6uirBtwOTbe+BMLrP9SgU3oBFrZw2XmfIUlO+QT0bDrILq3U/iLhkP3GkFBDVgJOIQOizR47EHabTc9B3K0oXyw/bqs8rDSJG775sEEWIuvf+Nw6Kl7k/Xo1gZxJg3GI/Y9w4aLDlHORduOs3N8zZoHPoHvsUY7iecQK3LuqJ2/AoZ3Wype2Y6gBrQ+TUVelrSWdKgmC2sfHKeuB0n3t1QpJwmO9r2MyIujstTKoBE3/9kZ+GQDWNQlBke7f/5ib1SI7IAfiDtT4jqQLZqY1723uQxttQMPhbOUMp/ldOOXi+Nta4EzG6H96JZ3UTWcY51q57c/T6Hv/7DVY08lcBadoOlbKOo8vMI0p6uThYbj6+MSnxtzj7KvJac5giNKP8zhJArRaW6cgl3B4S3If+/fb6MnWfIfyjNK1II/PMPkg/unT+6yV4G5TP/Q7A1KNy3EjNAiAEoA9Ln8bcaIc4WSawv8cS7dVmn4iS5AH3Cgy3rNCZ/pWA8727hDiWYHyMPQ7U7rgc/g4oVFHCu6YZRbhDpy7JPaXUdAsWzlKfIyp/ezEcuXtXq5p3fFl6lPXB76EsPwpBAWmIXzS3rg7T3MFtIvt1bv9nXfbPIJEwY8vyD6104CI6Sc2aOccyEaOYMiE5rCWVQzseWX3PrloB/ogkcN0vgv8UPA+Mi8uCb98zKoWSDRnpmxT+3BSaD3bYv/26TT/SMvuDgAeeiqEVNEv1DsoVoU+H1sZJ8v35ifo8/9zZ09xEpTrVdJ+zk/JHZCAEPk1lmmjqPSw5HRJegEhFaTJnVgQ0lj5sn3yF0rXclwaV38jBrsPiOnzyvReSpAhkrRMQ95zNCqsNvqKcxTPq1KXQTTQiMHYtoP13bI8OtWm8dV6Ubenj4VXS5+2uk0/6aXkV9XjbEHjeJ2eqqwlQBGrvmnsz56QHVgHpPTd9jJIlAUM/vVX/h5UBVpYVPHWJKUWB4cb9HK6oFMQxFDvQoP/CtY3p1h3HHJDpcv614mmgFvqsFTcI7n0a5+SOSgvcE4ArGWWB0qjRgN6aFxYYZnnuoI5EYcaxoOgr+emlr9gVtqmZ2YYlJlqL68Zlq0D7E1LZq7pscMov52bmGkxZ0M0y4Qljrz54be0RABUskOumZCA0hnveMSgV60hXn39Cwwok5XkEfaUA7IojSiARbllafIgkRVzos3HJvHca6iE7TeUV0ejDQHvxX1B/RRITktQ4uRUnbugsbecGNyLToziCt0xuvi8FR3h1lPN0l+0v8I6qiKcKsObN5zSwiz9haHb3VZzF8wGLp69nioB977/0+SHtE3H+RzXeh2UiCNs6Ub9WhluajP8v0HhAVXk5iVFw9GjohhZmg6HT4Nd5sJ5H1c4PQl7zSslDyniFcLzwZ26+mBmVXnx9tXeLxF4pLQ7i25TwS+LLdwzg8fUAwBitq8xmhC6k6yh3qCBCuUSPDVGfJwlwoNYZ086wcC6GorrYxK7mUJ/u/XYr7/beL6z19KB+OXge8YLEYyqwCsdkFyv6URXlEgnItV3wUqE4H4qS7ZT/nExdsbXaQUdxPIKZiKByhpz4fnpdQw7NtcS+M6XkDH3DtCKKiSPChJd2zqs0h3HaXbg1+JDA9cRpIe4KIqQ6RM2UGK3X46UiHNb57rVI1Im8ccsbLg0WFEjgkyUQeXPAmpCkFrbepeCi15Fna5rzJB7FqSc/GMRCHtDSWRzQJd9n7LU3IdEQTqS6HPwpSwkosCMPdHzaoQFYIHnzxEIudf/QIaaOYiREteUu93AR/T0nOuyO2+o5aFgz8YcCcQhqBL26TBlxczygwcKFsydX0/vwdI10ZRXYn4VnOTZw/hce7ab/KziVhL9qE1cKi8wcafrTUyAMGIWMJFFtLZNkxrjOgk03AtzhDmQTbjSpRBBlRudV0HdFMUPsfbNrctuIrsFN3tJbV6cPdP8MbEAYFV1PSfZ94wP91GxQj5RF7qvZFn24AbB9v9NIBSlKZwOOGn5OLGHVgwEoOklehQmoPisJoZ4OlGmnllgv81NVSj07mMANI5R9baSTfnUH4mMbRcsc2DBqr/DVkLBd0taQi961cB+DiJvVBR/tcnby90aRzXQ9DS+WVxWU6vts9zYBmdSr8RuYnf96cw8qVyVFruNUdLS8TGfjYXw3zPFJtoV6v4Hsmd3eBi8PXpEK9z5pCBOEHqq8dWvxAhgWtEUaCAFKxWJioxnyni6fkL0yNwbH73mVbTCOiG6Sfd2Gc186/GepA8BMnPgF57Hz7CYj/0tCNQIkuhfF9pe1aH/DmGOr4tbBZK2L86d6ZgLsEpAXSm+YcBPi+nD+DkDXr+oiRrrgYSHjSEYZOsn9LkDR6yL/PNSCvkHxVAinDuAiyl5shtCjOl7aTi43IUObH1yDp/FOS4YTOf9KXWHcVb1JlahvW5HMXYIu+FwlaBNLoOSudGn7Rfy+xXPGHU6TVsW7y20/rQKqnSix5TgvfMufvGvh/QECt3SxEYsMnN2ciej+hSar3pqZACYctxQRsbP1TzzPtSTk1rPeIiyIbd4Xsqp3Ad+C9I8VlgqRDohoKEH3fyf4ZH4c2VebKOlmJvKUpgMVKhPoxMRx9E8G2ZWdb1dyfhwwJuCf66kvjSYk/GwNQQgJ8wdnoGZvCOzaKNpCY4wui24DnMha28IJn6JUxj72Usz7vdx0nXlq/lKetX4ykL2AYqsQPO3tKx18ZcCRTDd6kbghjjffaw0u0YKvk2AFE4YaMA0qq9hgmXhItf31x/3NZeXuB4Q4YYV3+TCUcp38u0gb8elOJU2A+FhEEzgJETnisnP3ZUur9aooq58mOMl5BgZTAehtviJVEDZKegdLdu9wTZAsfp0ak2Mdsmfz0O54FPYAoNEzlNCLlXhF8wHORD4nfYG8mSt+ytjtTzitTw7NAhjOW2EGHYWxAe/gVki9WgChbEjYMAX0RiIiE71yHw1txN8S/9LCTrrlRKYd350D0PyQbt/5fjgIspr5aW0+55naNy9RjTjvcrkRiuI0dj1+L4FKSpLriEIevKvgZFR/SY23EfoCC3ArwF0AYxD0PncH5Ww7428s3uO3qhjgUVhN6k/Z2KHjdiRKOJ8yZkPo+Y9vPU4MIV70XkokNDvZcjM+eNACIE90n4kWI6SdixQvfG4dWYDgqUs0Fs75YT0CjIW6Alrc75ERgiBZtOQF0XVX0Da+deyJdtPDuXTR1cyO06t73qVq8YKbNjUFIc9XN0mkWPpB4zhhFfg1/DwBPj4fmnotbbwZsoyfxJCHcS1YgP8Hhg0eK8vOXeSUqmhbFlNQB1nPgEq7NfNyduVXxctUiCvm4RHwMLpUGTEiEIy3Io5kHQb/wE5y0dhuaIGpo8Y5JpLMgmY0pp9aN8k6sOT9ZJRMEzXtBRxlC7vSbZkJ1KoOlHHeDDS2Q/tBq5cI289xEy3UN93cj/1U7IkTadXh16RdjIuwPLQ3AwgL+HJ2Vv2OidXomjJqkvb/PYRO5h6i03wGdWk2wIwkOF6f6v0OKo//bNNIq6v6UFogm1qLVQFpBH9ApfG8zQ9QdjY0tgbc5IzGLK7jZk7mSHHJw0HzbcwR7DJU2QwrAZwB4/JF2kwkHkmU0oSpwfp9Ozjo7KnKymmD9CYJWYvhdMr5Npk3Qg1cbk0+Ojr5OnwDFEbGLfHCmHhual7kYiXkStrF965zyaGtgtyoNivRePvrwppqaKpxssACaH8NkWSvShz53nkFwXe2R4bTZmseVVKy2CBjghjCKVrMWHZ4nb+8Hfi9oUp949qCsvSbmI7+obzgeLhflM4l39cbt9fxU6GHbU5oATPwMjkGUwNsjIAYw8g/+sQ5E8nxvT8FwaV8VP4KBw70G7FZu76/3ukdElEKvkggjLIug2CMLaDdMxtxZpwrg9fLBapOSzxNphtiHcln2YTue3I17khYcsuvyHyY9k2sOHWagwolHZHZ4ZdzKEPA3pidI6p1rqtkXJyNce/Bj54x6diaEC2V/TOOEi8NjO9AiM777kH2QFEMQQCLPWpPPGa5htczojkqTp9yCwXnzh+atPycK8uPwwKx/XFJs/9W2OpN10uv+Do0E20tWiNw8vxpUG9RcFcgJNbrVSsJLQwpMAb0mv7SjljcMnnd2ew8IG4FjRKWjju2VOCgY9YlHN+w8HW7RWvvetzPP/ABHQhCtXipdCSekswUFdmQXb5q6D6p9KRE45fyy4B19YUl/4APmqR3C17VC3J1T5jreUdNLOj6XxKUp6syJZq8Dm+fkqQ3YeneNtUmrqvxLCLoLLYp8ZvmPPLj7AJ1g2X5i1hH2tTBC5ZXR09uc5kclPPEA1cYuKLgpdEmhL29+sCib9yyzhmy4ziB8O9GqWEvH/LB11eymisgJddNlLnaylM9+HpGernXcqx7sdmY9UoKV6dibcwyqITH4CV2wRrkBM1sgv7m0HrvuuvFvLjFuZB8e5QP/jiaITspiSlEwjOOVAPDioFm4wbhCvd1xOBC62nxx2jzaKUi0Rf7TZBPw0gNgKfjYL+J9W87YTiLzXYBiLW51sKSvd3r7FZ2hhX/zZlY+xF8vA9Jz2JkrcDW0iKTw52jTeCUlGxCmqlcAhtOJqfswhMDA4ubzv+CP1yB+g1LIgPYT7PA53qrA73Hxu8B9pZeivGgaDGQl4f9pfDv16Nxm4f49ZQ1+kqrTHclKVPKem42Oa3FiMKUGNaZS2a9GAy0EQe6abZdf67ssDjSFtHEN/P/J/UpFaMZuJ8Z48rdoLF6c68dMW2fsxERk2t2P0fFX6oAfnn0Ptd+G6rCilOBiaomuvNLgLtbN8PcFd6Uk1Ln5Nkvb3LrEORTf0QSUx40Zkc8XOPrLSTMACvn5UdGF8Qffr/8qOafYYIfl1GKvM+UK0edsj5WbI51a7t0LR0GeLFf9ZTq1CtNL8tIgDbWmmYzUzKnaRXYmgQG3bY50n1OWHE8ZSgt8t+pUgN9kVnHAi2e0LLeyuVPMqMdR5I60vwq7qfzDI12V8ra4yLXkMuRGqN01jPUw8005sSSkGp5FoIYGh8FRZdlwHXeUuM8CvxuqznA97yeVRIxir6EqumFh/OkCoB9JylQKDsP0q6rlrl20e3gvnQSCozbCRq1gWkeUbtqdLVzaeOOqFyMGqd+fRaXyd5T1SKnFBLeikbq15koDvsPfvOExvOgUUoxf9jhDrqCwz28835dVL5dYcCXUNWYw6wynHEINUv5yBAEUXD7kJGgYUU6DnK5L4eLXIFV+q2iPBV6HOP40wOmlHPaXocTbMo4cTTnn4WpZoiPPfXcgBnGhcbrLy62lFAil8E6qj/B3rZdrf98tEws+EHVVzcGGTHYHIEw3XgYQt9L02v5fpKzfFPh/bXAUGOMVuspqDNJ00d3O+xCOZhUnpAJd21TKYtlNiLy7qePYsoW9VKSi8p56T6lQyQ9A2Qcyv0/WgYhQrTbdqOrC8VhorUNrHx3wXn+v/blf8E2uEkKSyybXi1NB75eJlLrXqfkkEa9ht/BmxrHkO6311Z5S/j0hmxE/5OUC0otXv3XF4eaNnCbf1RSXpo0UJd6N0LOxW9ZZM+jkwPhZaSeBqZK8J2Kmkw4lg1ihyFRseX9qHlIIqUbeK+ryIoU3KR7FozvqgSdXNf4Mj00Gx4lEbCyzB7qNKVtGt6bsYeIFgYs9m+Zu9WOuCvY9VNsQy2WtOCCL/MN4L8OT1+7o2M6PKVYCcWKIHD4MbM1raJKdvWtAKFILI3PBfqnCqAc7Xm8yluA1sd4OSWIHycT8MjPBCBOwvnj9moAEYcJK9bqCdU3+XLvY+39udDDqleQy2GYICY90FCbGWs6dKfD8nYo1RmqGIgoXT3Wmj+GbMAtplclM/YJ0RemHG5YAiwHP1/Bgyo2hp8EAEtH92GIMAeUSOaJVZ6+ZF8fwCL2YQWcq/LE12k02uTwN6uQXN2IaFSPMP2cW/EOc9itn46KVzBYFLtCLz9f7CLMiWKINc8DvGhfa4niOCTXfnpmWOu6Cboq8XkHzy16F6ylLUrlxIKFggM/tErZp6ySKJnlYYXcEy2g0rJcfGtSimdLSF5nMvQOWxHmhVJLr1tds30oi/q8GpllF0DMejeKft6xzlPAXbXaBrOBg9eG3vepXqQ8eckV6DmJwPGteKc0LwxrR2VGfk6vo9KWVQxRzm8uLQZG6znGMjjmmxffYXZ12nZt/ZyLbUvoBqZ2gj9ranH6ySQumGVIw6PPKubYrqmjGgy4zEzb514oYYnuTV5jc6U2Eg0DEHQN7lH4F9aVoeAspEGraDyTi2KuaTUTnO7XfKTnf74MXt2LjXaham1WNNmEKa7q0SUhRphd1+6SEgnO2bquY4/oKc6i7vQ+MAaBJgne06iPqv/z3dHCrpTpYvAZGvV6WRBWJV/vuXCeLWu39rG2ThAu2pGMmXiUhJO+sdXPP7wMbIBjZDYfUXHrAxS0Nnu4ZVgpcvB2wNArEvesbMAPdIo6fTkTdlmsplZNGXZEn5E81yZ8bvnyB4QJcbeGMv2kiv0/Ox7opSLfaxn/2QZIsFBSUPJ23K1QGP7etHgrHYO1RsGTv/4UkTAOJOJku6rfrDWVzwytDJgCoj8yeJ48FoR80DAKa25XNogdIk43yY/+rlpPWHdk+OE0GtMzrs9RWiw1pcK0HhOT/l9Fci4ATeqtVFnMhz20joGxa2g34tEPzAgp6FtBxVTpYW1o4kQ5RTUntbjDXHIcZsFzZ4YjVDMITbR2LwXeqE+A/wHVdI4NBv7p9+v1NBqGnMf13GDHByClPP5KXxA2091Z+9qiPOOCjD6B048shihM6Y8UksQzkjEUAxmPs0A7c2n6LqHcvMgEPV1NHWfvX1I8mVK1gMSlzcsLn4DSphGDSls/FsgDRUPoqaEoJw6PJYZP8snF0TU1cXZP0gPj3Szd+U6YuD6/FXVbFVkGE1jwz7Sg40ASJi8fJg4++Yuq5qBMFko78SwPAQ7t6d6C9RzEDZQM7C7cSjZ6MWpOag8eq+0WcOB7eVTsbuu9/igGg1z9jwEYPe7MHc+LUsPYZGpc8EOk0Hwy5YjKjbyghVa+PQbXufH8P5qOj2VBPBaJFShZf7RwySaGSTMNd/FYq2RczFN3ahnkP9UBIL/16BgQJOvwxy6R23lzVrs/HwOIMidxJPyT/O0qEWpFot0ixmYhkvUsIEKV6D9A0S5YWbrFV5r5u06Y72hV/XsJqa+/Srw7sKJCvsYkH6raEUpV5h+D+5gZ96uXg5iZBepbw6xjBIeQ2Vdp/BELs/0I0xDYxA5fwCmDGiRFlIHDnspIj7lhsK4MdkHv396jxWIPMdd6beRJJj60QPJgZ76YXUfxJIm1Au8Z0wZ+ACrZ9A4CZI+XwJLfnk1P6CpafWn3h7jp0K/yHfhmRyh87Z+drohNsHbutXbqvvKpsgJOfH5c29Is1O1KHJOSLlL+jozrzWyZHmalRwW4fZ6XV2DB5rFV7GhTcnX0zJpw+eo5AaJqDIsXssU7p4ZSVm+0/fCM5oSYqlEOnFaG7UofZp1sEu1xaGLRONIMcf+Kfdrr1N+jIBe3DcteAmYpa/ZUacEWnXTG5uQi+UdznXPh2qyr33vl/ltInHZEySUQR/jqGrmbjpoORZq3VscE5Emjoc+No0xII+yCjOdARL0C9bRCC2aHFP+tKq8fWfS/7aBAzKO/YoHv739lEj74ueHGX2Dwk55g9f3GH5fmwdWNn/46c2Jm3MlUM+io/oYsxJBvey50xHgN6xNKYfAIZ09m+0jfRGDGK+G+mOqMCew0m4CqLDjahAX6kg75Vf2ngbajSuyfJOUTDUiNr9DH63bqsOzSuv1NAsynPgMVJUcP2+vfNqbzzHHVDW8rWEEeqx6/XVfBAUz36E/QN6b8SjuZZ2J2l0YoCo4cVsVG+mnYz9Cj79L6Hv39trnRZ1dDA94bK/7yd8JpA/s7yefwJ/7WTn2c1tQJ4JhTTMZd2mBqEv+LHxW7pAyIJJzyVTa9H8sbucHR6cvgdDDEpF1b8MXvj1z58x56FsW+wLiNsRCJZ1IzBSOz6u3CnzvsqBPpTgiz1/L7e3mxSs0lt/8ha2OUwXAZrBd77nV1RT4+i0gFVlgmAqnmwIDgHGjtcWNiYopEP/E84osGxkLgZUso/AnzBYRISP2C/LxcWXorVWBu/t0WwxZTYzmXnr6osAVBZt58BNIgcVaFyQJXdrGG9ogDDo8X7w4iR50dOxG/raGnDsgm32EdhbNJsq0ZVqDSLiTIvfVz0mbgL41iHbYwwxlC62LcqOpYqzgvskM2RSsWRDhurKQYb2pASJyA22O/jr9EY5PgWRMa+hOjQpnR+LKazvRCo+ED2bHH7qJkLTxuhxSZOuw8ZHTsQT4BxdHWSasZ/hN1ntfDHA/LMNHZ2dJk6qK9iESSUXxGno6/3jNXFeBimxb847RTET09qCANkbUwxqDL2Sp6Sh7H7RSIew0L5N6b7ZIEwNIP4AWlsOcSY5/6lCNGFtF9NWun8zUhA927TGQ4qGLkOMteybcqysXfV6NBt9M7IEG7Ggtrmnpnikam56zkev5M1bt8YHFm7sCNbH4vMGToDp3OFX97K5KKsYc7RgZRNW93IoMCtex2TzObCdkqhkaryC9/cPVJiKUE/e1taTtuxmABbRsR/F7Euq8KeXj+QUlpBTehmBXyXUaTCPrTvl0DiyfEwH3K7UXQgA5A1EXxauEi9jR3V8+cWVPR7aGPpyBBCd1Gqw3XYSqQKp51jY2+j4DGlMBqaBCb2Kl/X5mjvwrnWuN0Wc6a9FsoVW6tPMULn/GJl3CeFgK/eJhXzeGl6XzDK/X1zgGJc7/VH4LYagY55pIwpjBKfwvChDCbxzdS0nDKtoq0YUXoRslSb7Md+syOtwMHk20+9Vwc32/raeHMk/LMitxNQDHBTDCPrABljX2UvtJs1E4Pp1pwnaLP1zgena0QPmIF0v2mBiSkUmnvlOQ7T1NNQ3HNq7ptjNQfhakhZR9dHCVz30AU3fCTEl7TAlXgZNJBRseR07iNPolsssvyeIryfjW8jbl4E6VlldVHmKQ98MR9az1XrcYLz9Bcev5x+RGLLsdpLEPo03MaDdMF/3MfUdE4cog/g+inbJ5q90ZhdwJSlpWJPCGpm2a3hGE4jIiKn/tnIr8IvZWonLyrDoq7/a0BGhJqsY2J+bjFGp1FTss0+7uCXPEkiVwI45ZpZdMF9wKOYdw2uGifHdh0cSwx/tenP9uRAhO26RY70YyqbafyZpvjX4Lapxti2tpcuURrdxGXOigCcMZK5CG3d4bMOl6OIZT+Ax0eIkQcPWV14pJBOKBtcPAVNweUBozk6n//SI/kOMxp7wFTuWW0roT/c+zmSGqmHn+PHOFByb6LrPIdq+S5JB3ed0ZypYPHUeKwkXvia3NYniTOb8FYBBkGsyPb01ClwDfQpT47fHOEwfchUXWkCmuxdJYGFZO07+qFFg4JI1+THFG9elB5bGYAo0sRJdn617W0n2K5mm/RQCr7eq2zeNfJRAQ7i5B1vUqzhlieomSpmJdGjy/rEI/K20eoPXfn9gALoYnrQzHSsMeZjYU3ktDqYXRcm17jUqLbF5m5piI5Md1AP+8Unk+dJhhZpEhvbriRg0iQHcBXnNk8RRRCJUO5Qy2OtFcCjcRdON9mX+6BYnv/26C07FpL6XyyBPbcPBoYSxxwpB7xN9KC3Y8P0coFyb74XfcCCp+8VMc5UqKaMJkpNGSijWk0HJpRgYNTfVtfTO8BSnikEWBlThzwjzHkhAimU4SgYyhQl/9SBzE39qRWtVlXBL23BM8BJYqE5tFn32Uao5rVurWuUdWVWXgLGKdLFTGXE+MrHzmIM1MzDxQfVYG802NTvz7S1SloYU6yGuvFAzHYhrBEFjgldCQfRfJHRfNTuBhCnfRYafq4xYXDjVaY8rLrIqnrAgZ609kcnLIjzh8YE0p5j8RQ0uZw5BHtKMnY69ZQcOlhXQeDHaEW4ctbsZaxqJMOp3onV8Y1VkMFHHvZg7b3Xxe7R3WL01QZ1mIao8fzfgckAqxbDHXY8EZC92TYzbq2CPeIZBzXd6F+xgBRw0jPMjhrfLmNQ3h/b65nd6Upf/nrjxm4BhLSu4/9u5QHl+kDMY3N0E2/iz3f/RpBhC1SB7SBHrmllnQ0uENIzvgTxLLBGo2mxpwo90/TfhXT/8ZuCjrDMyOGM9l29UevKRIlxU5M3yO+UXIBbZB9R1zk6/8jAkZGPxtlQosjp9FEYP/bb+rA+L648oNLABOYfXMlnvvBdtYeAOkgTn6EswST17TncMOH6r/R4U1zA5UkHyauIySY8weS9M2ShMPedToY7Qx7A0O0ihUsrqJA+SqPDNpV4SXK3gMQLrbkzTq4NPb9sDqeXXha7Rqyfg3c0QrdnFD0SEF21/96Nm1OSswU0I6ISYhf8dg+EBAdNlv0NFRiHmF8ba6aP1+mzU1I++VSqDvkStgGTzwo9o9xdeP4wu6GlvecI+GAXGngA+8J6rxnYjhUCZMpyZPDPfYWJAcY0Bp4hLeM28BH+II2ejK0WTlja2ItfwbpQBOTNNDCEAKkLX033lY4kxLJoAuC54DUC/fl8Sb0ar6J9TI0byPsqBNJFmEF2JQ8Le0CVV0XQHPjwxgr8Q7d8fYm1ilvpbjxAiwCSEQEnF+MOLCuI5nVycWjl4+GoTRjb8l10VFGUmqbQPe1bh/M9zWaHy8DhI3ZGC3WT308WhcRLxAH6Cc0qiqZvJ4d/UAUuw0xcujIVyhxnF39yhcFdyAHIve5zSWRttsIRcdBU4ofi7luAjpv6vUwthhH7syqz9RHTTyEZcbXx3y6lrkOyPFxgcqulWSpH641T7igG+TtUnlRSz1Whsb2I4TNcZZ1CSvYFCn64pI/jwUXqZnPVLGO6ML5U05je6jcIHwjYwV1NCllXcLbOqHTZDdevQbZy0TNmAbfWlGgm5ExyZCojHksyYsS0b0nBskrdn8fPT8qJs56kwlLck1nH+k0MSx2HuYvmnpQ63XTDnSSKhIbWqC/Cejgj8Ij/UOTXB9vH8HkU5J/fkodmLjTIT/5n/eZfCPp5nmjUykQgNSj+RZg3T8BPQviSASwhrKa9l4HCSOiqBy8y4WiCTaRjHWdNEzZIFWf7BI7oNaBCYmPq9KMjLcr4enagkgyIMbwZk4z3IM//O6jkZTNyaP29o3+ijcURQyK43WVsSRrpyT5Ds/k1a3oJK4HDxSN6cgtcH8sNtI3Vx7K9ScPuoiVwA5F595062NJPCAFwA+jnEmbjBiVl778OU1Ke8xPuCfYb/IvWYyqUutRB988Tm/r5IcbZphscNTal2TVp4+Ditv5IqSUiI2+oeJ/8Rsc1oqkcZ1TE63SoItkHMAF6/eto8sBASg/xTsm6jLnUMlJBQea+NyktsBQ2yTO2Ymg7vuIJTyKs3XSC+VErgnMNsNpt0+Vg7hLO8GyPGIM4xmMVdp+DlCyLqaaNLDPhVl1EGlzPm/qLQbHI7uGXmR5QX19Est2V27dMzHWZzDVp1w/cpCdR+CcDNAt2gjFmeRZW4bZ8b5+gLZ76y6Azpwi9vzmxkqktcG1SrfzT9sob6KkuONUF57/gJIPPje3B84yrwzcQbNLhaci6mJuSvM5bunnJLshuhBuud7kOlrWERCtPwB6hElpldimWYWuz9SATvQV+7td9+mQyg/aZD+aTGnpX4eCNY96jDkhXZNx5uXzKt4hnU7JpdZYrTY6lfEfmF+guSGxp6sAvIdH6EaQXTX6KfDby2cZKBPnORmW3KurYPHZMxGZ0oLz1k2kntYhOcvjAbq+Wy8gTu1WSFi5Alfc5J4Ry2ral8SaMcTi4aN/I+wBAOoA2QiQUgNOZ4S1v6BZ6sKp9r8yDEI+bZaRh0EnCchniQw0jpkiCc5ZROkB5CUR1cDKFwzJKJ37InzFls59US5c0cXF81gZMrOIehOGDUq59f3ZyUoL7XsL0pIT3K2oDt21Ut4JjFtQqXGr7ojqzYKXq4072S1e6xhadP8qgcFlU3lT3VBU9NJousQocd5My+H81eaFRRavgpGVbzPFJwK1vDv7LMp3RGtN+cMq0toWk0NDL4d1eLiDbCGPuPrcWk3aW9e4A+MjmTQA+UVtAe1kXi7QTahdelC45JMTLqrl4i9cAEEh3VXfB9xLRgVKo1HGGg4dmxjKwbXm7JCrkTIwRDzZnDtIxSwa8Akc8bAZF765u7t/JQRwi3R3/h1AqYSh7nMs3mZAaBnoDynbWDzOUr2b1dhUUVN6J0kqevxBwB3t3/YVK/26yFVLtZik2HP31uByi9wtqkLnHQnlWEycmRHICU2QAF3vdRnGqKIBIcyndhgR3sKG5GXDpgTJ0yEPs0nFUa1oenQRG7jleVgsLYV0W9KIuOombn4rIgy+KUSwQJcB/dzsWQx2cf/73HHCnMHFophZ0YwzyLwxNTeamS9DuoDQBm22p7TcOo6Ete5yz8kXvTo9liQtf84B8GAXjQdIbVLz74dm7MGcuBvL8rT6HPsmeZRUKGFOpPtXyJr7UEsCYEVwoIOlj9CpkGmyqSA0M0SGnmJivLNARReUahbAO1os8riJ/j5ABxc9f8OBEJxo0/IQUCZZHqH29DE9k6kiSxkDwhvY40Fb01NKNurxyoBplSQ22K9YjvsvE4TZbjK4eaIAuifbzhJ1/LOzKnK4xMorYPahpbTrjdLVWxC5puN7tcXYOj/axyc63Iu0wbO2fjslaPQiv4m/gT9FFiPwk4OCRvn3gd664aeZEn9gF8ONDMoSaZ+QpZ1tSn/HgyGpi78wQ8hkPN8hkAgdLoZ33Wutpdm5gu/dCpGx8wlM2Zm4Mc2n5iRR6l37fstM7P+acMKnzsU0+/vGCelp+SgXaibFxfYYwanXrlFD34lVqvUP/5fVNn3WZTTYALov7VgKITEFJthigFbfoMQA+awf5yue5KxLiEWfpoB84B2YUegjc5fyjeY4KfUcSefcDip/E0D93617P8I9RRWPZVx4kkW5K10JCbYxalq7+74Hx2c+FoblfKWoHze4XbNKLdUyYPAW35MosGAy5Jrzm3+4nCLO2r8i2Tteg1wLokzVMVxjZweX5IgzpQSL1eJ0QtwzHZlyUae5OSEBCCaybiXcLUMielKr7hrZL7pULg8r+63c3PrRmAJucP6vBLmelmajcX1g08pCqKQfDLEuscEaii5mbdZVPZfZNabVsVI22pKNI5Ixdc4XmpAOYsMPeEqB3Pk7TIw1QYQtU1rlAIA3lPzuFf1ACVGKGGBytCnEy9w27Yifd/RQjNeE6L5wRB3kiOR+e5u6iG6k8q1CVDwmA22RzqZ/YA91M4ooo4j7FbWAF/Fl51smAOozmnh0McwC86NdpbCw1Nj0cD0Co3TMRVctoypzuT+wp/3Lg+vwrL0oLXFF+Bff8g5+BktScksLcg9EZQQ6vlFnlYEM3ccZzfiB7CM85RQ1ui5lcAlZWL9CbrWUo1SKdeDYZ9sksDe1YnTkgTlXFj1WWqaSXoMj+7RT7V6IIz40HVkgXZJKXpjhQvJdeZrFt9BwJcLajnprfrxXN7qP2DT8Gnzm7+OY9auf3LQUmD5+jR0s1HzJGKnv3cDJ4tPfY9xeF2AFDuPhFKv5uwMgF9FhssPnwV88Tanmyz3PYEnrNv4wzfnRAoDGXAiFJJNo0hmtpAUgd0GtD7hBGhKayXcTAwHfvITJCc6nLpup5YjVCJj0xAdtnTGe+X1Y9UCEtvUXTZ1k3TU1GI5OpdrkdgT1jHZ0c23073GBjb07xtyxatCU5TlEKIsgucLnQ1Fe51PB5ivXCIeA9VmLW7AGD/xFeRNnaZ5aM0v61wwv43MxWYKhk/3IPWQ4mW5qoAyE9B3EEyMMzD666pT4jrd0KpL+3ptDfQQuOEJ1S9nM7GkBSIg7K7S/M/7myiSfFxZoW8Qz1OLez7tCRb+ZcEMzj3xfecRJ+unVJd7sLV4kxzpaSVBEAWnUbsjNklbo1NOXImguTzEXxp/GdiOp6kEIj2TRRYZzgjxa+u7hn1tCwXqOVuJQFUSRRhPT6W0PY5LGpTwLIBDRjeSyk6MZ+TdfjekZeOmVKeSb3osB3NFugv3rU5e8Af5YIOk1wLdLLKkLFFkWVvSVVxA7VUx5QeJd1lII8laa3bnIC5P9q/30FKN9OyF6yjWyL4bmLGGKVLAZZ/BBm4Sw8hbf17l/KjxwSaJg+BUc/MXP6OgRRpP4EPDfJmljFP3keqvqF7O9N9Mc89+6uiDIGel+CKyxwfH03UmvO0WYZnUj9YFXN26xq+jA2Om0JweZ7/e/2YesIHJNZT547ZI0sl5Otm6rljOzEP6boQzoaKqHD5TYT+paiwx4XcXFYEG5IlZGHTs4HCsE/BOy6T1HIK5xHCtUJC6bKLQo1roZz2NUISabtm5xTHnDevrwL0MGcVDuzyGwOpZR/cmk5xeu0/yU1bT3rtZkWVlGVevwnIL+DvF2fI08LLqdi3QMl2ioAfGbegdghh7aODYGZmPTHw3d+08yvbF1GRsYGT5YanKZvRFIc1Qn9PHtWnRt46fB02qhgdrfFtL+bgmLIG8iVWWc7Xu8+xC191r2NdaPqC+lsoQwrtkp0RN4cGFwTrTziK0KoMhqimnsrVjWQ6CV27qAARgs83824CCuJf6zwk6pVC//A7XoHczJqHWKDJEx1ANa02WKXPXJ+KJCp25zA6UdiskIIH5xjBU1+uTULv+xn5EXDqi3emWF/BgoE5wWCMKI3Z3TxF6WDjAYFPsEAn7GjopYdqryUe2I9jOu0/HABXl/YYouQcaf0aDq9W79SmV9EwqIMkUuMcQxPPYRUB+nADpiH/vjp+cUyimk/kyK1rwjMpW7Y2/WejeAilhNKEuOD76q/6Bzd29D8DKqV2pO7mnGbhVblHd+QZ1BkSOnyLqjhbAngIuF6AsKj+FkYiGAh+nc5JX0rShfSk0rCH7pDQGhUzce8d6ljsEN1fv6qQ+W5kpUYwQaiTyPEekPohECnQ+E/2ZPAcyoY0iSxptQdcD9RvEqXtCpUo19ZGOVGRCX4/8adl5CAZm1uKOxX5+2udBOdbAnU3euRLVA0LJYE6qHJutLmMMPdVJi/U20TkkhZH2A3v3dWawlOWDBVrS2fQEkORL7UGXrzR5Qo4+tCNC0VvCU9B+c1dIZwU6kXHD5MNCVlCxbifubIdieIzGeYpBhquooK1zw/1dYOEyexIIJ5a+F5dajh5DWVy75jv8UPvF5SX6e8iiAsPlTtstk3/869qwzx43ulp1gnAelrVk9XzXFWKCwdYTAJFBVqpQJ2gkEXo3Bt0M+PKJ7f1fMhXBMTPodpZXG2Np+ULyWC9zwXP7lNt7uYpc82ZWfxsjkthOopPxvltvhq4VsSPITvIRnTT59awkuf19SYphvr1lBurxMRubpL7dZOMCTvnZgW95iU9GEp9RuOw53hRPYkvrpzQVx1BA/JHlW9f2CjKJ2UxqwtM1S6OV1M07gbcB9vBxr5ARD05JuucEQb0wdH68TyAAX4i8KuyTLJN5R3z7v9ZAQbhAvXQMSv+EwMA9ZAjktZ1lDD6thhPCmdAxl9qhIxYq0dQBAm6ePU0gvnaHsXx7WQj0IjazUlZPlRWXGLSM3d2Qjj7XwogCg7TF8BB10vrvhskoaAvSYrvpxOCai9zHvoRiGeInbOSrErZ185LicXwz/VkWDt5VWjcx1LsSbnF9i5RplEHa17MqG0Heku8/TeGeP6hATj/sGQMqf0tFG0g8cb2Sw7yyBON9WGL3cAh6g/poUht4UfU4yP/VlwFA48B/81VGhGlIVqQH8/iwL8skc7IBZy5y0iOW4KX5RbN73RQLPcZ9XvrRFk9DwIaSJ6MdOoaTloU9WOb4j0Ql8f0nSvNDcoJDwveHdEYf7ushaoVtFtghoel7PuolcEEXvOXQ0YqL78aB371oTcmv/OqZtNILJTb3M+gHR/tqYPVk42ZsfPT3V660ENA3Oy3bpB/igLnXXU1mLsC0wGtl7HUBE1rS8Rd15vEiCKoEE0POtPsTSqdZN0aF714/FmXIcKGISsWcidX78uaHUaegrCnBDedPvUvhNNWrxNbOVzoGw927zagTz18MqxQU5KEBhjMFmAPuRB6VzoGy7EqkLzoUkicfuYytnRrpuzQCBQFUEnSyk2xJE8cQMtAmM773AX7Lu/erqLi186OspB6a90NBWpxcvn4IiJUIW9pa+PaiYPdnWfvb80jkvZTE71RjO4McQ8dWDHDmM3RwtTnAcll6T+NscI2RN5dq/0YWiFBFOGbax6X9o6zjeDyCgz1gtnKo1skl6X2D5u58S6E8PV9XCg94g0XK9ckD3BYYmp1stto9nzH/DP6uBcU1hEc4f5Cttw0YpVJpSabxGE4aIquD0FWEJ/ahju1TB2Y6fQb9ythvtEbjKlIZm3GiqGSVqp3jm8pEu6hZ3aV99q6OJ5XVz78N0Ddw+6tp8BfqnybZenoTIGCn0CkxDoRMEWnZnmsStFzMlVayI8m0iwVD5mNQ+zRQApPyDPNmhZbKjKcfNi04KqcK97L+HD8z3VAbEojlD61EPoFET/9P6wEbicWoO1TUMWXBoXJtwAWWDLOlX9CKV2l2BlcMRxlMGrpc75terJg1oxyF6KzQN6o6/Qa5kvffrilbJJ3zWcz7ZIXNs+ujLAgN3NIbIgKAcVA45VXyASQHHE1QavEUZ6tzmMNq/memY/QWvYJMLGFyYi4S9zDMe1cW4vxgedPpu/APGXZAGVOvw9rFxI4u+wLOtdknih84MP08I9xn2QIO4GQrvYFxntNA9qtKbI6+d6WV+44hmCeSzWq2zDdyAwvVAY7SdyT0sHfhjeTqS+RLys86iB95/uJ5gFD3jwzt02yDkku/U8/M4b4zARvg5YHXznagXP7jHhnFfZqr+lX/iReNdRkdO1uBMtmUqbyS//4hnGRZ9+5Y/hgecUHOrk+3wWi96ZswIAbPl2M8F9LhLD8zJ/h92fm44Pwh3YwspflGSCxilZ/ZO6f09qo+TAtAJTDWreNLjmIKDmOYb/47XyfySPyX8mXeTPBrunp/qdDKRXtArpz4FQflhPQTUqoyumDmgzI56lhJ605C4fwKYz68xxhMfYB5PN0RhkmbS/F79fGXhNJiAx72MIes4YZKCYeiYUdnUKUzPzgbzA2N7aGSN+IPQKix4Y/05DS7b8g6JMbTiOhv0N6bJ/UZUQU4TQ8Mvg5/xAI2xASBdfCLtgX4/cjT6wN14x+AG1hFual4TJRMEIGox0mApziRyeW2xx6eoX3kt4nAgT9XhttvOULtI35Cp0B1MEeZEnDdc+Pk3gpIARokI5Os93CMbuqCpsZ8Tbn6Zlx2T4vkZq9HyYU=\"}", - "add whats up page": "{\"iv\":\"ozkbSQeSBLqBAglJ\",\"encryptedData\":\"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\"}" + "add whats up page": "{\"iv\":\"ozkbSQeSBLqBAglJ\",\"encryptedData\":\"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\"}", + "add invoices": "{\"iv\":\"apbC33mU1aDfibYz\",\"encryptedData\":\"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\"}" } \ No newline at end of file diff --git a/backend/src/db/api/invoices.js b/backend/src/db/api/invoices.js new file mode 100644 index 0000000..1a9f131 --- /dev/null +++ b/backend/src/db/api/invoices.js @@ -0,0 +1,444 @@ + +const db = require('../models'); +const crypto = require('crypto'); +const Utils = require('../utils'); + +const Sequelize = db.Sequelize; +const Op = Sequelize.Op; + +module.exports = class InvoicesDBApi { + + static async create(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const invoices = await db.invoices.create( + { + id: data.id || undefined, + + amountoriginal: data.amountoriginal + || + null + , + + currency: data.currency + || + null + , + + incomecost: data.incomecost + || + null + , + + amountpln: data.amountpln + || + null + , + + invoicedate: data.invoicedate + || + null + , + + period: data.period + || + null + , + + description: data.description + || + null + , + + importHash: data.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + }, + { transaction }, + ); + + return invoices; + } + + static async bulkImport(data, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + // Prepare data - wrapping individual data transformations in a map() method + const invoicesData = data.map((item, index) => ({ + id: item.id || undefined, + + amountoriginal: item.amountoriginal + || + null + , + + currency: item.currency + || + null + , + + incomecost: item.incomecost + || + null + , + + amountpln: item.amountpln + || + null + , + + invoicedate: item.invoicedate + || + null + , + + period: item.period + || + null + , + + description: item.description + || + null + , + + importHash: item.importHash || null, + createdById: currentUser.id, + updatedById: currentUser.id, + createdAt: new Date(Date.now() + index * 1000), + })); + + // Bulk create items + const invoices = await db.invoices.bulkCreate(invoicesData, { transaction }); + + return invoices; + } + + static async update(id, data, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const invoices = await db.invoices.findByPk(id, {}, {transaction}); + + const updatePayload = {}; + + if (data.amountoriginal !== undefined) updatePayload.amountoriginal = data.amountoriginal; + + if (data.currency !== undefined) updatePayload.currency = data.currency; + + if (data.incomecost !== undefined) updatePayload.incomecost = data.incomecost; + + if (data.amountpln !== undefined) updatePayload.amountpln = data.amountpln; + + if (data.invoicedate !== undefined) updatePayload.invoicedate = data.invoicedate; + + if (data.period !== undefined) updatePayload.period = data.period; + + if (data.description !== undefined) updatePayload.description = data.description; + + updatePayload.updatedById = currentUser.id; + + await invoices.update(updatePayload, {transaction}); + + return invoices; + } + + static async deleteByIds(ids, options) { + const currentUser = (options && options.currentUser) || { id: null }; + const transaction = (options && options.transaction) || undefined; + + const invoices = await db.invoices.findAll({ + where: { + id: { + [Op.in]: ids, + }, + }, + transaction, + }); + + await db.sequelize.transaction(async (transaction) => { + for (const record of invoices) { + await record.update( + {deletedBy: currentUser.id}, + {transaction} + ); + } + for (const record of invoices) { + await record.destroy({transaction}); + } + }); + + return invoices; + } + + static async remove(id, options) { + const currentUser = (options && options.currentUser) || {id: null}; + const transaction = (options && options.transaction) || undefined; + + const invoices = await db.invoices.findByPk(id, options); + + await invoices.update({ + deletedBy: currentUser.id + }, { + transaction, + }); + + await invoices.destroy({ + transaction + }); + + return invoices; + } + + static async findBy(where, options) { + const transaction = (options && options.transaction) || undefined; + + const invoices = await db.invoices.findOne( + { where }, + { transaction }, + ); + + if (!invoices) { + return invoices; + } + + const output = invoices.get({plain: true}); + + return output; + } + + static async findAll(filter, options) { + const limit = filter.limit || 0; + let offset = 0; + let where = {}; + const currentPage = +filter.page; + + const user = (options && options.currentUser) || null; + + offset = currentPage * limit; + + const orderBy = null; + + const transaction = (options && options.transaction) || undefined; + + let include = []; + + if (filter) { + if (filter.id) { + where = { + ...where, + ['id']: Utils.uuid(filter.id), + }; + } + + if (filter.currency) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'invoices', + 'currency', + filter.currency, + ), + }; + } + + if (filter.incomecost) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'invoices', + 'incomecost', + filter.incomecost, + ), + }; + } + + if (filter.period) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'invoices', + 'period', + filter.period, + ), + }; + } + + if (filter.description) { + where = { + ...where, + [Op.and]: Utils.ilike( + 'invoices', + 'description', + filter.description, + ), + }; + } + + if (filter.amountoriginalRange) { + const [start, end] = filter.amountoriginalRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + amountoriginal: { + ...where.amountoriginal, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + amountoriginal: { + ...where.amountoriginal, + [Op.lte]: end, + }, + }; + } + } + + if (filter.amountplnRange) { + const [start, end] = filter.amountplnRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + amountpln: { + ...where.amountpln, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + amountpln: { + ...where.amountpln, + [Op.lte]: end, + }, + }; + } + } + + if (filter.invoicedateRange) { + const [start, end] = filter.invoicedateRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + invoicedate: { + ...where.invoicedate, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + invoicedate: { + ...where.invoicedate, + [Op.lte]: end, + }, + }; + } + } + + if (filter.active !== undefined) { + where = { + ...where, + active: filter.active === true || filter.active === 'true' + }; + } + + if (filter.createdAtRange) { + const [start, end] = filter.createdAtRange; + + if (start !== undefined && start !== null && start !== '') { + where = { + ...where, + ['createdAt']: { + ...where.createdAt, + [Op.gte]: start, + }, + }; + } + + if (end !== undefined && end !== null && end !== '') { + where = { + ...where, + ['createdAt']: { + ...where.createdAt, + [Op.lte]: end, + }, + }; + } + } + } + + const queryOptions = { + where, + include, + distinct: true, + order: filter.field && filter.sort + ? [[filter.field, filter.sort]] + : [['createdAt', 'desc']], + transaction: options?.transaction, + logging: console.log + }; + + if (!options?.countOnly) { + queryOptions.limit = limit ? Number(limit) : undefined; + queryOptions.offset = offset ? Number(offset) : undefined; + } + + try { + const { rows, count } = await db.invoices.findAndCountAll(queryOptions); + + return { + rows: options?.countOnly ? [] : rows, + count: count + }; + } catch (error) { + console.error('Error executing query:', error); + throw error; + } + } + + static async findAllAutocomplete(query, limit, offset) { + let where = {}; + + if (query) { + where = { + [Op.or]: [ + { ['id']: Utils.uuid(query) }, + Utils.ilike( + 'invoices', + 'id', + query, + ), + ], + }; + } + + const records = await db.invoices.findAll({ + attributes: [ 'id', 'id' ], + where, + limit: limit ? Number(limit) : undefined, + offset: offset ? Number(offset) : undefined, + orderBy: [['id', 'ASC']], + }); + + return records.map((record) => ({ + id: record.id, + label: record.id, + })); + } + +}; + diff --git a/backend/src/db/migrations/1750800185369.js b/backend/src/db/migrations/1750800185369.js new file mode 100644 index 0000000..9fda4c6 --- /dev/null +++ b/backend/src/db/migrations/1750800185369.js @@ -0,0 +1,91 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.createTable('invoices', { + id: { + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.DataTypes.UUIDV4, + primaryKey: true, + }, + createdById: { + type: Sequelize.DataTypes.UUID, + references: { + key: 'id', + model: 'users', + }, + }, + updatedById: { + type: Sequelize.DataTypes.UUID, + references: { + key: 'id', + model: 'users', + }, + }, + createdAt: { type: Sequelize.DataTypes.DATE }, + updatedAt: { type: Sequelize.DataTypes.DATE }, + deletedAt: { type: Sequelize.DataTypes.DATE }, + importHash: { + type: Sequelize.DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, { transaction }); + + await queryInterface.addColumn( + 'invoices', + 'organizationsId', + { + type: Sequelize.DataTypes.UUID, + + references: { + model: 'organizations', + key: 'id', + }, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'organizationsId', + { transaction } + ); + + await queryInterface.dropTable('invoices', { transaction }); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800194394.js b/backend/src/db/migrations/1750800194394.js new file mode 100644 index 0000000..4718d0e --- /dev/null +++ b/backend/src/db/migrations/1750800194394.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'amountoriginal', + { + type: Sequelize.DataTypes.DECIMAL, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'amountoriginal', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800210259.js b/backend/src/db/migrations/1750800210259.js new file mode 100644 index 0000000..bc8647d --- /dev/null +++ b/backend/src/db/migrations/1750800210259.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'currency', + { + type: Sequelize.DataTypes.TEXT, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'currency', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800216064.js b/backend/src/db/migrations/1750800216064.js new file mode 100644 index 0000000..3445efe --- /dev/null +++ b/backend/src/db/migrations/1750800216064.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'incomecost', + { + type: Sequelize.DataTypes.TEXT, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'incomecost', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800221746.js b/backend/src/db/migrations/1750800221746.js new file mode 100644 index 0000000..60d3833 --- /dev/null +++ b/backend/src/db/migrations/1750800221746.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'amountpln', + { + type: Sequelize.DataTypes.DECIMAL, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'amountpln', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800228412.js b/backend/src/db/migrations/1750800228412.js new file mode 100644 index 0000000..b80facb --- /dev/null +++ b/backend/src/db/migrations/1750800228412.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'invoicedate', + { + type: Sequelize.DataTypes.DATEONLY, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'invoicedate', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800233922.js b/backend/src/db/migrations/1750800233922.js new file mode 100644 index 0000000..743b37b --- /dev/null +++ b/backend/src/db/migrations/1750800233922.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'period', + { + type: Sequelize.DataTypes.TEXT, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'period', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800241661.js b/backend/src/db/migrations/1750800241661.js new file mode 100644 index 0000000..b7dcab1 --- /dev/null +++ b/backend/src/db/migrations/1750800241661.js @@ -0,0 +1,54 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.addColumn( + 'invoices', + 'description', + { + type: Sequelize.DataTypes.TEXT, + + }, + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await queryInterface.removeColumn( + 'invoices', + 'description', + { transaction } + ); + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/migrations/1750800248668.js b/backend/src/db/migrations/1750800248668.js new file mode 100644 index 0000000..a1c6034 --- /dev/null +++ b/backend/src/db/migrations/1750800248668.js @@ -0,0 +1,38 @@ +module.exports = { + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async up(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + }, + /** + * @param {QueryInterface} queryInterface + * @param {Sequelize} Sequelize + * @returns {Promise} + */ + async down(queryInterface, Sequelize) { + /** + * @type {Transaction} + */ + const transaction = await queryInterface.sequelize.transaction(); + try { + + await transaction.commit(); + } catch (err) { + await transaction.rollback(); + throw err; + } + } +}; diff --git a/backend/src/db/models/invoices.js b/backend/src/db/models/invoices.js new file mode 100644 index 0000000..44b93ca --- /dev/null +++ b/backend/src/db/models/invoices.js @@ -0,0 +1,86 @@ +const config = require('../../config'); +const providers = config.providers; +const crypto = require('crypto'); +const bcrypt = require('bcrypt'); +const moment = require('moment'); + +module.exports = function(sequelize, DataTypes) { + const invoices = sequelize.define( + 'invoices', + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true, + }, + +amountoriginal: { + type: DataTypes.DECIMAL, + + }, + +currency: { + type: DataTypes.TEXT, + + }, + +incomecost: { + type: DataTypes.TEXT, + + }, + +amountpln: { + type: DataTypes.DECIMAL, + + }, + +invoicedate: { + type: DataTypes.DATEONLY, + + get: function() { + return this.getDataValue('invoicedate') + ? moment + .utc(this.getDataValue('invoicedate')) + .format('YYYY-MM-DD') + : null; + }, + + }, + +period: { + type: DataTypes.TEXT, + + }, + +description: { + type: DataTypes.TEXT, + + }, + + importHash: { + type: DataTypes.STRING(255), + allowNull: true, + unique: true, + }, + }, + { + timestamps: true, + paranoid: true, + freezeTableName: true, + }, + ); + + invoices.associate = (db) => { + + db.invoices.belongsTo(db.users, { + as: 'createdBy', + }); + + db.invoices.belongsTo(db.users, { + as: 'updatedBy', + }); + }; + + return invoices; +}; + diff --git a/backend/src/db/seeders/20250624212305.js b/backend/src/db/seeders/20250624212305.js new file mode 100644 index 0000000..6a2836a --- /dev/null +++ b/backend/src/db/seeders/20250624212305.js @@ -0,0 +1,71 @@ + +const { v4: uuid } = require("uuid"); +const db = require('../models'); +const Sequelize = require('sequelize'); +const config = require("../../config"); + +module.exports = { + /** + * @param{import("sequelize").QueryInterface} queryInterface + * @return {Promise} + */ + async up(queryInterface) { + const createdAt = new Date(); + const updatedAt = new Date(); + + /** @type {Map} */ + const idMap = new Map(); + + /** + * @param {string} key + * @return {string} + */ + function getId(key) { + if (idMap.has(key)) { + return idMap.get(key); + } + const id = uuid(); + idMap.set(key, id); + return id; + } + + /** + * @param {string} name + */ + function createPermissions(name) { + return [ + { id: getId(`CREATE_${name.toUpperCase()}`), createdAt, updatedAt, name: `CREATE_${name.toUpperCase()}` }, + { id: getId(`READ_${name.toUpperCase()}`), createdAt, updatedAt, name: `READ_${name.toUpperCase()}` }, + { id: getId(`UPDATE_${name.toUpperCase()}`), createdAt, updatedAt, name: `UPDATE_${name.toUpperCase()}` }, + { id: getId(`DELETE_${name.toUpperCase()}`), createdAt, updatedAt, name: `DELETE_${name.toUpperCase()}` } + ]; + } + + const entities = [ + + "invoices", + + ]; + + const createdPermissions = entities.flatMap(createPermissions); + + // Add permissions to database + await queryInterface.bulkInsert("permissions", createdPermissions); + // Get permissions ids + const permissionsIds = createdPermissions.map((p) => p.id); + // Get admin role + const adminRole = await db.roles.findOne({ + where: {name: config.roles.super_admin} + }); + + if (adminRole) { + // Add permissions to admin role if it exists + await adminRole.addPermissions(permissionsIds); + } + + }, + down: async (queryInterface, Sequelize) => { + await queryInterface.bulkDelete("permissions", entities.flatMap(createPermissions)); + } + }; + diff --git a/backend/src/index.js b/backend/src/index.js index 19064fa..78f54e4 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -38,6 +38,8 @@ const permissionsRoutes = require('./routes/permissions'); const organizationsRoutes = require('./routes/organizations'); +const invoicesRoutes = require('./routes/invoices'); + const getBaseUrl = (url) => { if (!url) return ''; return url.endsWith('/api') ? url.slice(0, -4) : url; @@ -114,6 +116,8 @@ app.use('/api/permissions', passport.authenticate('jwt', {session: false}), perm app.use('/api/organizations', passport.authenticate('jwt', {session: false}), organizationsRoutes); +app.use('/api/invoices', passport.authenticate('jwt', {session: false}), invoicesRoutes); + app.use('/api/contact-form', contactFormRoutes); app.use( diff --git a/backend/src/routes/invoices.js b/backend/src/routes/invoices.js new file mode 100644 index 0000000..3156834 --- /dev/null +++ b/backend/src/routes/invoices.js @@ -0,0 +1,428 @@ + +const express = require('express'); + +const InvoicesService = require('../services/invoices'); +const InvoicesDBApi = require('../db/api/invoices'); +const wrapAsync = require('../helpers').wrapAsync; + +const router = express.Router(); + +const { parse } = require('json2csv'); + +/** + * @swagger + * components: + * schemas: + * Invoices: + * type: object + * properties: + + * currency: + * type: string + * default: currency + * incomecost: + * type: string + * default: incomecost + * period: + * type: string + * default: period + * description: + * type: string + * default: description + + * amountoriginal: + * type: integer + * format: int64 + * amountpln: + * type: integer + * format: int64 + + */ + +/** + * @swagger + * tags: + * name: Invoices + * description: The Invoices managing API + */ + +/** +* @swagger +* /api/invoices: +* post: +* security: +* - bearerAuth: [] +* tags: [Invoices] +* summary: Add new item +* description: Add new item +* requestBody: +* required: true +* content: +* application/json: +* schema: +* properties: +* data: +* description: Data of the updated item +* type: object +* $ref: "#/components/schemas/Invoices" +* responses: +* 200: +* description: The item was successfully added +* content: +* application/json: +* schema: +* $ref: "#/components/schemas/Invoices" +* 401: +* $ref: "#/components/responses/UnauthorizedError" +* 405: +* description: Invalid input data +* 500: +* description: Some server error +*/ +router.post('/', wrapAsync(async (req, res) => { + const referer = req.headers.referer || `${req.protocol}://${req.hostname}${req.originalUrl}`; + const link = new URL(referer); + await InvoicesService.create(req.body.data, req.currentUser, true, link.host); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/budgets/bulk-import: + * post: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Bulk import items + * description: Bulk import items + * requestBody: + * required: true + * content: + * application/json: + * schema: + * properties: + * data: + * description: Data of the updated items + * type: array + * items: + * $ref: "#/components/schemas/Invoices" + * responses: + * 200: + * description: The items were successfully imported + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Invoices" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 405: + * description: Invalid input data + * 500: + * description: Some server error + * + */ +router.post('/bulk-import', wrapAsync(async (req, res) => { + const referer = req.headers.referer || `${req.protocol}://${req.hostname}${req.originalUrl}`; + const link = new URL(referer); + await InvoicesService.bulkImport(req, res, true, link.host); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/invoices/{id}: + * put: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Update the data of the selected item + * description: Update the data of the selected item + * parameters: + * - in: path + * name: id + * description: Item ID to update + * required: true + * schema: + * type: string + * requestBody: + * description: Set new item data + * required: true + * content: + * application/json: + * schema: + * properties: + * id: + * description: ID of the updated item + * type: string + * data: + * description: Data of the updated item + * type: object + * $ref: "#/components/schemas/Invoices" + * required: + * - id + * responses: + * 200: + * description: The item data was successfully updated + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Invoices" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.put('/:id', wrapAsync(async (req, res) => { + await InvoicesService.update(req.body.data, req.body.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/invoices/{id}: + * delete: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Delete the selected item + * description: Delete the selected item + * parameters: + * - in: path + * name: id + * description: Item ID to delete + * required: true + * schema: + * type: string + * responses: + * 200: + * description: The item was successfully deleted + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Invoices" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.delete('/:id', wrapAsync(async (req, res) => { + await InvoicesService.remove(req.params.id, req.currentUser); + const payload = true; + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/invoices/deleteByIds: + * post: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Delete the selected item list + * description: Delete the selected item list + * requestBody: + * required: true + * content: + * application/json: + * schema: + * properties: + * ids: + * description: IDs of the updated items + * type: array + * responses: + * 200: + * description: The items was successfully deleted + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Invoices" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Items not found + * 500: + * description: Some server error + */ +router.post('/deleteByIds', wrapAsync(async (req, res) => { + await InvoicesService.deleteByIds(req.body.data, req.currentUser); + const payload = true; + res.status(200).send(payload); + })); + +/** + * @swagger + * /api/invoices: + * get: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Get all invoices + * description: Get all invoices + * responses: + * 200: + * description: Invoices list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Invoices" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error +*/ +router.get('/', wrapAsync(async (req, res) => { + const filetype = req.query.filetype + const currentUser = req.currentUser; + const payload = await InvoicesDBApi.findAll( + req.query, { currentUser } + ); + if (filetype && filetype === 'csv') { + const fields = ['id','currency','incomecost','period','description', + + 'amountoriginal','amountpln', + + 'invoicedate',]; + const opts = { fields }; + try { + const csv = parse(payload.rows, opts); + res.status(200).attachment(csv); + res.send(csv) + + } catch (err) { + console.error(err); + } + } else { + res.status(200).send(payload); + } + +})); + +/** + * @swagger + * /api/invoices/count: + * get: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Count all invoices + * description: Count all invoices + * responses: + * 200: + * description: Invoices count successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Invoices" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get('/count', wrapAsync(async (req, res) => { + const currentUser = req.currentUser; + const payload = await InvoicesDBApi.findAll( + req.query, + null, + { countOnly: true, currentUser } + ); + + res.status(200).send(payload); +})); + +/** + * @swagger + * /api/invoices/autocomplete: + * get: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Find all invoices that match search criteria + * description: Find all invoices that match search criteria + * responses: + * 200: + * description: Invoices list successfully received + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: "#/components/schemas/Invoices" + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Data not found + * 500: + * description: Some server error + */ +router.get('/autocomplete', async (req, res) => { + const payload = await InvoicesDBApi.findAllAutocomplete( + req.query.query, + req.query.limit, + req.query.offset, + ); + + res.status(200).send(payload); +}); + +/** + * @swagger + * /api/invoices/{id}: + * get: + * security: + * - bearerAuth: [] + * tags: [Invoices] + * summary: Get selected item + * description: Get selected item + * parameters: + * - in: path + * name: id + * description: ID of item to get + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Selected item successfully received + * content: + * application/json: + * schema: + * $ref: "#/components/schemas/Invoices" + * 400: + * description: Invalid ID supplied + * 401: + * $ref: "#/components/responses/UnauthorizedError" + * 404: + * description: Item not found + * 500: + * description: Some server error + */ +router.get('/:id', wrapAsync(async (req, res) => { + const payload = await InvoicesDBApi.findBy( + { id: req.params.id }, + ); + + res.status(200).send(payload); +})); + +router.use('/', require('../helpers').commonErrorHandler); + +module.exports = router; diff --git a/backend/src/services/invoices.js b/backend/src/services/invoices.js new file mode 100644 index 0000000..b404416 --- /dev/null +++ b/backend/src/services/invoices.js @@ -0,0 +1,131 @@ +const db = require('../db/models'); +const InvoicesDBApi = require('../db/api/invoices'); +const processFile = require("../middlewares/upload"); +const ValidationError = require('./notifications/errors/validation'); +const csv = require('csv-parser'); +const axios = require('axios'); +const config = require('../config'); +const stream = require('stream'); + +module.exports = class InvoicesService { + static async create(data, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + await InvoicesDBApi.create( + data, + { + currentUser, + transaction, + }, + ); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + }; + + static async bulkImport(req, res, sendInvitationEmails = true, host) { + const transaction = await db.sequelize.transaction(); + + try { + await processFile(req, res); + const bufferStream = new stream.PassThrough(); + const results = []; + + await bufferStream.end(Buffer.from(req.file.buffer, "utf-8")); // convert Buffer to Stream + + await new Promise((resolve, reject) => { + bufferStream + .pipe(csv()) + .on('data', (data) => results.push(data)) + .on('end', async () => { + console.log('CSV results', results); + resolve(); + }) + .on('error', (error) => reject(error)); + }) + + await InvoicesDBApi.bulkImport(results, { + transaction, + ignoreDuplicates: true, + validate: true, + currentUser: req.currentUser + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async update(data, id, currentUser) { + const transaction = await db.sequelize.transaction(); + try { + let invoices = await InvoicesDBApi.findBy( + {id}, + {transaction}, + ); + + if (!invoices) { + throw new ValidationError( + 'invoicesNotFound', + ); + } + + const updatedInvoices = await InvoicesDBApi.update( + id, + data, + { + currentUser, + transaction, + }, + ); + + await transaction.commit(); + return updatedInvoices; + + } catch (error) { + await transaction.rollback(); + throw error; + } + }; + + static async deleteByIds(ids, currentUser) { + const transaction = await db.sequelize.transaction(); + + try { + await InvoicesDBApi.deleteByIds(ids, { + currentUser, + transaction, + }); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } + + static async remove(id, currentUser) { + const transaction = await db.sequelize.transaction(); + + try { + await InvoicesDBApi.remove( + id, + { + currentUser, + transaction, + }, + ); + + await transaction.commit(); + } catch (error) { + await transaction.rollback(); + throw error; + } + } +}; + diff --git a/backend/src/services/search.js b/backend/src/services/search.js index 1b47473..cce5e4b 100644 --- a/backend/src/services/search.js +++ b/backend/src/services/search.js @@ -109,6 +109,18 @@ module.exports = class SearchService { ], + "invoices": [ + + "currency", + + "incomecost", + + "period", + + "description", + + ], + }; const columnsInt = { @@ -142,6 +154,14 @@ module.exports = class SearchService { ], + "invoices": [ + + "amountoriginal", + + "amountpln", + + ], + }; let allFoundRecords = []; diff --git a/frontend/src/components/Invoices/CardInvoices.tsx b/frontend/src/components/Invoices/CardInvoices.tsx new file mode 100644 index 0000000..6dd5c47 --- /dev/null +++ b/frontend/src/components/Invoices/CardInvoices.tsx @@ -0,0 +1,156 @@ +import React from 'react'; +import ListActionsPopover from '../ListActionsPopover'; +import { useAppSelector } from '../../stores/hooks'; +import dataFormatter from '../../helpers/dataFormatter'; +import { Pagination } from '../Pagination'; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + invoices: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const CardInvoices = ({ + invoices, + loading, + onDelete, + currentPage, + numPages, + onPageChange, +}: Props) => { + const asideScrollbarsStyle = useAppSelector( + (state) => state.style.asideScrollbarsStyle, + ); + const bgColor = useAppSelector((state) => state.style.cardsColor); + const darkMode = useAppSelector((state) => state.style.darkMode); + const corners = useAppSelector((state) => state.style.corners); + const focusRing = useAppSelector((state) => state.style.focusRingColor); + + return ( +
+ {loading && } +
    + {!loading && invoices.map((item, index) => ( +
  • + + {item.id} + + +
    + +
    +
+
+ +
+
Amountoriginal
+
+
+ { item.amountoriginal } +
+
+
+ +
+
Currency
+
+
+ { item.currency } +
+
+
+ +
+
Incomecost
+
+
+ { item.incomecost } +
+
+
+ +
+
Amountpln
+
+
+ { item.amountpln } +
+
+
+ +
+
Invoicedate
+
+
+ { dataFormatter.dateFormatter(item.invoicedate) } +
+
+
+ +
+
Period
+
+
+ { item.period } +
+
+
+ +
+
Description
+
+
+ { item.description } +
+
+
+ +
+
Attachment
+
+
+ { item.attachment } +
+
+
+ +
+ + ))} + {!loading && invoices.length === 0 && ( +
+

No data to display

+
+ )} + +
+ +
+ + ); +}; + +export default CardInvoices; diff --git a/frontend/src/components/Invoices/ListInvoices.tsx b/frontend/src/components/Invoices/ListInvoices.tsx new file mode 100644 index 0000000..57408d2 --- /dev/null +++ b/frontend/src/components/Invoices/ListInvoices.tsx @@ -0,0 +1,107 @@ +import React from 'react'; +import CardBox from '../CardBox'; +import dataFormatter from '../../helpers/dataFormatter'; +import ListActionsPopover from "../ListActionsPopover"; +import {useAppSelector} from "../../stores/hooks"; +import {Pagination} from "../Pagination"; +import LoadingSpinner from "../LoadingSpinner"; +import Link from 'next/link'; + +type Props = { + invoices: any[]; + loading: boolean; + onDelete: (id: string) => void; + currentPage: number; + numPages: number; + onPageChange: (page: number) => void; +}; + +const ListInvoices = ({ invoices, loading, onDelete, currentPage, numPages, onPageChange }: Props) => { + const corners = useAppSelector((state) => state.style.corners); + const bgColor = useAppSelector((state) => state.style.cardsColor); + + return ( + <> +
+ {loading && } + {!loading && invoices.map((item) => ( +
+ +
+ + +
+

Amountoriginal

+

{ item.amountoriginal }

+
+ +
+

Currency

+

{ item.currency }

+
+ +
+

Incomecost

+

{ item.incomecost }

+
+ +
+

Amountpln

+

{ item.amountpln }

+
+ +
+

Invoicedate

+

{ dataFormatter.dateFormatter(item.invoicedate) }

+
+ +
+

Period

+

{ item.period }

+
+ +
+

Description

+

{ item.description }

+
+ +
+

Attachment

+

{ item.attachment }

+
+ + + +
+
+
+ ))} + {!loading && invoices.length === 0 && ( +
+

No data to display

+
+ )} +
+
+ +
+ + ) +}; + +export default ListInvoices diff --git a/frontend/src/components/Invoices/TableInvoices.tsx b/frontend/src/components/Invoices/TableInvoices.tsx new file mode 100644 index 0000000..1f713e8 --- /dev/null +++ b/frontend/src/components/Invoices/TableInvoices.tsx @@ -0,0 +1,441 @@ +import React, { useEffect, useState, useMemo } from 'react' +import { createPortal } from 'react-dom'; +import { ToastContainer, toast } from 'react-toastify'; +import BaseButton from '../BaseButton' +import CardBoxModal from '../CardBoxModal' +import CardBox from "../CardBox"; +import { fetch, update, deleteItem, setRefetch, deleteItemsByIds } from '../../stores/invoices/invoicesSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' +import { Field, Form, Formik } from "formik"; +import { + DataGrid, + GridColDef, +} from '@mui/x-data-grid'; +import {loadColumns} from "./configureInvoicesCols"; +import _ from 'lodash'; +import dataFormatter from '../../helpers/dataFormatter' +import {dataGridStyles} from "../../styles"; +import axios from 'axios'; + +const perPage = 10; + +const TableSampleInvoices = ({ filterItems, setFilterItems, filters, showGrid }) => { + const notify = (type, msg) => toast( msg, {type, position: "bottom-center"}); + + const dispatch = useAppDispatch(); + const router = useRouter(); + + const pagesList = []; + const [id, setId] = useState(null); + const [currentPage, setCurrentPage] = useState(0); + const [filterRequest, setFilterRequest] = React.useState(''); + const [columns, setColumns] = useState([]); + const [selectedRows, setSelectedRows] = useState([]); + const [sortModel, setSortModel] = useState([ + { + field: '', + sort: 'desc', + }, + ]); + const { invoices, loading, count, notify: invoicesNotify, refetch } = useAppSelector((state) => state.invoices) + const { currentUser } = useAppSelector((state) => state.auth); + const focusRing = useAppSelector((state) => state.style.focusRingColor); + const bgColor = useAppSelector((state) => state.style.bgLayoutColor); + const corners = useAppSelector((state) => state.style.corners); + const numPages = Math.floor(count / perPage) === 0 ? 1 : Math.ceil(count / perPage); + for (let i = 0; i < numPages; i++) { + pagesList.push(i); + } + + const loadData = async (page = currentPage, request = filterRequest) => { + if (page !== currentPage) setCurrentPage(page); + if (request !== filterRequest) setFilterRequest(request); + const { sort, field } = sortModel[0]; + + const query = `?page=${page}&limit=${perPage}${request}&sort=${sort}&field=${field}`; + dispatch(fetch({ limit: perPage, page, query })); + }; + + useEffect(() => { + if (invoicesNotify.showNotification) { + notify(invoicesNotify.typeNotification, invoicesNotify.textNotification); + } + }, [invoicesNotify.showNotification]); + + useEffect(() => { + if (!currentUser) return; + loadData(); + }, [sortModel, currentUser]); + + useEffect(() => { + if (refetch) { + loadData(0); + dispatch(setRefetch(false)); + } + }, [refetch, dispatch]); + + const [isModalInfoActive, setIsModalInfoActive] = useState(false) + const [isModalTrashActive, setIsModalTrashActive] = useState(false) + + const handleModalAction = () => { + setIsModalInfoActive(false) + setIsModalTrashActive(false) + } + + const handleDeleteModalAction = (id: string) => { + setId(id) + setIsModalTrashActive(true) + } + const handleDeleteAction = async () => { + if (id) { + await dispatch(deleteItem(id)); + await loadData(0); + setIsModalTrashActive(false); + } + }; + + const generateFilterRequests = useMemo(() => { + let request = '&'; + filterItems.forEach((item) => { + const isRangeFilter = filters.find( + (filter) => + filter.title === item.fields.selectedField && + (filter.number || filter.date), + ); + + if (isRangeFilter) { + const from = item.fields.filterValueFrom; + const to = item.fields.filterValueTo; + if (from) { + request += `${item.fields.selectedField}Range=${from}&`; + } + if (to) { + request += `${item.fields.selectedField}Range=${to}&`; + } + } else { + const value = item.fields.filterValue; + if (value) { + request += `${item.fields.selectedField}=${value}&`; + } + } + }); + return request; + }, [filterItems, filters]); + + const deleteFilter = (value) => { + const newItems = filterItems.filter((item) => item.id !== value); + + if (newItems.length) { + setFilterItems(newItems); + } else { + loadData(0, ''); + setFilterItems(newItems); + } + }; + + const handleSubmit = () => { + loadData(0, generateFilterRequests); + }; + + const handleChange = (id) => (e) => { + const value = e.target.value; + const name = e.target.name; + + setFilterItems( + filterItems.map((item) => { + if (item.id !== id) return item; + if (name === 'selectedField') return { id, fields: { [name]: value } }; + + return { id, fields: { ...item.fields, [name]: value } } + }), + ); + }; + + const handleReset = () => { + setFilterItems([]); + loadData(0, ''); + }; + + const onPageChange = (page: number) => { + loadData(page); + setCurrentPage(page); + }; + + useEffect(() => { + loadColumns(handleDeleteModalAction, `invoices`).then((newCols) => + setColumns(newCols), + ); + }, []); + + const handleTableSubmit = async (id: string, data) => { + + if (!_.isEmpty(data)) { + await dispatch(update({ id, data })) + .unwrap() + .then((res) => res) + .catch((err) => { + throw new Error(err); + }); + } + }; + + const onDeleteRows = async (selectedRows) => { + await dispatch(deleteItemsByIds(selectedRows)); + await loadData(0); + }; + + const controlClasses = + 'w-full py-2 px-2 my-2 border-gray-700 rounded dark:placeholder-gray-400 ' + + ` ${bgColor} ${focusRing} ${corners} ` + + 'dark:bg-slate-800 border'; + + const dataGrid = ( +
+ `datagrid--row`} + rows={invoices ?? []} + columns={columns} + initialState={{ + pagination: { + paginationModel: { + pageSize: 10, + }, + }, + }} + disableRowSelectionOnClick + onProcessRowUpdateError={(params) => { + console.log('Error', params); + }} + processRowUpdate={async (newRow, oldRow) => { + const data = dataFormatter.dataGridEditFormatter(newRow); + + try { + await handleTableSubmit(newRow.id, data); + return newRow; + } catch { + return oldRow; + } + }} + sortingMode={'server'} + checkboxSelection + onRowSelectionModelChange={(ids) => { + setSelectedRows(ids) + }} + onSortModelChange={(params) => { + params.length + ? setSortModel(params) + : setSortModel([{ field: '', sort: 'desc' }]); + }} + rowCount={count} + pageSizeOptions={[10]} + paginationMode={'server'} + loading={loading} + onPaginationModelChange={(params) => { + onPageChange(params.page); + }} + /> +
+ ) + + return ( + <> + {filterItems && Array.isArray( filterItems ) && filterItems.length ? + + null} + > +
+ <> + {filterItems && filterItems.map((filterItem) => { + return ( +
+
+
Filter
+ + {filters.map((selectOption) => ( + + ))} + +
+ {filters.find((filter) => + filter.title === filterItem?.fields?.selectedField + )?.type === 'enum' ? ( +
+
+ Value +
+ + + {filters.find((filter) => + filter.title === filterItem?.fields?.selectedField + )?.options?.map((option) => ( + + ))} + +
+ ) : filters.find((filter) => + filter.title === filterItem?.fields?.selectedField + )?.number ? ( +
+
+
From
+ +
+
+
To
+ +
+
+ ) : filters.find( + (filter) => + filter.title === + filterItem?.fields?.selectedField + )?.date ? ( +
+
+
+ From +
+ +
+
+
To
+ +
+
+ ) : ( +
+
Contains
+ +
+ )} +
+
Action
+ { + deleteFilter(filterItem.id) + }} + /> +
+
+ ) + })} +
+ + +
+ +
+
+
: null + } + +

Are you sure you want to delete this item?

+
+ {dataGrid} + + {selectedRows.length > 0 && + createPortal( + onDeleteRows(selectedRows)} + />, + document.getElementById('delete-rows-button'), + )} + + + ) +} + +export default TableSampleInvoices diff --git a/frontend/src/components/Invoices/configureInvoicesCols.tsx b/frontend/src/components/Invoices/configureInvoicesCols.tsx new file mode 100644 index 0000000..e22dc1a --- /dev/null +++ b/frontend/src/components/Invoices/configureInvoicesCols.tsx @@ -0,0 +1,161 @@ +import React from 'react'; +import BaseIcon from '../BaseIcon'; +import { mdiEye, mdiTrashCan, mdiPencilOutline } from '@mdi/js'; +import axios from 'axios'; +import { + GridActionsCellItem, + GridRowParams, + GridValueGetterParams, +} from '@mui/x-data-grid'; +import dataFormatter from '../../helpers/dataFormatter' +import DataGridMultiSelect from "../DataGridMultiSelect"; +import ListActionsPopover from '../ListActionsPopover'; +type Params = (id: string) => void; + +export const loadColumns = async ( + onDelete: Params, + entityName: string, +) => { + async function callOptionsApi(entityName: string) { + try { + const data = await axios(`/${entityName}/autocomplete?limit=100`); + return data.data; + } catch (error) { + console.log(error); + return []; + } + } + return [ + + { + field: 'amountoriginal', + headerName: 'Amountoriginal', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'currency', + headerName: 'Currency', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'incomecost', + headerName: 'Incomecost', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'amountpln', + headerName: 'Amountpln', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'number', + + }, + + { + field: 'invoicedate', + headerName: 'Invoicedate', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + type: 'date', + valueGetter: (params: GridValueGetterParams) => + new Date(params.row.invoicedate), + + }, + + { + field: 'period', + headerName: 'Period', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'description', + headerName: 'Description', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'attachment', + headerName: 'Attachment', + flex: 1, + minWidth: 120, + filterable: false, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + + editable: true, + + }, + + { + field: 'actions', + type: 'actions', + minWidth: 30, + headerClassName: 'datagrid--header', + cellClassName: 'datagrid--cell', + getActions: (params: GridRowParams) => { + + return [ +
+ +
, + ] + }, + }, + ]; +}; diff --git a/frontend/src/menuAside.ts b/frontend/src/menuAside.ts index 458af6a..f5e0ed4 100644 --- a/frontend/src/menuAside.ts +++ b/frontend/src/menuAside.ts @@ -80,6 +80,14 @@ const menuAside: MenuAsideItem[] = [ icon: icon.mdiTable ?? icon.mdiTable, permissions: 'READ_ORGANIZATIONS' }, + { + href: '/invoices/invoices-list', + label: 'Invoices', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + icon: icon.mdiTable ?? icon.mdiTable, + permissions: 'READ_INVOICES' + }, { href: '/profile', label: 'Profile', @@ -93,14 +101,6 @@ const menuAside: MenuAsideItem[] = [ icon: icon.mdiFileCode, permissions: 'READ_API_DOCS' }, - { - href: '/whats-up', - label: "What's Up?", - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - icon: icon.mdiCommentQuestion ?? icon.mdiTable, - }, - ] export default menuAside diff --git a/frontend/src/pages/dashboard.tsx b/frontend/src/pages/dashboard.tsx index bfee3f2..12dae0a 100644 --- a/frontend/src/pages/dashboard.tsx +++ b/frontend/src/pages/dashboard.tsx @@ -28,10 +28,11 @@ const Dashboard = () => { const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [organizations, setOrganizations] = React.useState(loadingMessage); + const [invoices, setInvoices] = React.useState(loadingMessage); async function loadData() { - const entities = ['users','human_resources','inventory','machinery','quality_control','raw_materials','suppliers','work_orders','roles','permissions','organizations',]; - const fns = [setUsers,setHuman_resources,setInventory,setMachinery,setQuality_control,setRaw_materials,setSuppliers,setWork_orders,setRoles,setPermissions,setOrganizations,]; + const entities = ['users','human_resources','inventory','machinery','quality_control','raw_materials','suppliers','work_orders','roles','permissions','organizations','invoices',]; + const fns = [setUsers,setHuman_resources,setInventory,setMachinery,setQuality_control,setRaw_materials,setSuppliers,setWork_orders,setRoles,setPermissions,setOrganizations,setInvoices,]; const requests = entities.map((entity, index) => { return axios.get(`/${entity.toLowerCase()}/count`); @@ -321,6 +322,34 @@ const Dashboard = () => { + +
+
+
+
+ Invoices +
+
+ {invoices} +
+
+
+ +
+
+
+ + diff --git a/frontend/src/pages/invoices/[invoicesId].tsx b/frontend/src/pages/invoices/[invoicesId].tsx new file mode 100644 index 0000000..871ba19 --- /dev/null +++ b/frontend/src/pages/invoices/[invoicesId].tsx @@ -0,0 +1,206 @@ +import { mdiChartTimelineVariant, mdiUpload } from '@mdi/js' +import Head from 'next/head' +import React, { ReactElement, useEffect, useState } from 'react' +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import dayjs from "dayjs"; + +import CardBox from '../../components/CardBox' +import LayoutAuthenticated from '../../layouts/Authenticated' +import SectionMain from '../../components/SectionMain' +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' +import { getPageTitle } from '../../config' + +import { Field, Form, Formik } from 'formik' +import FormField from '../../components/FormField' +import BaseDivider from '../../components/BaseDivider' +import BaseButtons from '../../components/BaseButtons' +import BaseButton from '../../components/BaseButton' +import FormCheckRadio from '../../components/FormCheckRadio' +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup' +import { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/invoices/invoicesSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const EditInvoices = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + organizations: null, + + 'amountoriginal': '', + + 'currency': '', + + 'incomecost': '', + + 'amountpln': '', + + invoicedate: new Date(), + + 'period': '', + + 'description': '', + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { invoices } = useAppSelector((state) => state.invoices) + + const { invoicesId } = router.query + + useEffect(() => { + dispatch(fetch({ id: invoicesId })) + }, [invoicesId]) + + useEffect(() => { + if (typeof invoices === 'object') { + setInitialValues(invoices) + } + }, [invoices]) + + useEffect(() => { + if (typeof invoices === 'object') { + + const newInitialVal = {...initVals}; + + Object.keys(initVals).forEach(el => newInitialVal[el] = (invoices)[el]) + + setInitialValues(newInitialVal); + } + }, [invoices]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: invoicesId, data })) + await router.push('/invoices/invoices-list') + } + + return ( + <> + + {getPageTitle('Edit invoices')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + setInitialValues({...initialValues, 'invoicedate': date})} + /> + + + + + + + + + + + + + + + router.push('/invoices/invoices-list')}/> + + +
+
+
+ + ) +} + +EditInvoices.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditInvoices diff --git a/frontend/src/pages/invoices/invoices-edit.tsx b/frontend/src/pages/invoices/invoices-edit.tsx new file mode 100644 index 0000000..b3e48a9 --- /dev/null +++ b/frontend/src/pages/invoices/invoices-edit.tsx @@ -0,0 +1,204 @@ +import { mdiChartTimelineVariant, mdiUpload } from '@mdi/js' +import Head from 'next/head' +import React, { ReactElement, useEffect, useState } from 'react' +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import dayjs from "dayjs"; + +import CardBox from '../../components/CardBox' +import LayoutAuthenticated from '../../layouts/Authenticated' +import SectionMain from '../../components/SectionMain' +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' +import { getPageTitle } from '../../config' + +import { Field, Form, Formik } from 'formik' +import FormField from '../../components/FormField' +import BaseDivider from '../../components/BaseDivider' +import BaseButtons from '../../components/BaseButtons' +import BaseButton from '../../components/BaseButton' +import FormCheckRadio from '../../components/FormCheckRadio' +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup' +import { SelectField } from "../../components/SelectField"; +import { SelectFieldMany } from "../../components/SelectFieldMany"; +import { SwitchField } from '../../components/SwitchField' +import {RichTextField} from "../../components/RichTextField"; + +import { update, fetch } from '../../stores/invoices/invoicesSlice' +import { useAppDispatch, useAppSelector } from '../../stores/hooks' +import { useRouter } from 'next/router' +import dataFormatter from '../../helpers/dataFormatter'; + +const EditInvoicesPage = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const initVals = { + + organizations: null, + + 'amountoriginal': '', + + 'currency': '', + + 'incomecost': '', + + 'amountpln': '', + + invoicedate: new Date(), + + 'period': '', + + 'description': '', + + } + const [initialValues, setInitialValues] = useState(initVals) + + const { invoices } = useAppSelector((state) => state.invoices) + + const { id } = router.query + + useEffect(() => { + dispatch(fetch({ id: id })) + }, [id]) + + useEffect(() => { + if (typeof invoices === 'object') { + setInitialValues(invoices) + } + }, [invoices]) + + useEffect(() => { + if (typeof invoices === 'object') { + const newInitialVal = {...initVals}; + Object.keys(initVals).forEach(el => newInitialVal[el] = (invoices)[el]) + setInitialValues(newInitialVal); + } + }, [invoices]) + + const handleSubmit = async (data) => { + await dispatch(update({ id: id, data })) + await router.push('/invoices/invoices-list') + } + + return ( + <> + + {getPageTitle('Edit invoices')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + setInitialValues({...initialValues, 'invoicedate': date})} + /> + + + + + + + + + + + + + + + router.push('/invoices/invoices-list')}/> + + +
+
+
+ + ) +} + +EditInvoicesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default EditInvoicesPage diff --git a/frontend/src/pages/invoices/invoices-list.tsx b/frontend/src/pages/invoices/invoices-list.tsx new file mode 100644 index 0000000..75a8995 --- /dev/null +++ b/frontend/src/pages/invoices/invoices-list.tsx @@ -0,0 +1,130 @@ +import { mdiChartTimelineVariant } from '@mdi/js' +import Head from 'next/head' +import { uniqueId } from 'lodash'; +import React, { ReactElement, useState } from 'react' +import CardBox from '../../components/CardBox' +import LayoutAuthenticated from '../../layouts/Authenticated' +import SectionMain from '../../components/SectionMain' +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' +import { getPageTitle } from '../../config' +import TableInvoices from '../../components/Invoices/TableInvoices' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/invoices/invoicesSlice'; + +const InvoicesTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Currency', title: 'currency'},{label: 'Incomecost', title: 'incomecost'},{label: 'Period', title: 'period'},{label: 'Description', title: 'description'}, + + {label: 'Amountoriginal', title: 'amountoriginal', number: 'true'},{label: 'Amountpln', title: 'amountpln', number: 'true'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getInvoicesCSV = async () => { + const response = await axios({url: '/invoices?filetype=csv', method: 'GET',responseType: 'blob'}); + const type = response.headers['content-type'] + const blob = new Blob([response.data], { type: type }) + const link = document.createElement('a') + link.href = window.URL.createObjectURL(blob) + link.download = 'invoicesCSV.csv' + link.click() + }; + + const onModalConfirm = async () => { + if (!csvFile) return; + await dispatch(uploadCsv(csvFile)); + dispatch(setRefetch(true)); + setCsvFile(null); + setIsModalActive(false); + }; + + const onModalCancel = () => { + setCsvFile(null); + setIsModalActive(false); + }; + + return ( + <> + + {getPageTitle('Invoices')} + + + + {''} + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +InvoicesTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default InvoicesTablesPage diff --git a/frontend/src/pages/invoices/invoices-new.tsx b/frontend/src/pages/invoices/invoices-new.tsx new file mode 100644 index 0000000..7f5878f --- /dev/null +++ b/frontend/src/pages/invoices/invoices-new.tsx @@ -0,0 +1,165 @@ +import { mdiChartTimelineVariant } from '@mdi/js' +import Head from 'next/head' +import React, { ReactElement } from 'react' +import CardBox from '../../components/CardBox' +import LayoutAuthenticated from '../../layouts/Authenticated' +import SectionMain from '../../components/SectionMain' +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' +import { getPageTitle } from '../../config' + +import { Field, Form, Formik } from 'formik' +import FormField from '../../components/FormField' +import BaseDivider from '../../components/BaseDivider' +import BaseButtons from '../../components/BaseButtons' +import BaseButton from '../../components/BaseButton' +import FormCheckRadio from '../../components/FormCheckRadio' +import FormCheckRadioGroup from '../../components/FormCheckRadioGroup' +import { SwitchField } from '../../components/SwitchField' + +import { SelectField } from '../../components/SelectField' +import {RichTextField} from "../../components/RichTextField"; + +import { create } from '../../stores/invoices/invoicesSlice' +import { useAppDispatch } from '../../stores/hooks' +import { useRouter } from 'next/router' + +const initialValues = { + + organizations: '', + + amountoriginal: '', + + currency: '', + + incomecost: '', + + amountpln: '', + + invoicedate: '', + dateInvoicedate: '', + + period: '', + + description: '', + +} + +const InvoicesNew = () => { + const router = useRouter() + const dispatch = useAppDispatch() + + const handleSubmit = async (data) => { + await dispatch(create(data)) + await router.push('/invoices/invoices-list') + } + return ( + <> + + {getPageTitle('New Item')} + + + + {''} + + + handleSubmit(values)} + > +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + router.push('/invoices/invoices-list')}/> + + +
+
+
+ + ) +} + +InvoicesNew.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default InvoicesNew diff --git a/frontend/src/pages/invoices/invoices-table.tsx b/frontend/src/pages/invoices/invoices-table.tsx new file mode 100644 index 0000000..aa12f91 --- /dev/null +++ b/frontend/src/pages/invoices/invoices-table.tsx @@ -0,0 +1,131 @@ +import { mdiChartTimelineVariant } from '@mdi/js' +import Head from 'next/head' +import { uniqueId } from 'lodash'; +import React, { ReactElement, useState } from 'react' +import CardBox from '../../components/CardBox' +import LayoutAuthenticated from '../../layouts/Authenticated' +import SectionMain from '../../components/SectionMain' +import SectionTitleLineWithButton from '../../components/SectionTitleLineWithButton' +import { getPageTitle } from '../../config' +import TableInvoices from '../../components/Invoices/TableInvoices' +import BaseButton from '../../components/BaseButton' +import axios from "axios"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import CardBoxModal from "../../components/CardBoxModal"; +import DragDropFilePicker from "../../components/DragDropFilePicker"; +import {setRefetch, uploadCsv} from '../../stores/invoices/invoicesSlice'; + +const InvoicesTablesPage = () => { + const [filterItems, setFilterItems] = useState([]); + const [csvFile, setCsvFile] = useState(null); + const [isModalActive, setIsModalActive] = useState(false); + + const dispatch = useAppDispatch(); + + const [filters] = useState([{label: 'Currency', title: 'currency'},{label: 'Incomecost', title: 'incomecost'},{label: 'Period', title: 'period'},{label: 'Description', title: 'description'}, + + {label: 'Amountoriginal', title: 'amountoriginal', number: 'true'},{label: 'Amountpln', title: 'amountpln', number: 'true'}, + + ]); + const addFilter = () => { + const newItem = { + id: uniqueId(), + fields: { + filterValue: '', + filterValueFrom: '', + filterValueTo: '', + selectedField: '', + }, + }; + newItem.fields.selectedField = filters[0].title; + setFilterItems([...filterItems, newItem]); + }; + + const getInvoicesCSV = async () => { + const response = await axios({url: '/invoices?filetype=csv', method: 'GET',responseType: 'blob'}); + const type = response.headers['content-type'] + const blob = new Blob([response.data], { type: type }) + const link = document.createElement('a') + link.href = window.URL.createObjectURL(blob) + link.download = 'invoicesCSV.csv' + link.click() + }; + + const onModalConfirm = async () => { + if (!csvFile) return; + await dispatch(uploadCsv(csvFile)); + dispatch(setRefetch(true)); + setCsvFile(null); + setIsModalActive(false); + }; + + const onModalCancel = () => { + setCsvFile(null); + setIsModalActive(false); + }; + + return ( + <> + + {getPageTitle('Invoices')} + + + + {''} + + + + + + + setIsModalActive(true)} + /> +
+
+
+
+ + + +
+ + + + + ) +} + +InvoicesTablesPage.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default InvoicesTablesPage diff --git a/frontend/src/pages/invoices/invoices-view.tsx b/frontend/src/pages/invoices/invoices-view.tsx new file mode 100644 index 0000000..f2cf705 --- /dev/null +++ b/frontend/src/pages/invoices/invoices-view.tsx @@ -0,0 +1,125 @@ +import React, { ReactElement, useEffect } from 'react'; +import Head from 'next/head' +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import dayjs from "dayjs"; +import {useAppDispatch, useAppSelector} from "../../stores/hooks"; +import {useRouter} from "next/router"; +import { fetch } from '../../stores/invoices/invoicesSlice' +import dataFormatter from '../../helpers/dataFormatter'; +import LayoutAuthenticated from "../../layouts/Authenticated"; +import {getPageTitle} from "../../config"; +import SectionTitleLineWithButton from "../../components/SectionTitleLineWithButton"; +import SectionMain from "../../components/SectionMain"; +import CardBox from "../../components/CardBox"; +import BaseButton from "../../components/BaseButton"; +import BaseDivider from "../../components/BaseDivider"; +import {mdiChartTimelineVariant} from "@mdi/js"; +import {SwitchField} from "../../components/SwitchField"; +import FormField from "../../components/FormField"; + +const InvoicesView = () => { + const router = useRouter() + const dispatch = useAppDispatch() + const { invoices } = useAppSelector((state) => state.invoices) + + const { id } = router.query; + + function removeLastCharacter(str) { + console.log(str,`str`) + return str.slice(0, -1); + } + + useEffect(() => { + dispatch(fetch({ id })); + }, [dispatch, id]); + + return ( + <> + + {getPageTitle('View invoices')} + + + + + + + +
+

organizations

+ +

{invoices?.organizations?.name ?? 'No data'}

+ +
+ +
+

Amountoriginal

+

{invoices?.amountoriginal || 'No data'}

+
+ +
+

Currency

+

{invoices?.currency}

+
+ +
+

Incomecost

+

{invoices?.incomecost}

+
+ +
+

Amountpln

+

{invoices?.amountpln || 'No data'}

+
+ + + {invoices.invoicedate ? ( + + ) :

No Invoicedate

} +
+ +
+

Period

+

{invoices?.period}

+
+ +
+

Description

+

{invoices?.description}

+
+ + + + router.push('/invoices/invoices-list')} + /> +
+
+ + ); +}; + +InvoicesView.getLayout = function getLayout(page: ReactElement) { + return ( + + {page} + + ) +} + +export default InvoicesView; diff --git a/frontend/src/pages/organizations/organizations-view.tsx b/frontend/src/pages/organizations/organizations-view.tsx index 39a7045..3f62b1f 100644 --- a/frontend/src/pages/organizations/organizations-view.tsx +++ b/frontend/src/pages/organizations/organizations-view.tsx @@ -444,6 +444,75 @@ const OrganizationsView = () => { + <> +

Invoices organizations

+ +
+ + + + + + + + + + + + + + + + + + + + + + {organizations.invoices_organizations && Array.isArray(organizations.invoices_organizations) && + organizations.invoices_organizations.map((item: any) => ( + router.push(`/invoices/invoices-view/?id=${item.id}`)}> + + + + + + + + + + + + + + + + + ))} + +
AmountoriginalCurrencyIncomecostAmountplnInvoicedatePeriodDescription
+ { item.amountoriginal } + + { item.currency } + + { item.incomecost } + + { item.amountpln } + + { dataFormatter.dateFormatter(item.invoicedate) } + + { item.period } + + { item.description } +
+
+ {!organizations?.invoices_organizations?.length &&
No data
} +
+ + { + const { id, query } = data + const result = await axios.get( + `invoices${ + query || (id ? `/${id}` : '') + }` + ) + return id ? result.data : {rows: result.data.rows, count: result.data.count}; +}) + +export const deleteItemsByIds = createAsyncThunk( + 'invoices/deleteByIds', + async (data: any, { rejectWithValue }) => { + try { + await axios.post('invoices/deleteByIds', { data }); + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const deleteItem = createAsyncThunk('invoices/deleteInvoices', async (id: string, { rejectWithValue }) => { + try { + await axios.delete(`invoices/${id}`) + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } +}) + +export const create = createAsyncThunk('invoices/createInvoices', async (data: any, { rejectWithValue }) => { + try { + const result = await axios.post( + 'invoices', + { data } + ) + return result.data + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } +}) + +export const uploadCsv = createAsyncThunk( + 'invoices/uploadCsv', + async (file: File, { rejectWithValue }) => { + try { + const data = new FormData(); + data.append('file', file); + data.append('filename', file.name); + + const result = await axios.post('invoices/bulk-import', data, { + headers: { + 'Content-Type': 'multipart/form-data', + }, + }); + + return result.data; + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } + }, +); + +export const update = createAsyncThunk('invoices/updateInvoices', async (payload: any, { rejectWithValue }) => { + try { + const result = await axios.put( + `invoices/${payload.id}`, + { id: payload.id, data: payload.data } + ) + return result.data + } catch (error) { + if (!error.response) { + throw error; + } + + return rejectWithValue(error.response.data); + } +}) + +export const invoicesSlice = createSlice({ + name: 'invoices', + initialState, + reducers: { + setRefetch: (state, action: PayloadAction) => { + state.refetch = action.payload; + }, + }, + extraReducers: (builder) => { + builder.addCase(fetch.pending, (state) => { + state.loading = true + resetNotify(state); + }) + builder.addCase(fetch.rejected, (state, action) => { + state.loading = false + rejectNotify(state, action); + }) + + builder.addCase(fetch.fulfilled, (state, action) => { + if (action.payload.rows && action.payload.count >= 0) { + state.invoices = action.payload.rows; + state.count = action.payload.count; + } else { + state.invoices = action.payload; + } + state.loading = false + }) + + builder.addCase(deleteItemsByIds.pending, (state) => { + state.loading = true; + resetNotify(state); + }); + + builder.addCase(deleteItemsByIds.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, 'Invoices has been deleted'); + }); + + builder.addCase(deleteItemsByIds.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }); + + builder.addCase(deleteItem.pending, (state) => { + state.loading = true + resetNotify(state); + }) + + builder.addCase(deleteItem.fulfilled, (state) => { + state.loading = false + fulfilledNotify(state, `${'Invoices'.slice(0, -1)} has been deleted`); + }) + + builder.addCase(deleteItem.rejected, (state, action) => { + state.loading = false + rejectNotify(state, action); + }) + + builder.addCase(create.pending, (state) => { + state.loading = true + resetNotify(state); + }) + builder.addCase(create.rejected, (state, action) => { + state.loading = false + rejectNotify(state, action); + }) + + builder.addCase(create.fulfilled, (state) => { + state.loading = false + fulfilledNotify(state, `${'Invoices'.slice(0, -1)} has been created`); + }) + + builder.addCase(update.pending, (state) => { + state.loading = true + resetNotify(state); + }) + builder.addCase(update.fulfilled, (state) => { + state.loading = false + fulfilledNotify(state, `${'Invoices'.slice(0, -1)} has been updated`); + }) + builder.addCase(update.rejected, (state, action) => { + state.loading = false + rejectNotify(state, action); + }) + + builder.addCase(uploadCsv.pending, (state) => { + state.loading = true; + resetNotify(state); + }) + builder.addCase(uploadCsv.fulfilled, (state) => { + state.loading = false; + fulfilledNotify(state, 'Invoices has been uploaded'); + }) + builder.addCase(uploadCsv.rejected, (state, action) => { + state.loading = false; + rejectNotify(state, action); + }) + + }, +}) + +// Action creators are generated for each case reducer function + export const { setRefetch } = invoicesSlice.actions + +export default invoicesSlice.reducer diff --git a/frontend/src/stores/store.ts b/frontend/src/stores/store.ts index 7ef0e97..00a6cb0 100644 --- a/frontend/src/stores/store.ts +++ b/frontend/src/stores/store.ts @@ -14,6 +14,7 @@ import work_ordersSlice from "./work_orders/work_ordersSlice"; import rolesSlice from "./roles/rolesSlice"; import permissionsSlice from "./permissions/permissionsSlice"; import organizationsSlice from "./organizations/organizationsSlice"; +import invoicesSlice from "./invoices/invoicesSlice"; export const store = configureStore({ reducer: { @@ -32,6 +33,7 @@ work_orders: work_ordersSlice, roles: rolesSlice, permissions: permissionsSlice, organizations: organizationsSlice, +invoices: invoicesSlice, }, })