@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,131 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { sprintf } from 'sprintf-js'
|
|
3
|
+
import { Command } from '.'
|
|
4
|
+
import { ArgumentParser } from 'argparse'
|
|
5
|
+
import { AccountNumber, Asset, DocumentModelData, EntryModelData, log, PeriodModelData, StockValueData, warning } from '@dataplug/tasenor-common'
|
|
6
|
+
import clone from 'clone'
|
|
7
|
+
|
|
8
|
+
class BalanceCommand extends Command {
|
|
9
|
+
|
|
10
|
+
addArguments(parser: ArgumentParser): void {
|
|
11
|
+
const sub = parser.add_subparsers()
|
|
12
|
+
|
|
13
|
+
const ls = sub.add_parser('ls', { help: 'List account balances' })
|
|
14
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
15
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
16
|
+
ls.add_argument('period', { help: 'Period year, date or ID' })
|
|
17
|
+
|
|
18
|
+
const create = sub.add_parser('create', { help: 'Initialize account balances' })
|
|
19
|
+
create.set_defaults({ subCommand: 'create' })
|
|
20
|
+
create.add_argument('--force', '-f', { action: 'store_true', help: 'If given, allow invalid entries to be created', required: false })
|
|
21
|
+
create.add_argument('--map', { help: 'Remap account numbers using JSON or @filepath mapping', required: false })
|
|
22
|
+
create.add_argument('--stock', { nargs: '*', help: 'Define initial stock using JSON or @filepath mapping', required: false })
|
|
23
|
+
create.add_argument('--text', { help: 'A description for the transaction', required: false })
|
|
24
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
25
|
+
create.add_argument('data', { help: 'A JSON data or @filepath for balances' })
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async ls() {
|
|
29
|
+
const { db, period, verbose } = this.args
|
|
30
|
+
const periodId = await this.periodId(db, period)
|
|
31
|
+
const resp: PeriodModelData = await this.get(`/db/${db}/period/${periodId}`)
|
|
32
|
+
await this.readAccounts(db)
|
|
33
|
+
if (!verbose && resp.balances) {
|
|
34
|
+
this.out('balance', resp.balances.reduce((prev, cur) => ({ ...prev, [cur.number as string]: cur.total }), {}))
|
|
35
|
+
return
|
|
36
|
+
}
|
|
37
|
+
this.out('balance', resp)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
print(data: Record<AccountNumber, number>) {
|
|
41
|
+
Object.keys(data).sort().forEach(number => {
|
|
42
|
+
console.log(number, this.accounts[number].name, '\t', sprintf('%.2f', data[number] / 100))
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async create() {
|
|
47
|
+
const { db, data, map, stock, text, force } = this.args
|
|
48
|
+
if (!db) {
|
|
49
|
+
throw new Error(`Invalid database argument ${JSON.stringify(db)}`)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const dataArg: Record<AccountNumber, number> = await this.jsonData(data) as Record<AccountNumber, number>
|
|
53
|
+
const mapArg: Record<AccountNumber, AccountNumber> = (map ? await this.jsonData(map) : {}) as Record<AccountNumber, AccountNumber>
|
|
54
|
+
const period: PeriodModelData = await this.singlePeriod(db)
|
|
55
|
+
const stockArg: Record<AccountNumber, Partial<Record<Asset, StockValueData>>> = await this.jsonData(stock) as Record<AccountNumber, Partial<Record<Asset, StockValueData>>>
|
|
56
|
+
|
|
57
|
+
// Check if the DB is clean.
|
|
58
|
+
const docs: DocumentModelData[] = await this.get(`/db/${db}/document`)
|
|
59
|
+
if (docs.filter(d => d.number !== 0).length && !force) {
|
|
60
|
+
throw new Error('There are already non-initial transactions in the database and cannot be initialized anymore.')
|
|
61
|
+
}
|
|
62
|
+
// Ensure zero balance.
|
|
63
|
+
const sum = Object.values(dataArg).reduce((prev: number, cur: number) => prev + cur, 0)
|
|
64
|
+
if (sum) {
|
|
65
|
+
if (force) {
|
|
66
|
+
warning(`Initial balance total must be zero. Got ${sum} from ${JSON.stringify(dataArg)}.`)
|
|
67
|
+
} else {
|
|
68
|
+
throw new Error(`Initial balance total must be zero. Got ${sum} from ${JSON.stringify(dataArg)}.`)
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Ensure all accounts are valid.
|
|
73
|
+
for (const account of Object.keys(dataArg)) {
|
|
74
|
+
// Zero balance accounts not needed.
|
|
75
|
+
if (!dataArg[account]) {
|
|
76
|
+
continue
|
|
77
|
+
}
|
|
78
|
+
await this.accountId(db, mapArg[account] || account)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Create initial doc.
|
|
82
|
+
const document: DocumentModelData = (docs.length > 0)
|
|
83
|
+
? docs[0]
|
|
84
|
+
: await this.post(`/db/${db}/document`, {
|
|
85
|
+
period_id: period.id,
|
|
86
|
+
date: this.date(period.start_date),
|
|
87
|
+
number: 0
|
|
88
|
+
})
|
|
89
|
+
log(`Created a document #${document.id} on ${period.start_date}.`)
|
|
90
|
+
// Create entries.
|
|
91
|
+
const description = this.str(text) || 'Initial balance'
|
|
92
|
+
for (const account of Object.keys(dataArg)) {
|
|
93
|
+
const destAccount = mapArg[account] || account
|
|
94
|
+
|
|
95
|
+
// Skip zeroes.
|
|
96
|
+
if (!dataArg[account]) {
|
|
97
|
+
log(`Skipping an entry ${destAccount} ${description} ${sprintf('%.2f', 0)}.`)
|
|
98
|
+
continue
|
|
99
|
+
}
|
|
100
|
+
const entry: EntryModelData = {
|
|
101
|
+
document_id: document.id,
|
|
102
|
+
account_id: await this.accountId(db, destAccount),
|
|
103
|
+
debit: dataArg[account] >= 0 ? 1 : 0,
|
|
104
|
+
amount: Math.abs(dataArg[account]),
|
|
105
|
+
description
|
|
106
|
+
}
|
|
107
|
+
// Add stock if given.
|
|
108
|
+
if (stockArg[destAccount]) {
|
|
109
|
+
entry.data = {
|
|
110
|
+
stock: {
|
|
111
|
+
set: clone(stockArg[destAccount])
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
delete stockArg[destAccount]
|
|
115
|
+
}
|
|
116
|
+
// Add data if known.
|
|
117
|
+
const out: EntryModelData = await this.post(`/db/${db}/entry`, entry as unknown as Record<string, unknown>)
|
|
118
|
+
log(`Created an entry #${out.id} for ${destAccount} ${description} ${sprintf('%.2f', dataArg[account] / 100)}${entry.data ? ' ' + JSON.stringify(entry.data) : ''}.`)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (Object.keys(stockArg).length) {
|
|
122
|
+
throw new Error(`Unused initial stocks for accounts ${Object.keys(stockArg).join(', ')}`)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async run() {
|
|
127
|
+
await this.runBy('subCommand')
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
export default BalanceCommand
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { DatabaseModelData, FilePath, log } from '@dataplug/tasenor-common'
|
|
2
|
+
import { ArgumentParser } from 'argparse'
|
|
3
|
+
import fs from 'fs'
|
|
4
|
+
import { Command } from '.'
|
|
5
|
+
|
|
6
|
+
class DbCommand extends Command {
|
|
7
|
+
|
|
8
|
+
addArguments(parser: ArgumentParser): void {
|
|
9
|
+
const sub = parser.add_subparsers()
|
|
10
|
+
|
|
11
|
+
const ls = sub.add_parser('ls', { help: 'List all databases' })
|
|
12
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
13
|
+
|
|
14
|
+
const create = sub.add_parser('create', { help: 'Create a database' })
|
|
15
|
+
create.set_defaults({ subCommand: 'create' })
|
|
16
|
+
create.add_argument('scheme', { help: 'Bookkeeping scheme plugin code' })
|
|
17
|
+
create.add_argument('databaseName', { help: 'Name of the new database' })
|
|
18
|
+
create.add_argument('companyName', { nargs: '?', help: 'Name of the company (optional)' })
|
|
19
|
+
create.add_argument('companyCode', { nargs: '?', help: 'Registration code of the company (optional)' })
|
|
20
|
+
create.add_argument('language', { nargs: '?', help: 'Database language (optional)' })
|
|
21
|
+
create.add_argument('currency', { nargs: '?', help: 'Currency (optional)' })
|
|
22
|
+
|
|
23
|
+
const rm = sub.add_parser('rm', { help: 'Delete a database' })
|
|
24
|
+
rm.set_defaults({ subCommand: 'rm' })
|
|
25
|
+
rm.add_argument('databaseName', { help: 'Name of the database' })
|
|
26
|
+
|
|
27
|
+
const upload = sub.add_parser('upload', { help: 'Upload a database' })
|
|
28
|
+
upload.set_defaults({ subCommand: 'upload' })
|
|
29
|
+
upload.add_argument('path', { help: 'Path to the file to upload' })
|
|
30
|
+
|
|
31
|
+
const download = sub.add_parser('download', { help: 'Download a database' })
|
|
32
|
+
download.set_defaults({ subCommand: 'download' })
|
|
33
|
+
download.add_argument('databaseName', { help: 'Name of the database' })
|
|
34
|
+
download.add_argument('path', { help: 'Path to the file to save' })
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async ls() {
|
|
38
|
+
const resp = await this.get('/db')
|
|
39
|
+
this.out('db', resp)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
print(data: DatabaseModelData[]): void {
|
|
43
|
+
for (const db of data) {
|
|
44
|
+
console.log(db.name)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async rm() {
|
|
49
|
+
const { databaseName } = this.args
|
|
50
|
+
await this.delete(`/db/${databaseName}`)
|
|
51
|
+
log(`Database ${databaseName} deleted successfully.`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async create() {
|
|
55
|
+
const { scheme, databaseName, companyName, companyCode, language, currency } = this.args
|
|
56
|
+
const settings = {
|
|
57
|
+
language, currency
|
|
58
|
+
}
|
|
59
|
+
const params = { scheme, databaseName, companyName, companyCode, settings }
|
|
60
|
+
await this.post('/db', params)
|
|
61
|
+
log(`Database ${databaseName} created successfully.`)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async upload() {
|
|
65
|
+
const { path } = this.args
|
|
66
|
+
if (!path || !fs.existsSync(this.str(path))) {
|
|
67
|
+
throw new Error(`File path ${path} does not exist.`)
|
|
68
|
+
}
|
|
69
|
+
await this.postUpload('/db/upload', path as FilePath)
|
|
70
|
+
log(`Database ${path} uploaded successfully.`)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
async download() {
|
|
74
|
+
const { path, databaseName } = this.args
|
|
75
|
+
await this.getDownload(`/db/${databaseName}/download`, this.str(path) as FilePath)
|
|
76
|
+
log(`Database ${databaseName} downloaded successfully and saved to ${path}.`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async run() {
|
|
80
|
+
await this.runBy('subCommand')
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default DbCommand
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { sprintf } from 'sprintf-js'
|
|
3
|
+
import { Command } from '.'
|
|
4
|
+
import { ArgumentParser } from 'argparse'
|
|
5
|
+
import { EntryModelData, log } from '@dataplug/tasenor-common'
|
|
6
|
+
|
|
7
|
+
class EntryCommand extends Command {
|
|
8
|
+
|
|
9
|
+
addArguments(parser: ArgumentParser): void {
|
|
10
|
+
const sub = parser.add_subparsers()
|
|
11
|
+
|
|
12
|
+
const ls = sub.add_parser('ls', { help: 'Find entries matching the filter' })
|
|
13
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
14
|
+
ls.add_argument('--account', { help: 'Match to this account number', required: false })
|
|
15
|
+
ls.add_argument('--text', { help: 'Match to this exact description', required: false })
|
|
16
|
+
ls.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
|
|
17
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
18
|
+
|
|
19
|
+
const edit = sub.add_parser('edit', { help: 'Change entries matching the filter' })
|
|
20
|
+
edit.set_defaults({ subCommand: 'edit' })
|
|
21
|
+
edit.add_argument('--account', { help: 'Match to this account number', required: false })
|
|
22
|
+
edit.add_argument('--text', { help: 'Match to this exact description', required: false })
|
|
23
|
+
edit.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
|
|
24
|
+
edit.add_argument('db', { help: 'Name of the database' })
|
|
25
|
+
edit.add_argument('data', { help: 'JSON data for patching the entry' })
|
|
26
|
+
|
|
27
|
+
const rm = sub.add_parser('rm', { help: 'Remove entries matching the filter' })
|
|
28
|
+
rm.set_defaults({ subCommand: 'rm' })
|
|
29
|
+
rm.add_argument('--account', { help: 'Match to this account number', required: false })
|
|
30
|
+
rm.add_argument('--text', { help: 'Match to this exact description', required: false })
|
|
31
|
+
rm.add_argument('--period', { help: 'Match to period with this date/year/id', required: false })
|
|
32
|
+
rm.add_argument('--all', { help: 'Delete the whole transaction that includes the matching line.', action: 'store_true', required: false })
|
|
33
|
+
rm.add_argument('db', { help: 'Name of the database' })
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async filter(): Promise<EntryModelData[]> {
|
|
37
|
+
const { db, account, text, period } = this.args
|
|
38
|
+
await this.readAccounts(db)
|
|
39
|
+
const query: string[] = []
|
|
40
|
+
if (account) {
|
|
41
|
+
const id = await this.accountId(db, account)
|
|
42
|
+
query.push(`account_id=${id}`)
|
|
43
|
+
}
|
|
44
|
+
if (text) {
|
|
45
|
+
query.push(`text=${encodeURIComponent(text as string)}`)
|
|
46
|
+
}
|
|
47
|
+
if (period) {
|
|
48
|
+
const id = await this.periodId(db, period)
|
|
49
|
+
query.push(`period_id=${id}`)
|
|
50
|
+
}
|
|
51
|
+
return this.get(`/db/${db}/entry${query.length ? '?' + query.join('&') : ''}`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async ls() {
|
|
55
|
+
const resp = await this.filter()
|
|
56
|
+
this.out('entry', resp)
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
print(data: EntryModelData[]): void {
|
|
60
|
+
for (const entry of data) {
|
|
61
|
+
const { id, account_id, debit, amount, description } = entry
|
|
62
|
+
console.log(`#${id} ${this.accountsById[account_id || -1].number} ${this.accountsById[account_id || -1].name}`)
|
|
63
|
+
console.log(' ', sprintf('%.2f', debit ? amount / 100 : amount / -100), '\t', description)
|
|
64
|
+
if (entry.data && Object.keys(entry.data).length) {
|
|
65
|
+
console.log(' ', JSON.stringify(entry.data))
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async edit() {
|
|
71
|
+
const { db, data } = this.args
|
|
72
|
+
const params = await this.jsonData(data)
|
|
73
|
+
for (const key of Object.keys(params)) {
|
|
74
|
+
switch (key) {
|
|
75
|
+
case 'data':
|
|
76
|
+
case 'description':
|
|
77
|
+
break
|
|
78
|
+
case 'account':
|
|
79
|
+
params.account_id = await this.accountId(db, `${params[key]}`)
|
|
80
|
+
delete params.account
|
|
81
|
+
break
|
|
82
|
+
default:
|
|
83
|
+
throw new Error(`No handler yet for entry data '${key}'.`)
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const resp: EntryModelData[] = await this.filter()
|
|
87
|
+
for (const entry of resp) {
|
|
88
|
+
const newParams = { ...params, data: Object.assign({}, entry.data, params.data) }
|
|
89
|
+
log(`Changing entry #${entry.id} to have ${JSON.stringify(newParams)}`)
|
|
90
|
+
await this.patch(`/db/${db}/entry/${entry.id}`, newParams)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async rm() {
|
|
95
|
+
const { db } = this.args
|
|
96
|
+
const resp: EntryModelData[] = await this.filter()
|
|
97
|
+
if (this.args.all) {
|
|
98
|
+
const docIds = new Set()
|
|
99
|
+
for (const entry of resp) {
|
|
100
|
+
docIds.add(entry.document_id)
|
|
101
|
+
}
|
|
102
|
+
for (const id of docIds) {
|
|
103
|
+
await this.delete(`/db/${db}/document/${id}`)
|
|
104
|
+
}
|
|
105
|
+
} else {
|
|
106
|
+
for (const entry of resp) {
|
|
107
|
+
await this.delete(`/db/${db}/entry/${entry.id}`)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async run() {
|
|
113
|
+
await this.runBy('subCommand')
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export default EntryCommand
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import mime from 'mime-types'
|
|
4
|
+
import { Command } from '.'
|
|
5
|
+
import { ArgumentParser } from 'argparse'
|
|
6
|
+
import { ImportState, ProcessConfig, ProcessModelData, ProcessStepModelData, RuleEditorElement, TransactionDescription, error, log } from '@dataplug/tasenor-common'
|
|
7
|
+
|
|
8
|
+
type ProcessPostResponse = { processId: number, step: number, status: string }
|
|
9
|
+
type ProcessGetResponse = { steps: ProcessStepModelData[] }
|
|
10
|
+
|
|
11
|
+
class ImportCommand extends Command {
|
|
12
|
+
|
|
13
|
+
addArguments(parser: ArgumentParser): void {
|
|
14
|
+
const sub = parser.add_subparsers()
|
|
15
|
+
|
|
16
|
+
const ls = sub.add_parser('ls', { help: 'List all imports' })
|
|
17
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
18
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
19
|
+
ls.add_argument('name', { help: 'Name of the importer' })
|
|
20
|
+
|
|
21
|
+
const show = sub.add_parser('show', { help: 'Display import process in detail' })
|
|
22
|
+
show.set_defaults({ subCommand: 'show' })
|
|
23
|
+
show.add_argument('db', { help: 'Name of the database' })
|
|
24
|
+
show.add_argument('name', { help: 'Name of the importer' })
|
|
25
|
+
show.add_argument('id', { help: 'Import number' })
|
|
26
|
+
|
|
27
|
+
const create = sub.add_parser('create', { help: 'Import a file' })
|
|
28
|
+
create.set_defaults({ subCommand: 'create' })
|
|
29
|
+
create.add_argument('--first', { help: 'First date of the allowed period YYYY-MM-DD', default: '1900-01-01' })
|
|
30
|
+
create.add_argument('--last', { help: 'Final date of the allowed period YYYY-MM-DD', default: '2999-12-31' })
|
|
31
|
+
create.add_argument('--answers', { help: 'Answer file', required: false })
|
|
32
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
33
|
+
create.add_argument('name', { help: 'Name of the importer' })
|
|
34
|
+
create.add_argument('file', { help: 'Path to the file(s) to import', nargs: '+' })
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async ls() {
|
|
38
|
+
const { db, name } = this.args
|
|
39
|
+
const importer = await this.importer(db, name)
|
|
40
|
+
const resp = await this.get(`/db/${db}/import/${importer.id}`)
|
|
41
|
+
this.out('import', resp)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async show() {
|
|
45
|
+
const { db, name, id } = this.args
|
|
46
|
+
const importer = await this.importer(db, name)
|
|
47
|
+
const resp = await this.get(`/db/${db}/import/${importer.id}/process/${id}`) as ProcessGetResponse
|
|
48
|
+
|
|
49
|
+
const steps: (ProcessStepModelData & { state: ImportState})[] = []
|
|
50
|
+
|
|
51
|
+
for (const step of resp.steps) {
|
|
52
|
+
const resp = await this.get(`/db/${db}/import/${importer.id}/process/${id}/step/${step.number}`) as { state: ImportState }
|
|
53
|
+
steps.push({ ...step, state: resp.state as ImportState })
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for (const step of steps) {
|
|
57
|
+
if (step.directions && step.directions.element) {
|
|
58
|
+
const element: RuleEditorElement = step.directions.element as RuleEditorElement
|
|
59
|
+
if (element.config) {
|
|
60
|
+
element.config = '* * * config * * *' as unknown as ProcessConfig
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (this.args.json) {
|
|
66
|
+
this.out('import', steps)
|
|
67
|
+
} else {
|
|
68
|
+
for (const step of steps) {
|
|
69
|
+
const state = step.state
|
|
70
|
+
console.log()
|
|
71
|
+
console.log(`Step #${step.number}`)
|
|
72
|
+
console.log('Action:', step.action)
|
|
73
|
+
console.log('Direction:', step.directions && step.directions.type)
|
|
74
|
+
console.log('State:')
|
|
75
|
+
console.log(` Files: ${Object.keys(state.files).join(', ')}`)
|
|
76
|
+
console.log(` Stage: ${state.stage}`)
|
|
77
|
+
if (state.output) {
|
|
78
|
+
console.log(' Output:', state.output)
|
|
79
|
+
}
|
|
80
|
+
if (state.segments) {
|
|
81
|
+
console.log(` Segments: ${Object.keys(state.segments).join(', ')}`)
|
|
82
|
+
}
|
|
83
|
+
if (state.result !== undefined) {
|
|
84
|
+
console.log(' Results:')
|
|
85
|
+
Object.keys(state.result).forEach(segmentId => {
|
|
86
|
+
console.log(`=== ${segmentId} ===`)
|
|
87
|
+
const result: TransactionDescription = state.result as TransactionDescription
|
|
88
|
+
console.dir(result[segmentId], { depth: null })
|
|
89
|
+
})
|
|
90
|
+
}
|
|
91
|
+
// console.log()
|
|
92
|
+
// console.log(step.state)
|
|
93
|
+
// console.log()
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async create() {
|
|
100
|
+
const { db, name, file, answers, first, last } = this.args
|
|
101
|
+
const importer = await this.importer(db, name)
|
|
102
|
+
const encoding = 'base64'
|
|
103
|
+
const files: Record<string, string>[] = []
|
|
104
|
+
for (const filePath of (file || [])) {
|
|
105
|
+
const data = fs.readFileSync(filePath).toString(encoding)
|
|
106
|
+
files.push({
|
|
107
|
+
name: filePath,
|
|
108
|
+
encoding,
|
|
109
|
+
type: mime.lookup(filePath),
|
|
110
|
+
data
|
|
111
|
+
})
|
|
112
|
+
}
|
|
113
|
+
const answersArg = answers ? await this.jsonData(answers) : null
|
|
114
|
+
|
|
115
|
+
const resp: ProcessPostResponse = await this.post(`/db/${db}/importer/${importer.id}`, {
|
|
116
|
+
firstDate: first,
|
|
117
|
+
lastDate: last,
|
|
118
|
+
files
|
|
119
|
+
})
|
|
120
|
+
this.out('import', resp)
|
|
121
|
+
|
|
122
|
+
if (answersArg) {
|
|
123
|
+
log(`Uploading answers to process #${resp.processId}`)
|
|
124
|
+
const resp2 = await this.post(`/db/${db}/import/${importer.id}/process/${resp.processId}`, {
|
|
125
|
+
answer: answersArg
|
|
126
|
+
})
|
|
127
|
+
this.out('import', resp2)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
print(data: ProcessModelData[] | ProcessPostResponse) {
|
|
132
|
+
if ('processId' in data && 'step' in data) {
|
|
133
|
+
log(`Process ID: ${data.processId}, Step: ${data.step}, ${data.status}`)
|
|
134
|
+
return
|
|
135
|
+
}
|
|
136
|
+
if ('processId' in data && 'status' in data && data.length === undefined) {
|
|
137
|
+
if (data.status === 'CRASHED') {
|
|
138
|
+
error(`Process ID: ${data.processId}, ${data.status}`)
|
|
139
|
+
} else {
|
|
140
|
+
log(`Process ID: ${data.processId}, ${data.status}`)
|
|
141
|
+
}
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
for (const imp of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
|
|
145
|
+
const { id, name, status, error } = imp
|
|
146
|
+
console.log(`#${id} ${name} ${status}`)
|
|
147
|
+
if (error) {
|
|
148
|
+
console.log(' ', error)
|
|
149
|
+
}
|
|
150
|
+
console.log()
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async run() {
|
|
156
|
+
await this.runBy('subCommand')
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export default ImportCommand
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { ImporterModelData, log } from '@dataplug/tasenor-common'
|
|
3
|
+
import { Command } from '.'
|
|
4
|
+
import { ArgumentParser } from 'argparse'
|
|
5
|
+
|
|
6
|
+
class ImporterCommand extends Command {
|
|
7
|
+
|
|
8
|
+
addArguments(parser: ArgumentParser): void {
|
|
9
|
+
const sub = parser.add_subparsers()
|
|
10
|
+
|
|
11
|
+
const ls = sub.add_parser('ls', { help: 'List all importers' })
|
|
12
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
13
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
14
|
+
|
|
15
|
+
const create = sub.add_parser('create', { help: 'Create an importer' })
|
|
16
|
+
create.set_defaults({ subCommand: 'create' })
|
|
17
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
18
|
+
create.add_argument('name', { help: 'Name of the importer' })
|
|
19
|
+
create.add_argument('plugin', { help: 'Code of the import handler plugin' })
|
|
20
|
+
|
|
21
|
+
const set = sub.add_parser('set', { help: 'Set configuration variable for an importer' })
|
|
22
|
+
set.set_defaults({ subCommand: 'set' })
|
|
23
|
+
set.add_argument('db', { help: 'Name of the database' })
|
|
24
|
+
set.add_argument('name', { help: 'The name of the importer' })
|
|
25
|
+
set.add_argument('variable', { help: 'Name of the configuration variable' })
|
|
26
|
+
set.add_argument('value', { help: 'Value for the configuration variable' })
|
|
27
|
+
|
|
28
|
+
const config = sub.add_parser('config', { help: 'Set whole configuration for an importer' })
|
|
29
|
+
config.set_defaults({ subCommand: 'config' })
|
|
30
|
+
config.add_argument('db', { help: 'Name of the database' })
|
|
31
|
+
config.add_argument('name', { help: 'The name of the importer' })
|
|
32
|
+
config.add_argument('config', { help: 'JSON data or @filepath for configuration' })
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async ls() {
|
|
36
|
+
const { db } = this.args
|
|
37
|
+
const resp = await this.get(`/db/${db}/importer`)
|
|
38
|
+
this.out('importer', resp)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
print(data: ImporterModelData[]): void {
|
|
42
|
+
for (const importer of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
|
|
43
|
+
const { id, name, config } = importer
|
|
44
|
+
console.log(`#${id} ${name}`)
|
|
45
|
+
if (config.rules) {
|
|
46
|
+
config.rules = '...skipped...'
|
|
47
|
+
}
|
|
48
|
+
console.dir(config, { depth: null })
|
|
49
|
+
console.log()
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async create() {
|
|
54
|
+
const { db, name, plugin } = this.args
|
|
55
|
+
await this.plugin(plugin)
|
|
56
|
+
const code = this.str(plugin)
|
|
57
|
+
await this.post(`/db/${db}/importer`, { name, config: { handlers: [code] } })
|
|
58
|
+
log(`Importer ${name} created successfully.`)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async set() {
|
|
62
|
+
const { db, name, variable, value } = this.args
|
|
63
|
+
const importer = await this.importer(db, name)
|
|
64
|
+
const variableArg = this.str(variable)
|
|
65
|
+
const valueArg = this.value(value)
|
|
66
|
+
await this.patch(`/db/${db}/importer/${importer.id}`, { config: { [variableArg]: valueArg } })
|
|
67
|
+
const newImporter: ImporterModelData = await this.get(`/db/${db}/importer/${importer.id}`)
|
|
68
|
+
log(`Variable ${variableArg} set to ${JSON.stringify(newImporter.config[variableArg])}`)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async config() {
|
|
72
|
+
const { db, name, config } = this.args
|
|
73
|
+
const importer = await this.importer(db, name)
|
|
74
|
+
const configArg = await this.jsonData(config)
|
|
75
|
+
await this.patch(`/db/${db}/importer/${importer.id}`, { config: configArg })
|
|
76
|
+
log(`Updated configuration for importer ${name}`)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async run() {
|
|
80
|
+
await this.runBy('subCommand')
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default ImporterCommand
|