@tasenor/common-node 1.9.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/.eslintrc.js +4 -0
  2. package/LICENSE +21 -0
  3. package/dist/tasenor-common-node/src/cli.d.ts +81 -0
  4. package/dist/tasenor-common-node/src/cli.js +242 -0
  5. package/dist/tasenor-common-node/src/cli.js.map +1 -0
  6. package/dist/tasenor-common-node/src/commands/account.d.ts +12 -0
  7. package/dist/tasenor-common-node/src/commands/account.js +58 -0
  8. package/dist/tasenor-common-node/src/commands/account.js.map +1 -0
  9. package/dist/tasenor-common-node/src/commands/balance.d.ts +11 -0
  10. package/dist/tasenor-common-node/src/commands/balance.js +117 -0
  11. package/dist/tasenor-common-node/src/commands/balance.js.map +1 -0
  12. package/dist/tasenor-common-node/src/commands/db.d.ts +14 -0
  13. package/dist/tasenor-common-node/src/commands/db.js +69 -0
  14. package/dist/tasenor-common-node/src/commands/db.js.map +1 -0
  15. package/dist/tasenor-common-node/src/commands/entry.d.ts +13 -0
  16. package/dist/tasenor-common-node/src/commands/entry.js +106 -0
  17. package/dist/tasenor-common-node/src/commands/entry.js.map +1 -0
  18. package/dist/tasenor-common-node/src/commands/import.d.ts +17 -0
  19. package/dist/tasenor-common-node/src/commands/import.js +140 -0
  20. package/dist/tasenor-common-node/src/commands/import.js.map +1 -0
  21. package/dist/tasenor-common-node/src/commands/importer.d.ts +13 -0
  22. package/dist/tasenor-common-node/src/commands/importer.js +71 -0
  23. package/dist/tasenor-common-node/src/commands/importer.js.map +1 -0
  24. package/dist/tasenor-common-node/src/commands/index.d.ts +191 -0
  25. package/dist/tasenor-common-node/src/commands/index.js +482 -0
  26. package/dist/tasenor-common-node/src/commands/index.js.map +1 -0
  27. package/dist/tasenor-common-node/src/commands/period.d.ts +12 -0
  28. package/dist/tasenor-common-node/src/commands/period.js +48 -0
  29. package/dist/tasenor-common-node/src/commands/period.js.map +1 -0
  30. package/dist/tasenor-common-node/src/commands/plugin.d.ts +15 -0
  31. package/dist/tasenor-common-node/src/commands/plugin.js +78 -0
  32. package/dist/tasenor-common-node/src/commands/plugin.js.map +1 -0
  33. package/dist/tasenor-common-node/src/commands/report.d.ts +11 -0
  34. package/dist/tasenor-common-node/src/commands/report.js +96 -0
  35. package/dist/tasenor-common-node/src/commands/report.js.map +1 -0
  36. package/dist/tasenor-common-node/src/commands/settings.d.ts +10 -0
  37. package/dist/tasenor-common-node/src/commands/settings.js +64 -0
  38. package/dist/tasenor-common-node/src/commands/settings.js.map +1 -0
  39. package/dist/tasenor-common-node/src/commands/stock.d.ts +8 -0
  40. package/dist/tasenor-common-node/src/commands/stock.js +73 -0
  41. package/dist/tasenor-common-node/src/commands/stock.js.map +1 -0
  42. package/dist/tasenor-common-node/src/commands/tag.d.ts +13 -0
  43. package/dist/tasenor-common-node/src/commands/tag.js +89 -0
  44. package/dist/tasenor-common-node/src/commands/tag.js.map +1 -0
  45. package/dist/tasenor-common-node/src/commands/tx.d.ts +12 -0
  46. package/dist/tasenor-common-node/src/commands/tx.js +81 -0
  47. package/dist/tasenor-common-node/src/commands/tx.js.map +1 -0
  48. package/dist/tasenor-common-node/src/commands/user.d.ts +12 -0
  49. package/dist/tasenor-common-node/src/commands/user.js +52 -0
  50. package/dist/tasenor-common-node/src/commands/user.js.map +1 -0
  51. package/dist/tasenor-common-node/src/database/BookkeeperImporter.d.ts +77 -0
  52. package/dist/tasenor-common-node/src/database/BookkeeperImporter.js +343 -0
  53. package/dist/tasenor-common-node/src/database/BookkeeperImporter.js.map +1 -0
  54. package/dist/tasenor-common-node/src/database/DB.d.ts +51 -0
  55. package/dist/tasenor-common-node/src/database/DB.js +354 -0
  56. package/dist/tasenor-common-node/src/database/DB.js.map +1 -0
  57. package/dist/tasenor-common-node/src/database/index.d.ts +7 -0
  58. package/dist/tasenor-common-node/src/database/index.js +8 -0
  59. package/dist/tasenor-common-node/src/database/index.js.map +1 -0
  60. package/dist/tasenor-common-node/src/doccer.d.ts +29 -0
  61. package/dist/tasenor-common-node/src/doccer.js +30 -0
  62. package/dist/tasenor-common-node/src/doccer.js.map +1 -0
  63. package/dist/tasenor-common-node/src/error.d.ts +30 -0
  64. package/dist/tasenor-common-node/src/error.js +35 -0
  65. package/dist/tasenor-common-node/src/error.js.map +1 -0
  66. package/dist/tasenor-common-node/src/export/Exporter.d.ts +69 -0
  67. package/dist/tasenor-common-node/src/export/Exporter.js +123 -0
  68. package/dist/tasenor-common-node/src/export/Exporter.js.map +1 -0
  69. package/dist/tasenor-common-node/src/export/TasenorExporter.d.ts +55 -0
  70. package/dist/tasenor-common-node/src/export/TasenorExporter.js +135 -0
  71. package/dist/tasenor-common-node/src/export/TasenorExporter.js.map +1 -0
  72. package/dist/tasenor-common-node/src/export/TilitinExporter.d.ts +71 -0
  73. package/dist/tasenor-common-node/src/export/TilitinExporter.js +290 -0
  74. package/dist/tasenor-common-node/src/export/TilitinExporter.js.map +1 -0
  75. package/dist/tasenor-common-node/src/export/index.d.ts +8 -0
  76. package/dist/tasenor-common-node/src/export/index.js +9 -0
  77. package/dist/tasenor-common-node/src/export/index.js.map +1 -0
  78. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.d.ts +104 -0
  79. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js +354 -0
  80. package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js.map +1 -0
  81. package/dist/tasenor-common-node/src/import/TransactionImportConnector.d.ts +38 -0
  82. package/dist/tasenor-common-node/src/import/TransactionImportConnector.js +27 -0
  83. package/dist/tasenor-common-node/src/import/TransactionImportConnector.js.map +1 -0
  84. package/dist/tasenor-common-node/src/import/TransactionImportHandler.d.ts +173 -0
  85. package/dist/tasenor-common-node/src/import/TransactionImportHandler.js +733 -0
  86. package/dist/tasenor-common-node/src/import/TransactionImportHandler.js.map +1 -0
  87. package/dist/tasenor-common-node/src/import/TransactionRules.d.ts +238 -0
  88. package/dist/tasenor-common-node/src/import/TransactionRules.js +522 -0
  89. package/dist/tasenor-common-node/src/import/TransactionRules.js.map +1 -0
  90. package/dist/tasenor-common-node/src/import/TransactionUI.d.ts +181 -0
  91. package/dist/tasenor-common-node/src/import/TransactionUI.js +482 -0
  92. package/dist/tasenor-common-node/src/import/TransactionUI.js.map +1 -0
  93. package/dist/tasenor-common-node/src/import/TransferAnalyzer.d.ts +324 -0
  94. package/dist/tasenor-common-node/src/import/TransferAnalyzer.js +1379 -0
  95. package/dist/tasenor-common-node/src/import/TransferAnalyzer.js.map +1 -0
  96. package/dist/tasenor-common-node/src/import/index.d.ts +11 -0
  97. package/dist/tasenor-common-node/src/import/index.js +12 -0
  98. package/dist/tasenor-common-node/src/import/index.js.map +1 -0
  99. package/dist/tasenor-common-node/src/index.d.ts +12 -0
  100. package/dist/tasenor-common-node/src/index.js +13 -0
  101. package/dist/tasenor-common-node/src/index.js.map +1 -0
  102. package/dist/tasenor-common-node/src/net/crypto.d.ts +33 -0
  103. package/dist/tasenor-common-node/src/net/crypto.js +63 -0
  104. package/dist/tasenor-common-node/src/net/crypto.js.map +1 -0
  105. package/dist/tasenor-common-node/src/net/git.d.ts +49 -0
  106. package/dist/tasenor-common-node/src/net/git.js +137 -0
  107. package/dist/tasenor-common-node/src/net/git.js.map +1 -0
  108. package/dist/tasenor-common-node/src/net/index.d.ts +10 -0
  109. package/dist/tasenor-common-node/src/net/index.js +11 -0
  110. package/dist/tasenor-common-node/src/net/index.js.map +1 -0
  111. package/dist/tasenor-common-node/src/net/middleware.d.ts +61 -0
  112. package/dist/tasenor-common-node/src/net/middleware.js +220 -0
  113. package/dist/tasenor-common-node/src/net/middleware.js.map +1 -0
  114. package/dist/tasenor-common-node/src/net/tokens.d.ts +50 -0
  115. package/dist/tasenor-common-node/src/net/tokens.js +141 -0
  116. package/dist/tasenor-common-node/src/net/tokens.js.map +1 -0
  117. package/dist/tasenor-common-node/src/net/vault.d.ts +67 -0
  118. package/dist/tasenor-common-node/src/net/vault.js +145 -0
  119. package/dist/tasenor-common-node/src/net/vault.js.map +1 -0
  120. package/dist/tasenor-common-node/src/plugins/BackendPlugin.d.ts +91 -0
  121. package/dist/tasenor-common-node/src/plugins/BackendPlugin.js +165 -0
  122. package/dist/tasenor-common-node/src/plugins/BackendPlugin.js.map +1 -0
  123. package/dist/tasenor-common-node/src/plugins/DataPlugin.d.ts +13 -0
  124. package/dist/tasenor-common-node/src/plugins/DataPlugin.js +26 -0
  125. package/dist/tasenor-common-node/src/plugins/DataPlugin.js.map +1 -0
  126. package/dist/tasenor-common-node/src/plugins/ImportPlugin.d.ts +188 -0
  127. package/dist/tasenor-common-node/src/plugins/ImportPlugin.js +204 -0
  128. package/dist/tasenor-common-node/src/plugins/ImportPlugin.js.map +1 -0
  129. package/dist/tasenor-common-node/src/plugins/ReportPlugin.d.ts +132 -0
  130. package/dist/tasenor-common-node/src/plugins/ReportPlugin.js +393 -0
  131. package/dist/tasenor-common-node/src/plugins/ReportPlugin.js.map +1 -0
  132. package/dist/tasenor-common-node/src/plugins/SchemePlugin.d.ts +34 -0
  133. package/dist/tasenor-common-node/src/plugins/SchemePlugin.js +47 -0
  134. package/dist/tasenor-common-node/src/plugins/SchemePlugin.js.map +1 -0
  135. package/dist/tasenor-common-node/src/plugins/ServicePlugin.d.ts +80 -0
  136. package/dist/tasenor-common-node/src/plugins/ServicePlugin.js +168 -0
  137. package/dist/tasenor-common-node/src/plugins/ServicePlugin.js.map +1 -0
  138. package/dist/tasenor-common-node/src/plugins/ToolPlugin.d.ts +27 -0
  139. package/dist/tasenor-common-node/src/plugins/ToolPlugin.js +37 -0
  140. package/dist/tasenor-common-node/src/plugins/ToolPlugin.js.map +1 -0
  141. package/dist/tasenor-common-node/src/plugins/index.d.ts +13 -0
  142. package/dist/tasenor-common-node/src/plugins/index.js +14 -0
  143. package/dist/tasenor-common-node/src/plugins/index.js.map +1 -0
  144. package/dist/tasenor-common-node/src/plugins/plugins.d.ts +101 -0
  145. package/dist/tasenor-common-node/src/plugins/plugins.js +292 -0
  146. package/dist/tasenor-common-node/src/plugins/plugins.js.map +1 -0
  147. package/dist/tasenor-common-node/src/process/Process.d.ts +108 -0
  148. package/dist/tasenor-common-node/src/process/Process.js +335 -0
  149. package/dist/tasenor-common-node/src/process/Process.js.map +1 -0
  150. package/dist/tasenor-common-node/src/process/ProcessConnector.d.ts +24 -0
  151. package/dist/tasenor-common-node/src/process/ProcessConnector.js +28 -0
  152. package/dist/tasenor-common-node/src/process/ProcessConnector.js.map +1 -0
  153. package/dist/tasenor-common-node/src/process/ProcessFile.d.ts +69 -0
  154. package/dist/tasenor-common-node/src/process/ProcessFile.js +145 -0
  155. package/dist/tasenor-common-node/src/process/ProcessFile.js.map +1 -0
  156. package/dist/tasenor-common-node/src/process/ProcessHandler.d.ts +60 -0
  157. package/dist/tasenor-common-node/src/process/ProcessHandler.js +73 -0
  158. package/dist/tasenor-common-node/src/process/ProcessHandler.js.map +1 -0
  159. package/dist/tasenor-common-node/src/process/ProcessStep.d.ts +52 -0
  160. package/dist/tasenor-common-node/src/process/ProcessStep.js +78 -0
  161. package/dist/tasenor-common-node/src/process/ProcessStep.js.map +1 -0
  162. package/dist/tasenor-common-node/src/process/ProcessingSystem.d.ts +60 -0
  163. package/dist/tasenor-common-node/src/process/ProcessingSystem.js +182 -0
  164. package/dist/tasenor-common-node/src/process/ProcessingSystem.js.map +1 -0
  165. package/dist/tasenor-common-node/src/process/index.d.ts +11 -0
  166. package/dist/tasenor-common-node/src/process/index.js +12 -0
  167. package/dist/tasenor-common-node/src/process/index.js.map +1 -0
  168. package/dist/tasenor-common-node/src/reports/conversions.d.ts +8 -0
  169. package/dist/tasenor-common-node/src/reports/conversions.js +47 -0
  170. package/dist/tasenor-common-node/src/reports/conversions.js.map +1 -0
  171. package/dist/tasenor-common-node/src/reports/index.d.ts +6 -0
  172. package/dist/tasenor-common-node/src/reports/index.js +7 -0
  173. package/dist/tasenor-common-node/src/reports/index.js.map +1 -0
  174. package/dist/tasenor-common-node/src/server/ISPDemoServer.d.ts +43 -0
  175. package/dist/tasenor-common-node/src/server/ISPDemoServer.js +112 -0
  176. package/dist/tasenor-common-node/src/server/ISPDemoServer.js.map +1 -0
  177. package/dist/tasenor-common-node/src/server/api.d.ts +15 -0
  178. package/dist/tasenor-common-node/src/server/api.js +27 -0
  179. package/dist/tasenor-common-node/src/server/api.js.map +1 -0
  180. package/dist/tasenor-common-node/src/server/index.d.ts +7 -0
  181. package/dist/tasenor-common-node/src/server/index.js +8 -0
  182. package/dist/tasenor-common-node/src/server/index.js.map +1 -0
  183. package/dist/tasenor-common-node/src/server/router.d.ts +5 -0
  184. package/dist/tasenor-common-node/src/server/router.js +37 -0
  185. package/dist/tasenor-common-node/src/server/router.js.map +1 -0
  186. package/dist/tasenor-common-node/src/system.d.ts +27 -0
  187. package/dist/tasenor-common-node/src/system.js +95 -0
  188. package/dist/tasenor-common-node/src/system.js.map +1 -0
  189. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.d.ts +21 -0
  190. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js +33 -0
  191. package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js.map +1 -0
  192. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.d.ts +24 -0
  193. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js +68 -0
  194. package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js.map +1 -0
  195. package/dist/tasenor-common-node/src/testing/UnitTester.d.ts +64 -0
  196. package/dist/tasenor-common-node/src/testing/UnitTester.js +199 -0
  197. package/dist/tasenor-common-node/src/testing/UnitTester.js.map +1 -0
  198. package/dist/tasenor-common-node/src/testing/index.d.ts +4 -0
  199. package/dist/tasenor-common-node/src/testing/index.js +5 -0
  200. package/dist/tasenor-common-node/src/testing/index.js.map +1 -0
  201. package/dist/tasenor-common-node/src/testing/test-handlers.d.ts +13 -0
  202. package/dist/tasenor-common-node/src/testing/test-handlers.js +52 -0
  203. package/dist/tasenor-common-node/src/testing/test-handlers.js.map +1 -0
  204. package/dist/tasenor-common-node/tests/TransactionRules.spec.d.ts +1 -0
  205. package/dist/tasenor-common-node/tests/TransactionRules.spec.js +64 -0
  206. package/dist/tasenor-common-node/tests/TransactionRules.spec.js.map +1 -0
  207. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.d.ts +1 -0
  208. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js +80 -0
  209. package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js.map +1 -0
  210. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.d.ts +1 -0
  211. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js +342 -0
  212. package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js.map +1 -0
  213. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.d.ts +1 -0
  214. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js +174 -0
  215. package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js.map +1 -0
  216. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.d.ts +1 -0
  217. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js +175 -0
  218. package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js.map +1 -0
  219. package/dist/tasenor-common-node/tests/password.spec.d.ts +1 -0
  220. package/dist/tasenor-common-node/tests/password.spec.js +8 -0
  221. package/dist/tasenor-common-node/tests/password.spec.js.map +1 -0
  222. package/dist/tasenor-common-node/tests/tokens.spec.d.ts +1 -0
  223. package/dist/tasenor-common-node/tests/tokens.spec.js +49 -0
  224. package/dist/tasenor-common-node/tests/tokens.spec.js.map +1 -0
  225. package/dist/tasenor-common-node/tests/vault.spec.d.ts +1 -0
  226. package/dist/tasenor-common-node/tests/vault.spec.js +19 -0
  227. package/dist/tasenor-common-node/tests/vault.spec.js.map +1 -0
  228. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.d.ts +11 -0
  229. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js +30 -0
  230. package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -0
  231. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.d.ts +5 -0
  232. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js +350 -0
  233. package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js.map +1 -0
  234. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.d.ts +23 -0
  235. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js +83 -0
  236. package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js.map +1 -0
  237. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.d.ts +28 -0
  238. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js +340 -0
  239. package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js.map +1 -0
  240. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.d.ts +11 -0
  241. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js +39 -0
  242. package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js.map +1 -0
  243. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.d.ts +17 -0
  244. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js +66 -0
  245. package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js.map +1 -0
  246. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.d.ts +13 -0
  247. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js +241 -0
  248. package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js.map +1 -0
  249. package/jest.config.js +1 -0
  250. package/package.json +62 -0
  251. package/src/cli.ts +267 -0
  252. package/src/commands/account.ts +69 -0
  253. package/src/commands/balance.ts +131 -0
  254. package/src/commands/db.ts +84 -0
  255. package/src/commands/entry.ts +117 -0
  256. package/src/commands/import.ts +160 -0
  257. package/src/commands/importer.ts +84 -0
  258. package/src/commands/index.ts +534 -0
  259. package/src/commands/period.ts +59 -0
  260. package/src/commands/plugin.ts +95 -0
  261. package/src/commands/report.ts +113 -0
  262. package/src/commands/settings.ts +75 -0
  263. package/src/commands/stock.ts +80 -0
  264. package/src/commands/tag.ts +102 -0
  265. package/src/commands/tx.ts +93 -0
  266. package/src/commands/user.ts +65 -0
  267. package/src/database/BookkeeperImporter.ts +358 -0
  268. package/src/database/DB.ts +396 -0
  269. package/src/database/index.ts +7 -0
  270. package/src/doccer.ts +29 -0
  271. package/src/error.ts +32 -0
  272. package/src/export/Exporter.ts +136 -0
  273. package/src/export/TasenorExporter.ts +144 -0
  274. package/src/export/TilitinExporter.ts +302 -0
  275. package/src/export/index.ts +8 -0
  276. package/src/import/TextFileProcessHandler.ts +384 -0
  277. package/src/import/TransactionImportConnector.ts +65 -0
  278. package/src/import/TransactionImportHandler.ts +819 -0
  279. package/src/import/TransactionRules.ts +570 -0
  280. package/src/import/TransactionUI.ts +520 -0
  281. package/src/import/TransferAnalyzer.ts +1450 -0
  282. package/src/import/index.ts +11 -0
  283. package/src/index.ts +12 -0
  284. package/src/net/crypto.ts +69 -0
  285. package/src/net/git.ts +151 -0
  286. package/src/net/index.ts +10 -0
  287. package/src/net/middleware.ts +261 -0
  288. package/src/net/tokens.ts +140 -0
  289. package/src/net/vault.ts +161 -0
  290. package/src/plugins/BackendPlugin.ts +188 -0
  291. package/src/plugins/DataPlugin.ts +29 -0
  292. package/src/plugins/ImportPlugin.ts +211 -0
  293. package/src/plugins/ReportPlugin.ts +443 -0
  294. package/src/plugins/SchemePlugin.ts +56 -0
  295. package/src/plugins/ServicePlugin.ts +188 -0
  296. package/src/plugins/ToolPlugin.ts +44 -0
  297. package/src/plugins/index.ts +13 -0
  298. package/src/plugins/plugins.ts +345 -0
  299. package/src/process/Process.ts +368 -0
  300. package/src/process/ProcessConnector.ts +45 -0
  301. package/src/process/ProcessFile.ts +169 -0
  302. package/src/process/ProcessHandler.ts +94 -0
  303. package/src/process/ProcessStep.ts +100 -0
  304. package/src/process/ProcessingSystem.ts +202 -0
  305. package/src/process/index.ts +11 -0
  306. package/src/reports/conversions.ts +52 -0
  307. package/src/reports/index.ts +6 -0
  308. package/src/server/ISPDemoServer.ts +122 -0
  309. package/src/server/api.ts +37 -0
  310. package/src/server/index.ts +7 -0
  311. package/src/server/router.ts +60 -0
  312. package/src/system.ts +96 -0
  313. package/src/testing/ProcessingSystemMock.ts +45 -0
  314. package/src/testing/UnitTestImportConnector.ts +86 -0
  315. package/src/testing/UnitTester.ts +231 -0
  316. package/src/testing/index.ts +4 -0
  317. package/src/testing/test-handlers.ts +55 -0
  318. package/tests/TransactionRules.spec.ts +73 -0
  319. package/tests/TransferAnalyzer-account-address.spec.ts +87 -0
  320. package/tests/TransferAnalyzer-buying-and-selling.spec.ts +354 -0
  321. package/tests/TransferAnalyzer-loans.spec.ts +197 -0
  322. package/tests/TransferAnalyzer-multiple-null-amounts.spec.ts +181 -0
  323. package/tests/password.spec.ts +8 -0
  324. package/tests/tokens.spec.ts +52 -0
  325. package/tests/vault.spec.ts +20 -0
  326. package/tsconfig.json +13 -0
@@ -0,0 +1,358 @@
1
+ import glob from 'fast-glob'
2
+ import path from 'path'
3
+ import fs from 'fs'
4
+ import { system } from '..'
5
+ import { log, BookkeeperConfig, DirectoryPath, Hostname, ProcessedTsvFileData, TarFilePath, TextFilePath, TsvFilePath, error, FilePath } from '@dataplug/tasenor-common'
6
+ import { DB, KnexDatabase } from './DB'
7
+ import { create } from 'ts-opaque'
8
+
9
+ /**
10
+ * Implementation of the database backup file reading.
11
+ */
12
+ export class BookkeeperImporter {
13
+
14
+ VERSION: number | null = null
15
+
16
+ /**
17
+ * Read in a TSV-file and construct list of objects.
18
+ * @param file Path to the TSV-file.
19
+ * @returns List of objects using texts in header line as keys.
20
+ */
21
+ async readTsv(file: TsvFilePath): Promise<ProcessedTsvFileData> {
22
+ log(`Reading ${file}.`)
23
+ const content = fs.readFileSync(file).toString('utf-8').trim()
24
+ const lines = content.split('\n').map(s => s.split('\t'))
25
+ const headers = lines[0]
26
+ headers[0] = headers[0].replace(/^#\s+/, '')
27
+ const objects: Record<string, string>[] = []
28
+ for (let i = 1; i < lines.length; i++) {
29
+ const obj = {}
30
+ for (let j = 0; j < headers.length; j++) {
31
+ obj[headers[j]] = lines[i][j] || ''
32
+ }
33
+ objects.push(obj)
34
+ }
35
+ return objects
36
+ }
37
+
38
+ /**
39
+ * Read the version number from the file.
40
+ * @param file Path to the version file.
41
+ */
42
+ setVersion(file: TextFilePath): void {
43
+ this.VERSION = JSON.parse(fs.readFileSync(file).toString('utf-8'))
44
+ log(`Found file format version ${this.VERSION}.`)
45
+ }
46
+
47
+ /**
48
+ * Read the account information from the tsv file.
49
+ * @param file A tsv file to read.
50
+ */
51
+ async readAccountTsv(file: TsvFilePath): Promise<Record<string, unknown>[]> {
52
+ const match = /([a-z][a-z])-([A-Z][A-Z][A-Z])\.tsv$/.exec(file)
53
+ if (!match) {
54
+ throw new Error(`File name ${file} has not correct format.`)
55
+ }
56
+ const entries: Record<string, unknown>[] = []
57
+ const [, language, currency] = match
58
+ const accounts = await this.readTsv(file)
59
+ let headings: Record<string, unknown>[] = []
60
+ for (const account of accounts) {
61
+
62
+ if (account.text !== '') {
63
+ const code = (!account.code
64
+ ? null
65
+ : (
66
+ // Allow numeric VAT as well.
67
+ /^\d+(\.\d+)$/.test(account.code) ? account.code : account.code.replace(/^_+/, '')
68
+ ))
69
+ let data: Record<string, unknown>
70
+ try {
71
+ data = account.data === undefined || account.data === '' ? {} : JSON.parse(account.data)
72
+ } catch (err) {
73
+ throw new Error(`Parsing account data failed: ${account.data}.`)
74
+ }
75
+ if (code !== null) {
76
+ data.code = code
77
+ }
78
+
79
+ // Verision 1.
80
+ if (this.VERSION === 1) {
81
+ const flags = new Set(account.flags ? account.flags.split(' ') : [])
82
+ if (flags.has('FAVOURITE')) {
83
+ data.favourite = true
84
+ }
85
+ }
86
+
87
+ const entry = {
88
+ language,
89
+ currency,
90
+ number: account['number / title'],
91
+ name: account.text,
92
+ type: account.type,
93
+ data
94
+ }
95
+ if (headings.length) {
96
+ for (const heading of headings) {
97
+ heading.number = entry.number
98
+ entries.push(heading)
99
+ }
100
+ headings = []
101
+ }
102
+ entries.push(entry)
103
+ } else {
104
+ const spaces = /^(_*)/.exec(account['number / title'])
105
+ const entry = {
106
+ text: account['number / title'].replace(/^_+/, ''),
107
+ number: null,
108
+ level: spaces ? spaces[1].length : 0
109
+ }
110
+ headings.push(entry)
111
+ }
112
+ }
113
+ return entries
114
+ }
115
+
116
+ /**
117
+ * Read the account information in to the database.
118
+ * @param db Database connection.
119
+ * @param files A list of files to read.
120
+ */
121
+ async setAccounts(db: KnexDatabase, files: TsvFilePath[]): Promise<void> {
122
+ let count = 0
123
+ for (const file of files) {
124
+ const accounts = await this.readAccountTsv(file)
125
+ for (const entry of accounts) {
126
+ if (entry.text) {
127
+ await db('heading').insert(entry).catch(err => {
128
+ error(`Failed to insert a heading ${JSON.stringify(entry)}`)
129
+ throw err
130
+ })
131
+ } else {
132
+ await db('account').insert(entry).catch(err => {
133
+ error(`Failed to insert an account ${JSON.stringify(entry)}`)
134
+ throw err
135
+ })
136
+ }
137
+ count++
138
+ }
139
+ }
140
+ log(`Inserted ${count} rows to the database.`)
141
+ }
142
+
143
+ /**
144
+ * Read the period information in to the database.
145
+ * @param db Database connection.
146
+ * @param file Path to the period file.
147
+ */
148
+ async setPeriods(db, file: TsvFilePath): Promise<void> {
149
+ log(`Reading period file ${file}.`)
150
+ let count = 0
151
+ const periods = await this.readTsv(file)
152
+ for (const period of periods) {
153
+ const entry = {
154
+ start_date: period.start,
155
+ end_date: period.end,
156
+ locked: period.flags === 'LOCKED'
157
+ }
158
+ await db('period').insert(entry)
159
+ count++
160
+ }
161
+ log(`Inserted ${count} rows to the database.`)
162
+ }
163
+
164
+ /**
165
+ * Read and store all documents and entries found from the TSV-file.
166
+ * @param db Database connection.
167
+ * @param file Path to the transaction file.
168
+ * @param conf Database configuration.
169
+ */
170
+ async setEntries(db: KnexDatabase, file: TsvFilePath, conf: BookkeeperConfig): Promise<void> {
171
+ log(`Reading entry file ${file}.`)
172
+ let count = 0
173
+ const periods = await db('period').select('id').orderBy('start_date')
174
+ const periodMap = {}
175
+ const accounts = await db('account').select('id', 'number').where({ language: conf.language })
176
+ const accountMap = accounts.reduce((prev, cur) => ({ [cur.number]: cur.id, ...prev }), {})
177
+
178
+ let n = 1
179
+ for (const period of periods) {
180
+ periodMap[n++] = period.id
181
+ }
182
+ const data = await this.readTsv(file)
183
+ let periodId, docId, rowNumber
184
+ for (const line of data) {
185
+ // Period line.
186
+ const check = /^Period (\d+)/.exec(line.number)
187
+ if (check) {
188
+ periodId = periodMap[parseInt(check[1])]
189
+ if (!periodId) {
190
+ throw Error(`Inconsistent periods. Cannot find period number ${n}.`)
191
+ }
192
+ continue
193
+ }
194
+ // Document line.
195
+ if (line.number !== '') {
196
+ const entry = {
197
+ period_id: periodId,
198
+ number: parseInt(line.number),
199
+ date: line['date / account']
200
+ }
201
+ docId = (await db('document').insert(entry).returning('id'))[0].id
202
+ count++
203
+ rowNumber = 1
204
+ continue
205
+ }
206
+ // Entry line.
207
+ if (!accountMap[line['date / account']]) {
208
+ throw Error(`Inconsistent accounts. Cannot account find number ${line['date / account']}.`)
209
+ }
210
+ const amount = parseFloat(line.amount)
211
+ const data: Record<string, unknown> = {}
212
+
213
+ // Version 1.
214
+ if (this.VERSION === 1) {
215
+ const flags = new Set(line.flags.split(' '))
216
+ if (flags.has('VAT_IGNORE') || flags.has('VAT_RECONCILED')) {
217
+ if (flags.has('VAT_IGNORE')) {
218
+ data.VAT = { ignore: true }
219
+ }
220
+ if (flags.has('VAT_RECONCILED')) {
221
+ data.VAT = { ...(data.VAT || {}), reconciled: true }
222
+ }
223
+ }
224
+ // Version 2.
225
+ } else if (this.VERSION === 2) {
226
+ Object.assign(data, JSON.parse(line.data))
227
+ }
228
+
229
+ const entry = {
230
+ document_id: docId,
231
+ account_id: accountMap[line['date / account']],
232
+ debit: !(amount < 0),
233
+ amount: Math.abs(amount),
234
+ description: line.text,
235
+ row_number: rowNumber,
236
+ data
237
+ }
238
+ rowNumber++
239
+ await db('entry').insert(entry).catch(err => {
240
+ error(`Failed to insert an entry ${JSON.stringify(entry)}`)
241
+ throw err
242
+ })
243
+ count++
244
+ }
245
+ log(`Inserted ${count} rows to the database.`)
246
+ }
247
+
248
+ /**
249
+ * Set the configuration for database.
250
+ * @param db Database connection.
251
+ * @param name Name of the database to update.
252
+ * @param conf Database configuration.
253
+ */
254
+ async setConfig(db: KnexDatabase, config: BookkeeperConfig): Promise<void> {
255
+ log('Saving configuration.')
256
+ // Transform deep structures to dot-names.
257
+ const transform = (config: object, prefix = ''): object => {
258
+ const ret = {}
259
+ Object.keys(config).forEach(k => {
260
+ if (config[k] !== null && typeof config[k] === 'object' && config[k].length === undefined) {
261
+ Object.assign(ret, transform(config[k], `${k}.`))
262
+ } else {
263
+ ret[`${prefix}${k}`] = config[k]
264
+ }
265
+ })
266
+ return ret
267
+ }
268
+ // Save all.
269
+ for (const [k, v] of Object.entries(transform(config))) {
270
+ await db('settings').insert({ name: k, value: JSON.stringify(v) })
271
+ }
272
+ }
273
+
274
+ /**
275
+ * Read in tag data and files from the backup.
276
+ * @param db Database connection.
277
+ * @param file Path to the tag file. Also its directory is assumed where images can be found.
278
+ */
279
+ async setTags(db: KnexDatabase, file: TsvFilePath): Promise<void> {
280
+ log(`Reading tag file ${file}.`)
281
+ const picPath = path.dirname(file)
282
+ let count = 0
283
+ const tags = await this.readTsv(file)
284
+ for (const tag of tags) {
285
+ const pic = fs.readFileSync(path.join(picPath, tag.picture))
286
+ const entry = {
287
+ tag: tag.tag,
288
+ name: tag.name,
289
+ mime: tag.mime,
290
+ picture: pic,
291
+ type: tag.type,
292
+ order: tag.order
293
+ }
294
+ await db('tags').insert(entry)
295
+ count++
296
+ }
297
+ log(`Inserted ${count} rows to the database.`)
298
+ }
299
+
300
+ /**
301
+ * Remove all data from all tables.
302
+ * @param db Database connection.
303
+ */
304
+ async clearEverything(db: KnexDatabase): Promise<void> {
305
+ log('Deleting all existing data.')
306
+ await db('entry').del()
307
+ await db('document').del()
308
+ await db('account').del()
309
+ await db('heading').del()
310
+ await db('period').del()
311
+ await db('tags').del()
312
+ await db('settings').del()
313
+ }
314
+
315
+ /**
316
+ * Clear the given database and restore everything from the directory.
317
+ * @param masterDb Master DB connection.
318
+ * @param dbName Name of the database to use.
319
+ * @param out The directory containing unpacked backup.
320
+ * @param hostOverride If set, use this hostname instead of the one in database, when connecting to target DB.
321
+ */
322
+ async restore(masterDb: KnexDatabase, dbName: string, out: DirectoryPath, hostOverride: Hostname | null = null): Promise<void> {
323
+ const userDb = await DB.get(masterDb, create(dbName), hostOverride)
324
+
325
+ this.setVersion(create(path.join(out, 'VERSION')))
326
+ const conf = JSON.parse(fs.readFileSync(path.join(out, 'settings.json')).toString('utf-8'))
327
+ if (!conf.language) {
328
+ throw new Error('Configuration does not have language.')
329
+ }
330
+ await this.clearEverything(userDb)
331
+ await this.setConfig(userDb, conf)
332
+ const files = glob.sync(path.join(out, 'accounts', '*'))
333
+ await this.setAccounts(userDb, files as FilePath[])
334
+ const periodsPath = path.join(out, 'periods.tsv')
335
+ await this.setPeriods(userDb, create(periodsPath))
336
+ const entriesPath = path.join(out, 'entries.tsv')
337
+ await this.setEntries(userDb, create(entriesPath), conf)
338
+ const tagsPath = path.join(out, 'tags.tsv')
339
+ await this.setTags(userDb, create(tagsPath))
340
+ }
341
+
342
+ /**
343
+ * Clear the given database and restore everything from the directory.
344
+ * @param masterDb Master DB connection.
345
+ * @param dbName Name of the database to use.
346
+ * @param out The directory containing unpacked backup.
347
+ * @param hostOverride If set, use this hostname instead of the one in database, when connecting to target DB.
348
+ */
349
+ async run(masterDb: KnexDatabase, dbName: string, tarPath: TarFilePath, out: DirectoryPath, hostOverride: Hostname | null = null) {
350
+ tarPath = create(path.resolve(tarPath))
351
+ if (!fs.existsSync(tarPath)) {
352
+ throw new Error(`Backup ${tarPath} does not exist.`)
353
+ }
354
+ await system(`cd "${out}" && tar xf "${tarPath}"`)
355
+ await this.restore(masterDb, dbName, out, hostOverride)
356
+ await system(`rm -fr "${out}"`)
357
+ }
358
+ }