@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.
- package/.eslintrc.js +4 -0
- package/LICENSE +21 -0
- package/dist/tasenor-common-node/src/cli.d.ts +81 -0
- package/dist/tasenor-common-node/src/cli.js +242 -0
- package/dist/tasenor-common-node/src/cli.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/account.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/account.js +58 -0
- package/dist/tasenor-common-node/src/commands/account.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/balance.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/balance.js +117 -0
- package/dist/tasenor-common-node/src/commands/balance.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/db.d.ts +14 -0
- package/dist/tasenor-common-node/src/commands/db.js +69 -0
- package/dist/tasenor-common-node/src/commands/db.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/entry.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/entry.js +106 -0
- package/dist/tasenor-common-node/src/commands/entry.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/import.d.ts +17 -0
- package/dist/tasenor-common-node/src/commands/import.js +140 -0
- package/dist/tasenor-common-node/src/commands/import.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/importer.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/importer.js +71 -0
- package/dist/tasenor-common-node/src/commands/importer.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/index.d.ts +191 -0
- package/dist/tasenor-common-node/src/commands/index.js +482 -0
- package/dist/tasenor-common-node/src/commands/index.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/period.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/period.js +48 -0
- package/dist/tasenor-common-node/src/commands/period.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/plugin.d.ts +15 -0
- package/dist/tasenor-common-node/src/commands/plugin.js +78 -0
- package/dist/tasenor-common-node/src/commands/plugin.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/report.d.ts +11 -0
- package/dist/tasenor-common-node/src/commands/report.js +96 -0
- package/dist/tasenor-common-node/src/commands/report.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/settings.d.ts +10 -0
- package/dist/tasenor-common-node/src/commands/settings.js +64 -0
- package/dist/tasenor-common-node/src/commands/settings.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/stock.d.ts +8 -0
- package/dist/tasenor-common-node/src/commands/stock.js +73 -0
- package/dist/tasenor-common-node/src/commands/stock.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tag.d.ts +13 -0
- package/dist/tasenor-common-node/src/commands/tag.js +89 -0
- package/dist/tasenor-common-node/src/commands/tag.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/tx.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/tx.js +81 -0
- package/dist/tasenor-common-node/src/commands/tx.js.map +1 -0
- package/dist/tasenor-common-node/src/commands/user.d.ts +12 -0
- package/dist/tasenor-common-node/src/commands/user.js +52 -0
- package/dist/tasenor-common-node/src/commands/user.js.map +1 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.d.ts +77 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js +343 -0
- package/dist/tasenor-common-node/src/database/BookkeeperImporter.js.map +1 -0
- package/dist/tasenor-common-node/src/database/DB.d.ts +51 -0
- package/dist/tasenor-common-node/src/database/DB.js +354 -0
- package/dist/tasenor-common-node/src/database/DB.js.map +1 -0
- package/dist/tasenor-common-node/src/database/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/database/index.js +8 -0
- package/dist/tasenor-common-node/src/database/index.js.map +1 -0
- package/dist/tasenor-common-node/src/doccer.d.ts +29 -0
- package/dist/tasenor-common-node/src/doccer.js +30 -0
- package/dist/tasenor-common-node/src/doccer.js.map +1 -0
- package/dist/tasenor-common-node/src/error.d.ts +30 -0
- package/dist/tasenor-common-node/src/error.js +35 -0
- package/dist/tasenor-common-node/src/error.js.map +1 -0
- package/dist/tasenor-common-node/src/export/Exporter.d.ts +69 -0
- package/dist/tasenor-common-node/src/export/Exporter.js +123 -0
- package/dist/tasenor-common-node/src/export/Exporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.d.ts +55 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js +135 -0
- package/dist/tasenor-common-node/src/export/TasenorExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.d.ts +71 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js +290 -0
- package/dist/tasenor-common-node/src/export/TilitinExporter.js.map +1 -0
- package/dist/tasenor-common-node/src/export/index.d.ts +8 -0
- package/dist/tasenor-common-node/src/export/index.js +9 -0
- package/dist/tasenor-common-node/src/export/index.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.d.ts +104 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js +354 -0
- package/dist/tasenor-common-node/src/import/TextFileProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.d.ts +38 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js +27 -0
- package/dist/tasenor-common-node/src/import/TransactionImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.d.ts +173 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js +733 -0
- package/dist/tasenor-common-node/src/import/TransactionImportHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.d.ts +238 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js +522 -0
- package/dist/tasenor-common-node/src/import/TransactionRules.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.d.ts +181 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js +482 -0
- package/dist/tasenor-common-node/src/import/TransactionUI.js.map +1 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.d.ts +324 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js +1379 -0
- package/dist/tasenor-common-node/src/import/TransferAnalyzer.js.map +1 -0
- package/dist/tasenor-common-node/src/import/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/import/index.js +12 -0
- package/dist/tasenor-common-node/src/import/index.js.map +1 -0
- package/dist/tasenor-common-node/src/index.d.ts +12 -0
- package/dist/tasenor-common-node/src/index.js +13 -0
- package/dist/tasenor-common-node/src/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/crypto.d.ts +33 -0
- package/dist/tasenor-common-node/src/net/crypto.js +63 -0
- package/dist/tasenor-common-node/src/net/crypto.js.map +1 -0
- package/dist/tasenor-common-node/src/net/git.d.ts +49 -0
- package/dist/tasenor-common-node/src/net/git.js +137 -0
- package/dist/tasenor-common-node/src/net/git.js.map +1 -0
- package/dist/tasenor-common-node/src/net/index.d.ts +10 -0
- package/dist/tasenor-common-node/src/net/index.js +11 -0
- package/dist/tasenor-common-node/src/net/index.js.map +1 -0
- package/dist/tasenor-common-node/src/net/middleware.d.ts +61 -0
- package/dist/tasenor-common-node/src/net/middleware.js +220 -0
- package/dist/tasenor-common-node/src/net/middleware.js.map +1 -0
- package/dist/tasenor-common-node/src/net/tokens.d.ts +50 -0
- package/dist/tasenor-common-node/src/net/tokens.js +141 -0
- package/dist/tasenor-common-node/src/net/tokens.js.map +1 -0
- package/dist/tasenor-common-node/src/net/vault.d.ts +67 -0
- package/dist/tasenor-common-node/src/net/vault.js +145 -0
- package/dist/tasenor-common-node/src/net/vault.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.d.ts +91 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js +165 -0
- package/dist/tasenor-common-node/src/plugins/BackendPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js +26 -0
- package/dist/tasenor-common-node/src/plugins/DataPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.d.ts +188 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js +204 -0
- package/dist/tasenor-common-node/src/plugins/ImportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.d.ts +132 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js +393 -0
- package/dist/tasenor-common-node/src/plugins/ReportPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.d.ts +34 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js +47 -0
- package/dist/tasenor-common-node/src/plugins/SchemePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.d.ts +80 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js +168 -0
- package/dist/tasenor-common-node/src/plugins/ServicePlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.d.ts +27 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js +37 -0
- package/dist/tasenor-common-node/src/plugins/ToolPlugin.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/index.d.ts +13 -0
- package/dist/tasenor-common-node/src/plugins/index.js +14 -0
- package/dist/tasenor-common-node/src/plugins/index.js.map +1 -0
- package/dist/tasenor-common-node/src/plugins/plugins.d.ts +101 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js +292 -0
- package/dist/tasenor-common-node/src/plugins/plugins.js.map +1 -0
- package/dist/tasenor-common-node/src/process/Process.d.ts +108 -0
- package/dist/tasenor-common-node/src/process/Process.js +335 -0
- package/dist/tasenor-common-node/src/process/Process.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js +28 -0
- package/dist/tasenor-common-node/src/process/ProcessConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.d.ts +69 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js +145 -0
- package/dist/tasenor-common-node/src/process/ProcessFile.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js +73 -0
- package/dist/tasenor-common-node/src/process/ProcessHandler.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.d.ts +52 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js +78 -0
- package/dist/tasenor-common-node/src/process/ProcessStep.js.map +1 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.d.ts +60 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js +182 -0
- package/dist/tasenor-common-node/src/process/ProcessingSystem.js.map +1 -0
- package/dist/tasenor-common-node/src/process/index.d.ts +11 -0
- package/dist/tasenor-common-node/src/process/index.js +12 -0
- package/dist/tasenor-common-node/src/process/index.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/conversions.d.ts +8 -0
- package/dist/tasenor-common-node/src/reports/conversions.js +47 -0
- package/dist/tasenor-common-node/src/reports/conversions.js.map +1 -0
- package/dist/tasenor-common-node/src/reports/index.d.ts +6 -0
- package/dist/tasenor-common-node/src/reports/index.js +7 -0
- package/dist/tasenor-common-node/src/reports/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.d.ts +43 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js +112 -0
- package/dist/tasenor-common-node/src/server/ISPDemoServer.js.map +1 -0
- package/dist/tasenor-common-node/src/server/api.d.ts +15 -0
- package/dist/tasenor-common-node/src/server/api.js +27 -0
- package/dist/tasenor-common-node/src/server/api.js.map +1 -0
- package/dist/tasenor-common-node/src/server/index.d.ts +7 -0
- package/dist/tasenor-common-node/src/server/index.js +8 -0
- package/dist/tasenor-common-node/src/server/index.js.map +1 -0
- package/dist/tasenor-common-node/src/server/router.d.ts +5 -0
- package/dist/tasenor-common-node/src/server/router.js +37 -0
- package/dist/tasenor-common-node/src/server/router.js.map +1 -0
- package/dist/tasenor-common-node/src/system.d.ts +27 -0
- package/dist/tasenor-common-node/src/system.js +95 -0
- package/dist/tasenor-common-node/src/system.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.d.ts +21 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js +33 -0
- package/dist/tasenor-common-node/src/testing/ProcessingSystemMock.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.d.ts +24 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js +68 -0
- package/dist/tasenor-common-node/src/testing/UnitTestImportConnector.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.d.ts +64 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js +199 -0
- package/dist/tasenor-common-node/src/testing/UnitTester.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/index.d.ts +4 -0
- package/dist/tasenor-common-node/src/testing/index.js +5 -0
- package/dist/tasenor-common-node/src/testing/index.js.map +1 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.d.ts +13 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js +52 -0
- package/dist/tasenor-common-node/src/testing/test-handlers.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js +64 -0
- package/dist/tasenor-common-node/tests/TransactionRules.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js +80 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-account-address.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js +342 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-buying-and-selling.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js +174 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-loans.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js +175 -0
- package/dist/tasenor-common-node/tests/TransferAnalyzer-multiple-null-amounts.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/password.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/password.spec.js +8 -0
- package/dist/tasenor-common-node/tests/password.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js +49 -0
- package/dist/tasenor-common-node/tests/tokens.spec.js.map +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.d.ts +1 -0
- package/dist/tasenor-common-node/tests/vault.spec.js +19 -0
- package/dist/tasenor-common-node/tests/vault.spec.js.map +1 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js +30 -0
- package/dist/tasenor-common-plugins/src/CoinbaseImport/backend/CoinbaseHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.d.ts +5 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js +350 -0
- package/dist/tasenor-common-plugins/src/IncomeAndExpenses/backend/index.js.map +1 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.d.ts +23 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js +83 -0
- package/dist/tasenor-common-plugins/src/KrakenImport/backend/KrakenHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.d.ts +28 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js +340 -0
- package/dist/tasenor-common-plugins/src/LynxImport/backend/LynxHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.d.ts +11 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js +39 -0
- package/dist/tasenor-common-plugins/src/NordeaImport/backend/NordeaHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.d.ts +17 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js +66 -0
- package/dist/tasenor-common-plugins/src/NordnetImport/backend/NordnetHandler.js.map +1 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.d.ts +13 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js +241 -0
- package/dist/tasenor-common-plugins/src/TITOImport/backend/TITOHandler.js.map +1 -0
- package/jest.config.js +1 -0
- package/package.json +62 -0
- package/src/cli.ts +267 -0
- package/src/commands/account.ts +69 -0
- package/src/commands/balance.ts +131 -0
- package/src/commands/db.ts +84 -0
- package/src/commands/entry.ts +117 -0
- package/src/commands/import.ts +160 -0
- package/src/commands/importer.ts +84 -0
- package/src/commands/index.ts +534 -0
- package/src/commands/period.ts +59 -0
- package/src/commands/plugin.ts +95 -0
- package/src/commands/report.ts +113 -0
- package/src/commands/settings.ts +75 -0
- package/src/commands/stock.ts +80 -0
- package/src/commands/tag.ts +102 -0
- package/src/commands/tx.ts +93 -0
- package/src/commands/user.ts +65 -0
- package/src/database/BookkeeperImporter.ts +358 -0
- package/src/database/DB.ts +396 -0
- package/src/database/index.ts +7 -0
- package/src/doccer.ts +29 -0
- package/src/error.ts +32 -0
- package/src/export/Exporter.ts +136 -0
- package/src/export/TasenorExporter.ts +144 -0
- package/src/export/TilitinExporter.ts +302 -0
- package/src/export/index.ts +8 -0
- package/src/import/TextFileProcessHandler.ts +384 -0
- package/src/import/TransactionImportConnector.ts +65 -0
- package/src/import/TransactionImportHandler.ts +819 -0
- package/src/import/TransactionRules.ts +570 -0
- package/src/import/TransactionUI.ts +520 -0
- package/src/import/TransferAnalyzer.ts +1450 -0
- package/src/import/index.ts +11 -0
- package/src/index.ts +12 -0
- package/src/net/crypto.ts +69 -0
- package/src/net/git.ts +151 -0
- package/src/net/index.ts +10 -0
- package/src/net/middleware.ts +261 -0
- package/src/net/tokens.ts +140 -0
- package/src/net/vault.ts +161 -0
- package/src/plugins/BackendPlugin.ts +188 -0
- package/src/plugins/DataPlugin.ts +29 -0
- package/src/plugins/ImportPlugin.ts +211 -0
- package/src/plugins/ReportPlugin.ts +443 -0
- package/src/plugins/SchemePlugin.ts +56 -0
- package/src/plugins/ServicePlugin.ts +188 -0
- package/src/plugins/ToolPlugin.ts +44 -0
- package/src/plugins/index.ts +13 -0
- package/src/plugins/plugins.ts +345 -0
- package/src/process/Process.ts +368 -0
- package/src/process/ProcessConnector.ts +45 -0
- package/src/process/ProcessFile.ts +169 -0
- package/src/process/ProcessHandler.ts +94 -0
- package/src/process/ProcessStep.ts +100 -0
- package/src/process/ProcessingSystem.ts +202 -0
- package/src/process/index.ts +11 -0
- package/src/reports/conversions.ts +52 -0
- package/src/reports/index.ts +6 -0
- package/src/server/ISPDemoServer.ts +122 -0
- package/src/server/api.ts +37 -0
- package/src/server/index.ts +7 -0
- package/src/server/router.ts +60 -0
- package/src/system.ts +96 -0
- package/src/testing/ProcessingSystemMock.ts +45 -0
- package/src/testing/UnitTestImportConnector.ts +86 -0
- package/src/testing/UnitTester.ts +231 -0
- package/src/testing/index.ts +4 -0
- package/src/testing/test-handlers.ts +55 -0
- package/tests/TransactionRules.spec.ts +73 -0
- package/tests/TransferAnalyzer-account-address.spec.ts +87 -0
- package/tests/TransferAnalyzer-buying-and-selling.spec.ts +354 -0
- package/tests/TransferAnalyzer-loans.spec.ts +197 -0
- package/tests/TransferAnalyzer-multiple-null-amounts.spec.ts +181 -0
- package/tests/password.spec.ts +8 -0
- package/tests/tokens.spec.ts +52 -0
- package/tests/vault.spec.ts +20 -0
- 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
|
+
}
|