@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,113 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { sprintf } from 'sprintf-js'
|
|
3
|
+
import { Command } from '.'
|
|
4
|
+
import { ArgumentParser } from 'argparse'
|
|
5
|
+
import { Report, ReportColumnDefinition } from '@dataplug/tasenor-common'
|
|
6
|
+
|
|
7
|
+
class ReportCommand extends Command {
|
|
8
|
+
|
|
9
|
+
addArguments(parser: ArgumentParser): void {
|
|
10
|
+
const sub = parser.add_subparsers()
|
|
11
|
+
|
|
12
|
+
const ls = sub.add_parser('ls', { help: 'List of reports' })
|
|
13
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
14
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
15
|
+
|
|
16
|
+
const view = sub.add_parser('view', { help: 'Show a report' })
|
|
17
|
+
view.set_defaults({ subCommand: 'view' })
|
|
18
|
+
view.add_argument('db', { help: 'Name of the database' })
|
|
19
|
+
view.add_argument('report', { help: 'Name of the report' })
|
|
20
|
+
view.add_argument('period', { help: 'Period year, date or ID' })
|
|
21
|
+
view.add_argument('options', { nargs: '*', help: 'Additinal report options for query as `key=value`' })
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async ls() {
|
|
25
|
+
const { db } = this.args
|
|
26
|
+
const resp = await this.get(`/db/${db}/report`)
|
|
27
|
+
this.out('report', resp)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async view() {
|
|
31
|
+
const { db, period, report, options } = this.args
|
|
32
|
+
let query = ''
|
|
33
|
+
if (options?.length) {
|
|
34
|
+
query = '?' + (options as string[]).join('&')
|
|
35
|
+
}
|
|
36
|
+
const periodId = await this.periodId(db, period)
|
|
37
|
+
const resp = await this.get(`/db/${db}/report/${report}/${periodId}${query}`)
|
|
38
|
+
this.out('report', resp)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
print(data: Record<string, unknown> | Report) {
|
|
42
|
+
if ('options' in data) {
|
|
43
|
+
Object.keys(data.options as Record<string, unknown>).forEach((opt) => console.log(opt))
|
|
44
|
+
return
|
|
45
|
+
}
|
|
46
|
+
if ('data' in data) {
|
|
47
|
+
const report = data as Report
|
|
48
|
+
|
|
49
|
+
// Header.
|
|
50
|
+
console.log()
|
|
51
|
+
console.log(report.format)
|
|
52
|
+
console.log()
|
|
53
|
+
|
|
54
|
+
// Meta data.
|
|
55
|
+
if ('meta' in data) {
|
|
56
|
+
Object.keys(report.meta as Record<string, unknown>).forEach((meta) => console.log(`${meta}: ${(report.meta as Record<string, unknown>)[meta]}`))
|
|
57
|
+
console.log()
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Collect data to tables.
|
|
61
|
+
const lines: string[][] = []
|
|
62
|
+
const columns: ReportColumnDefinition[] = (data as Report).columns || []
|
|
63
|
+
|
|
64
|
+
// Set up title line.
|
|
65
|
+
let line: string[] = []
|
|
66
|
+
for (const column of columns) {
|
|
67
|
+
line.push(column.title)
|
|
68
|
+
}
|
|
69
|
+
lines.push(line)
|
|
70
|
+
|
|
71
|
+
// Render each report line.
|
|
72
|
+
for (const item of report.data) {
|
|
73
|
+
line = []
|
|
74
|
+
for (const column of columns) {
|
|
75
|
+
const text = {
|
|
76
|
+
id: () => item.id,
|
|
77
|
+
name: () => item.name,
|
|
78
|
+
numeric: () => item.amounts && item.amounts[column.name] !== undefined && sprintf('%.2f', (item.amounts[column.name] || 0) / 100)
|
|
79
|
+
}[column.type]()
|
|
80
|
+
line.push(text || '')
|
|
81
|
+
}
|
|
82
|
+
lines.push(line)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Find the longest line per column.
|
|
86
|
+
const spaces: string[] = columns.map(() => '')
|
|
87
|
+
for (let i = 0; i < lines.length; i++) {
|
|
88
|
+
for (let j = 0; j < columns.length; j++) {
|
|
89
|
+
if (lines[i][j].length > spaces[j].length) {
|
|
90
|
+
spaces[j] = lines[i][j].replace(/./g, ' ')
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Display.
|
|
96
|
+
for (let i = 0; i < lines.length; i++) {
|
|
97
|
+
let str = ''
|
|
98
|
+
for (let j = 0; j < columns.length; j++) {
|
|
99
|
+
str += (lines[i][j] + spaces[j] + ' ').substr(0, spaces[j].length + 1)
|
|
100
|
+
}
|
|
101
|
+
console.log(str)
|
|
102
|
+
}
|
|
103
|
+
return
|
|
104
|
+
}
|
|
105
|
+
throw new Error('Default output not implented.')
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async run() {
|
|
109
|
+
await this.runBy('subCommand')
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export default ReportCommand
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { Command } from '.'
|
|
3
|
+
import { ArgumentParser } from 'argparse'
|
|
4
|
+
import { log, needHiding } from '@dataplug/tasenor-common'
|
|
5
|
+
|
|
6
|
+
class SettingsCommand 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 settings' })
|
|
12
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
13
|
+
ls.add_argument('--all', '-a', { help: 'Show all UI configurations and other extras.', action: 'store_true', required: false })
|
|
14
|
+
ls.add_argument('db', { help: 'Name of the database', nargs: '?' })
|
|
15
|
+
|
|
16
|
+
const set = sub.add_parser('set', { help: 'Change a settings' })
|
|
17
|
+
set.set_defaults({ subCommand: 'set' })
|
|
18
|
+
set.add_argument('dest', { help: 'Name of the database, name of the plugin or `system`' })
|
|
19
|
+
set.add_argument('key', { help: 'Name of the setting' })
|
|
20
|
+
set.add_argument('value', { help: 'New value for the setting' })
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async ls() {
|
|
24
|
+
const { db, all } = this.args
|
|
25
|
+
const resp = db ? await this.get(`/db/${db}/settings`) : null
|
|
26
|
+
const resp2 = await this.get('/system/settings')
|
|
27
|
+
const resp3: Record<string, Record<string, unknown>> = await this.get('/system/settings/plugins')
|
|
28
|
+
const pluginSettings = {}
|
|
29
|
+
|
|
30
|
+
Object.keys(resp3).forEach(plugin => {
|
|
31
|
+
pluginSettings[plugin] = all ? resp3[plugin] : resp3[plugin].settings
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
this.out('settings', db
|
|
35
|
+
? {
|
|
36
|
+
db: resp,
|
|
37
|
+
system: resp2,
|
|
38
|
+
plugin: pluginSettings
|
|
39
|
+
}
|
|
40
|
+
: {
|
|
41
|
+
system: resp2,
|
|
42
|
+
plugins: pluginSettings
|
|
43
|
+
})
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
print(data): void {
|
|
47
|
+
console.dir(data, { depth: null })
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async set() {
|
|
51
|
+
const { dest, key, value } = this.args
|
|
52
|
+
const valueArg = await this.value(value)
|
|
53
|
+
const keyArg = this.str(key)
|
|
54
|
+
const destArg = this.str(dest)
|
|
55
|
+
if (destArg === 'system') {
|
|
56
|
+
log(`Setting system variable ${keyArg} to ${JSON.stringify(valueArg)}.`)
|
|
57
|
+
await this.patch('/system/settings', { [keyArg]: valueArg })
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
const resp: Record<string, unknown> = await this.get('/system/settings/plugins')
|
|
61
|
+
if (destArg in resp) {
|
|
62
|
+
log(`Setting plugin ${destArg} setting ${keyArg} to ${needHiding(keyArg) ? '*******' : JSON.stringify(valueArg)}.`)
|
|
63
|
+
await this.patch('/system/settings/plugins', { [`${destArg}.${keyArg}`]: valueArg })
|
|
64
|
+
return
|
|
65
|
+
}
|
|
66
|
+
log(`Setting database ${destArg} setting ${keyArg} to ${JSON.stringify(valueArg)}.`)
|
|
67
|
+
await this.patch(`/db/${destArg}/settings`, { [keyArg]: valueArg })
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async run() {
|
|
71
|
+
await this.runBy('subCommand')
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export default SettingsCommand
|
|
@@ -0,0 +1,80 @@
|
|
|
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 } from '@dataplug/tasenor-common'
|
|
6
|
+
|
|
7
|
+
class StockCommand extends Command {
|
|
8
|
+
|
|
9
|
+
addArguments(parser: ArgumentParser): void {
|
|
10
|
+
const sub = parser.add_subparsers()
|
|
11
|
+
|
|
12
|
+
const create = sub.add_parser('create', { help: 'Create initial stock' })
|
|
13
|
+
create.set_defaults({ subCommand: 'create' })
|
|
14
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
15
|
+
create.add_argument('data', { help: 'A JSON data or @filepath for initial stock data' })
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async create() {
|
|
19
|
+
const { db, data } = this.args
|
|
20
|
+
if (!db) {
|
|
21
|
+
throw new Error(`Invalid database argument ${JSON.stringify(db)}`)
|
|
22
|
+
}
|
|
23
|
+
const dataArg: Record<AccountNumber, Partial<Record<Asset, StockValueData>>> = await this.jsonData(data) as Record<AccountNumber, Partial<Record<Asset, StockValueData>>>
|
|
24
|
+
const period: PeriodModelData = await this.singlePeriod(db)
|
|
25
|
+
const docs: DocumentModelData[] = await this.get(`/db/${db}/document?period=${period.id}&entries`)
|
|
26
|
+
const zeroTx = docs.filter(doc => doc.number === 0)
|
|
27
|
+
if (!zeroTx.length) {
|
|
28
|
+
throw new Error('Cannot set stock unless there is 0-transaction for initial balances defined.')
|
|
29
|
+
}
|
|
30
|
+
if (!zeroTx[0].entries) {
|
|
31
|
+
throw new Error('Cannot set stock unless there are entries in 0-transaction for initial balances.')
|
|
32
|
+
}
|
|
33
|
+
// Get map of indexes in entry list for existing accounts.
|
|
34
|
+
const entryIndex: Record<number, number> = {}
|
|
35
|
+
let i = 0
|
|
36
|
+
for (const entry of zeroTx[0].entries) {
|
|
37
|
+
if (entry.account_id) {
|
|
38
|
+
entryIndex[entry.account_id] = i++
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// Prepare and create missing entries for stock data upates.
|
|
42
|
+
for (const account of Object.keys(dataArg)) {
|
|
43
|
+
const accountId = await this.accountId(db, account)
|
|
44
|
+
if (accountId && !entryIndex[accountId]) {
|
|
45
|
+
const newEntry: EntryModelData = await this.post(`/db/${db}/entry`, {
|
|
46
|
+
document_id: zeroTx[0].id,
|
|
47
|
+
account_id: accountId,
|
|
48
|
+
debit: 1,
|
|
49
|
+
amount: 0,
|
|
50
|
+
description: zeroTx[0].entries[0].description
|
|
51
|
+
})
|
|
52
|
+
log(`Created an entry #${newEntry.id} for ${account} ${zeroTx[0].entries[0].description} ${sprintf('%.2f', 0)}.`)
|
|
53
|
+
|
|
54
|
+
zeroTx[0].entries.push(newEntry)
|
|
55
|
+
entryIndex[accountId] = zeroTx[0].entries.length - 1
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Update stock data.
|
|
59
|
+
for (const account of Object.keys(dataArg)) {
|
|
60
|
+
const accountId = await this.accountId(db, account)
|
|
61
|
+
if (accountId) {
|
|
62
|
+
const entry = zeroTx[0].entries[entryIndex[accountId]]
|
|
63
|
+
entry.data = entry.data || {}
|
|
64
|
+
Object.assign(entry.data, {
|
|
65
|
+
stock: {
|
|
66
|
+
set: dataArg[account]
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
await this.patch(`/db/${db}/entry/${entry.id}`, { data: entry.data })
|
|
70
|
+
log(`Updated initial stock data for entry #${entry.id}.`)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async run() {
|
|
76
|
+
await this.runBy('subCommand')
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export default StockCommand
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import fs from 'fs'
|
|
3
|
+
import mimeTypes from 'mime-types'
|
|
4
|
+
import { log, TagModelData } from '@dataplug/tasenor-common'
|
|
5
|
+
import { Command } from '.'
|
|
6
|
+
import { ArgumentParser } from 'argparse'
|
|
7
|
+
|
|
8
|
+
class TagCommand extends Command {
|
|
9
|
+
|
|
10
|
+
addArguments(parser: ArgumentParser): void {
|
|
11
|
+
const sub = parser.add_subparsers()
|
|
12
|
+
|
|
13
|
+
const ls = sub.add_parser('ls', { help: 'List all tags' })
|
|
14
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
15
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
16
|
+
ls.add_argument('--tags-only', { help: 'Show only tags', action: 'store_true', required: false })
|
|
17
|
+
|
|
18
|
+
const download = sub.add_parser('download', { help: 'Download a tag image' })
|
|
19
|
+
download.set_defaults({ subCommand: 'download' })
|
|
20
|
+
download.add_argument('db', { help: 'Name of the database' })
|
|
21
|
+
download.add_argument('tag', { help: 'Name of the tag' })
|
|
22
|
+
|
|
23
|
+
const rm = sub.add_parser('rm', { help: 'Delete a tag' })
|
|
24
|
+
rm.set_defaults({ subCommand: 'rm' })
|
|
25
|
+
rm.add_argument('db', { help: 'Name of the database' })
|
|
26
|
+
rm.add_argument('id', { help: 'ID of the tag' })
|
|
27
|
+
|
|
28
|
+
const create = sub.add_parser('create', { help: 'Create a tag' })
|
|
29
|
+
create.set_defaults({ subCommand: 'create' })
|
|
30
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
31
|
+
create.add_argument('tag', { help: 'Tag itself' })
|
|
32
|
+
create.add_argument('name', { help: 'Description' })
|
|
33
|
+
create.add_argument('type', { help: 'Group name of the tag' })
|
|
34
|
+
create.add_argument('path', { help: 'Path to the file' })
|
|
35
|
+
create.add_argument('order', { help: 'Ordering number for the tag', nargs: '?' })
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async ls() {
|
|
39
|
+
const { db, tags_only } = this.args
|
|
40
|
+
const resp: TagModelData[] = await this.get(`/db/${db}/tags`)
|
|
41
|
+
if (tags_only) {
|
|
42
|
+
for (const tag of resp.map(t => t.tag)) {
|
|
43
|
+
console.log(tag)
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
this.out('tag', resp)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
print(data: TagModelData[]): void {
|
|
51
|
+
for (const line of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
|
|
52
|
+
const { id, tag, name, mime, type, order } = line
|
|
53
|
+
console.log(`#${id} ${tag}\t${name}\t${mime}\t${type}\t${order}`)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async rm() {
|
|
58
|
+
const { db, id } = this.args
|
|
59
|
+
await this.delete(`/db/${db}/tags/${id}`)
|
|
60
|
+
log(`Tag ${id} deleted successfully.`)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async download() {
|
|
64
|
+
const { db, tag } = this.args
|
|
65
|
+
const tagArg = await this.tag(db, tag)
|
|
66
|
+
const name = `${tagArg.tag}.${(tagArg.mime || '/bin').split('/')[1]}`
|
|
67
|
+
const data = Buffer.from(tagArg.picture || '', 'base64')
|
|
68
|
+
fs.writeFileSync(name, data)
|
|
69
|
+
log(`Saved a tag to file ${name}.`)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async create() {
|
|
73
|
+
const { db, tag, name, path, type } = this.args
|
|
74
|
+
if (!path || !fs.existsSync(this.str(path))) {
|
|
75
|
+
throw new Error(`File path ${path} does not exist.`)
|
|
76
|
+
}
|
|
77
|
+
const mime = mimeTypes.lookup(path)
|
|
78
|
+
let order = this.num(this.args.order)
|
|
79
|
+
if (!order) {
|
|
80
|
+
const maxNumber: Record<string, number> = {}
|
|
81
|
+
const old: TagModelData[] = await this.get(`/db/${db}/tags`)
|
|
82
|
+
for (const tag of old) {
|
|
83
|
+
if (!tag.type) {
|
|
84
|
+
continue
|
|
85
|
+
}
|
|
86
|
+
maxNumber[tag.type] = Math.max(maxNumber[tag.type] || 0, tag.order)
|
|
87
|
+
}
|
|
88
|
+
order = (maxNumber[this.str(type)] || 0) + 1
|
|
89
|
+
}
|
|
90
|
+
const picture = fs.readFileSync(this.str(path)).toString('base64')
|
|
91
|
+
|
|
92
|
+
const params = { tag, name, mime, type, order, picture }
|
|
93
|
+
await this.post(`/db/${db}/tags`, params)
|
|
94
|
+
log(`Tag ${tag} created successfully.`)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async run() {
|
|
98
|
+
await this.runBy('subCommand')
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export default TagCommand
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import { sprintf } from 'sprintf-js'
|
|
3
|
+
import { Command } from '.'
|
|
4
|
+
import { ArgumentParser } from 'argparse'
|
|
5
|
+
import { DocumentModelData, EntryModelData, log } from '@dataplug/tasenor-common'
|
|
6
|
+
|
|
7
|
+
class TxCommand extends Command {
|
|
8
|
+
|
|
9
|
+
addArguments(parser: ArgumentParser): void {
|
|
10
|
+
const sub = parser.add_subparsers()
|
|
11
|
+
|
|
12
|
+
const ls = sub.add_parser('ls', { help: 'List all transactions' })
|
|
13
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
14
|
+
ls.add_argument('db', { help: 'Name of the database' })
|
|
15
|
+
ls.add_argument('period', { help: 'Period year, date or ID' })
|
|
16
|
+
|
|
17
|
+
const rm = sub.add_parser('rm', { help: 'Delete a transaction' })
|
|
18
|
+
rm.set_defaults({ subCommand: 'rm' })
|
|
19
|
+
rm.add_argument('db', { help: 'Name of the database' })
|
|
20
|
+
rm.add_argument('id', { help: 'ID of the transaction' })
|
|
21
|
+
|
|
22
|
+
const create = sub.add_parser('create', { help: 'Create a transaction' })
|
|
23
|
+
create.set_defaults({ subCommand: 'create' })
|
|
24
|
+
create.add_argument('--force', { help: 'Allow invalid transactions.', action: 'store_true', required: false })
|
|
25
|
+
create.add_argument('--data', { help: 'Define additional data field for all entries as JSON.', required: false })
|
|
26
|
+
create.add_argument('db', { help: 'Name of the database' })
|
|
27
|
+
create.add_argument('date', { help: 'The transaction date' })
|
|
28
|
+
create.add_argument('entry', { nargs: '+', help: 'A transaction line as string, e.g "1234 Description +12,00" or "1234 Description +12,00 {<data>}"' })
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async ls() {
|
|
32
|
+
const { db, period } = this.args
|
|
33
|
+
const periodId = await this.periodId(db, period)
|
|
34
|
+
const resp = await this.get(`/db/${db}/document?period=${periodId}&entries`)
|
|
35
|
+
await this.readAccounts(db)
|
|
36
|
+
this.out('document', resp)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
print(data: DocumentModelData[]): void {
|
|
40
|
+
for (const doc of data.sort((a, b) => (a.number || 0) - (b.number || 0))) {
|
|
41
|
+
const { number, date } = doc
|
|
42
|
+
console.log(`#${number} ${date}`)
|
|
43
|
+
if (doc.entries) {
|
|
44
|
+
for (const entry of doc.entries) {
|
|
45
|
+
console.log(' ', this.accountsById[entry.account_id || -1].number, sprintf('%.2f', entry.debit ? entry.amount / 100 : entry.amount / -100), entry.description)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async rm() {
|
|
52
|
+
const { db, id } = this.args
|
|
53
|
+
await this.delete(`/db/${db}/document/${id}`)
|
|
54
|
+
log(`Document ${id} deleted successfully.`)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async create() {
|
|
58
|
+
const { db, date, data, entry, force } = this.args
|
|
59
|
+
if (!db) {
|
|
60
|
+
throw new Error(`Invalid database argument ${JSON.stringify(db)}`)
|
|
61
|
+
}
|
|
62
|
+
const periodId = await this.periodId(db, date)
|
|
63
|
+
let entries = await this.entries(db, entry)
|
|
64
|
+
if (data) {
|
|
65
|
+
const extras = await this.jsonData(data)
|
|
66
|
+
entries = entries.map(e => ({ ...e, data: extras }))
|
|
67
|
+
}
|
|
68
|
+
const sum = entries.reduce((prev, cur) => prev + cur.amount, 0)
|
|
69
|
+
if (sum && !force) {
|
|
70
|
+
throw new Error(`Transaction total must be zero. Got ${sum} from ${JSON.stringify(entries)}.`)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const document: DocumentModelData = await this.post(`/db/${db}/document`, { period_id: periodId, date: this.date(date) })
|
|
74
|
+
log(`Created a document #${document.id} on ${date}.`)
|
|
75
|
+
for (const e of entries) {
|
|
76
|
+
const out: EntryModelData = await this.post(`/db/${db}/entry`, {
|
|
77
|
+
document_id: document.id,
|
|
78
|
+
account_id: e.account_id,
|
|
79
|
+
debit: e.amount > 0,
|
|
80
|
+
amount: Math.abs(e.amount),
|
|
81
|
+
description: e.description,
|
|
82
|
+
data: e.data
|
|
83
|
+
})
|
|
84
|
+
log(`Created an entry #${out.id} for ${e.number} ${e.description} ${sprintf('%.2f', e.amount / 100)}${e.data ? ' ' + JSON.stringify(e.data) : ''}.`)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async run() {
|
|
89
|
+
await this.runBy('subCommand')
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default TxCommand
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { log } from '@dataplug/tasenor-common'
|
|
2
|
+
import { Command } from '.'
|
|
3
|
+
import { ArgumentParser } from 'argparse'
|
|
4
|
+
|
|
5
|
+
class UserCommand extends Command {
|
|
6
|
+
|
|
7
|
+
addArguments(parser: ArgumentParser): void {
|
|
8
|
+
const sub = parser.add_subparsers()
|
|
9
|
+
|
|
10
|
+
const ls = sub.add_parser('ls', { help: 'List all users' })
|
|
11
|
+
ls.set_defaults({ subCommand: 'ls' })
|
|
12
|
+
|
|
13
|
+
const rm = sub.add_parser('rm', { help: 'Delete a user' })
|
|
14
|
+
rm.set_defaults({ subCommand: 'rm' })
|
|
15
|
+
rm.add_argument('email', { help: 'Email address of the user' })
|
|
16
|
+
|
|
17
|
+
const create = sub.add_parser('create', { help: 'Create a user' })
|
|
18
|
+
create.set_defaults({ subCommand: 'create' })
|
|
19
|
+
create.add_argument('name', { help: 'Full name of the user' })
|
|
20
|
+
create.add_argument('passwd', { help: 'Initial password for the user' })
|
|
21
|
+
create.add_argument('email', { help: 'Email address of the user' })
|
|
22
|
+
|
|
23
|
+
const add = sub.add_parser('add', { help: 'Add a user to the database' })
|
|
24
|
+
add.set_defaults({ subCommand: 'add' })
|
|
25
|
+
add.add_argument('email', { help: 'Email address of the user' })
|
|
26
|
+
add.add_argument('db', { help: 'Name of the database' })
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async ls() {
|
|
30
|
+
const resp = await this.get('/admin/user')
|
|
31
|
+
this.out('user', resp)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
print(data): void {
|
|
35
|
+
for (const user of data.sort((a, b) => (a.id || 0) - (b.id || 0))) {
|
|
36
|
+
const { id, name, email, config } = user
|
|
37
|
+
console.log(`#${id} ${name} ${email} ${JSON.stringify(config)}`)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async rm() {
|
|
42
|
+
const { email } = this.args
|
|
43
|
+
await this.delete(`/admin/user/${email}`)
|
|
44
|
+
log(`User ${email} deleted successfully.`)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
async create() {
|
|
48
|
+
const { name, passwd, email } = this.args
|
|
49
|
+
const params = { name, password: passwd, email }
|
|
50
|
+
await this.post('/admin/user', params)
|
|
51
|
+
log(`User ${name} created successfully.`)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async add() {
|
|
55
|
+
const { email, db } = this.args
|
|
56
|
+
log(`Adding user ${email} to database ${db}`)
|
|
57
|
+
await this.post(`/admin/user/${email}/databases`, { database: this.str(db) })
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async run() {
|
|
61
|
+
await this.runBy('subCommand')
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export default UserCommand
|