ekwo-os 0.4.1
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/README.md +873 -0
- package/dist/args.d.ts +57 -0
- package/dist/args.d.ts.map +1 -0
- package/dist/args.js +134 -0
- package/dist/args.js.map +1 -0
- package/dist/assets/expected-objects.json +9432 -0
- package/dist/assets/migrations/20260911120000_core_companies.sql +260 -0
- package/dist/assets/migrations/20260911120100_accounts_journals.sql +211 -0
- package/dist/assets/migrations/20260911120200_contacts.sql +90 -0
- package/dist/assets/migrations/20260911120300_taxes.sql +146 -0
- package/dist/assets/migrations/20260911120400_entries.sql +338 -0
- package/dist/assets/migrations/20260911120500_documents.sql +279 -0
- package/dist/assets/migrations/20260911120600_payments_reconciliation.sql +251 -0
- package/dist/assets/migrations/20260911120700_bank.sql +178 -0
- package/dist/assets/migrations/20260911120800_analytics_attachments.sql +128 -0
- package/dist/assets/migrations/20260911120900_post_document.sql +279 -0
- package/dist/assets/migrations/20260911121000_reporting.sql +235 -0
- package/dist/assets/migrations/20260911121100_country_templates.sql +226 -0
- package/dist/assets/migrations/20260911121200_fec.sql +71 -0
- package/dist/assets/migrations/20260911130000_instance.sql +77 -0
- package/dist/assets/migrations/20260911130100_instance_members.sql +224 -0
- package/dist/assets/migrations/20260911140000_instance_admins.sql +112 -0
- package/dist/assets/migrations/20260911160000_tax_posting_templates_unique.sql +17 -0
- package/dist/assets/migrations/20260911170000_document_amount_paid.sql +82 -0
- package/dist/assets/migrations/20260911173000_post_payment.sql +122 -0
- package/dist/assets/migrations/20260911173100_sequence_counters_under_rls.sql +84 -0
- package/dist/assets/migrations/20260911183000_country_journal_defaults.sql +143 -0
- package/dist/assets/migrations/20260911193853_line_account_defaults.sql +274 -0
- package/dist/assets/migrations/20260911195054_products.sql +221 -0
- package/dist/assets/migrations/20260911210131_anon_surface.sql +85 -0
- package/dist/assets/migrations/20260912074712_country_packs.sql +318 -0
- package/dist/assets/migrations/20260912080311_report_code_and_region.sql +198 -0
- package/dist/assets/migrations/20260912081014_pack_certification_maintained.sql +31 -0
- package/dist/assets/migrations/20260912081015_pack_certification_backfill.sql +16 -0
- package/dist/assets/migrations/20260912090407_tax_report_boxes.sql +329 -0
- package/dist/assets/migrations/20260912091917_tax_on_base_value.sql +25 -0
- package/dist/assets/migrations/20260912091918_tax_engine_columns.sql +776 -0
- package/dist/assets/migrations/20260912094412_opening_and_closing.sql +759 -0
- package/dist/assets/migrations/20260912095825_charts_of_accounts.sql +326 -0
- package/dist/assets/migrations/20260912100412_financial_statements.sql +632 -0
- package/dist/assets/migrations/20260912104719_one_formula_evaluator.sql +209 -0
- package/dist/assets/migrations/20260912105720_entry_kind_appropriation.sql +26 -0
- package/dist/assets/migrations/20260912105721_appropriation_entry_kind.sql +444 -0
- package/dist/assets/migrations/20260912111751_document_rules.sql +274 -0
- package/dist/assets/migrations/20260912112132_cash_basis_vat_and_fx.sql +1189 -0
- package/dist/assets/migrations/20260913074512_modules.sql +493 -0
- package/dist/assets/migrations/20260913075903_asset_disposal_roles.sql +47 -0
- package/dist/assets/migrations/20260913083216_capabilities.sql +637 -0
- package/dist/assets/migrations/20260913083901_company_invitations.sql +262 -0
- package/dist/assets/migrations/20260913084402_user_preferences.sql +376 -0
- package/dist/assets/migrations/20260913084847_company_profile.sql +261 -0
- package/dist/assets/migrations/20260913085436_numbering_reads_the_pack.sql +235 -0
- package/dist/assets/migrations/20260913085932_api_keys.sql +303 -0
- package/dist/assets/migrations/20260913090216_fiscal_year_bounds.sql +159 -0
- package/dist/assets/migrations/20260913092527_entries_import.sql +219 -0
- package/dist/assets/migrations/20260913101536_null_safe_guards.sql +188 -0
- package/dist/assets/migrations/20260913102115_installer_is_named.sql +462 -0
- package/dist/assets/migrations/20260913102758_no_currency_default.sql +138 -0
- package/dist/assets/migrations/20260913103355_cash_basis_needs_a_box.sql +453 -0
- package/dist/assets/migrations/20260913104014_aged_balance_named_group.sql +79 -0
- package/dist/assets/migrations/20260913104232_foreign_key_indexes.sql +144 -0
- package/dist/assets/migrations/20260913105120_declared_no_reader.sql +41 -0
- package/dist/assets/migrations/20260913111407_pack_languages.sql +223 -0
- package/dist/assets/migrations/20260913112233_schema_comments_for_a_reader.sql +27 -0
- package/dist/assets/migrations/20260913114535_fec_opening_balances.sql +307 -0
- package/dist/assets/migrations/20260914103412_audit_log.sql +509 -0
- package/dist/assets/migrations/20260914111907_pack_upgrade.sql +428 -0
- package/dist/assets/migrations/20260914120500_rounding_reads_the_currency.sql +206 -0
- package/dist/assets/migrations/20260914121200_amounts_round_at_the_currency.sql +2403 -0
- package/dist/assets/migrations/20260914134325_schema_version_0_2_0.sql +36 -0
- package/dist/assets/migrations/20260914143915_accounts_in_use.sql +428 -0
- package/dist/assets/migrations/20260914144731_account_code_frozen.sql +99 -0
- package/dist/assets/migrations/20260914151207_schema_grants_its_own_rights.sql +284 -0
- package/dist/assets/migrations/20260914152840_pack_upgrade_records_its_own_line.sql +237 -0
- package/dist/assets/migrations/20260914163943_declaration_periodicity.sql +349 -0
- package/dist/assets/migrations/20260915094000_foreign_services_received.sql +37 -0
- package/dist/assets/migrations/20260915094500_mentions_read_a_foreign_service.sql +72 -0
- package/dist/assets/migrations/20260915153000_document_shares.sql +568 -0
- package/dist/assets/migrations/20260915160000_ec_sales_list.sql +181 -0
- package/dist/assets/migrations/20260915161842_pack_sources.sql +56 -0
- package/dist/assets/migrations/20260915170500_schema_version_0_3_0.sql +45 -0
- package/dist/assets/migrations/20260915174500_a_vat_category_is_a_code.sql +177 -0
- package/dist/assets/migrations/20260915180000_document_rule_references.sql +85 -0
- package/dist/assets/migrations/20260915181000_territories.sql +342 -0
- package/dist/assets/migrations/20260915181500_ec_sales_list_reads_the_territories.sql +222 -0
- package/dist/assets/migrations/20260915182000_intracom_triangular.sql +53 -0
- package/dist/assets/migrations/20260915182500_a_triangular_supply_says_reverse_charge.sql +99 -0
- package/dist/assets/migrations/20260915191200_a_document_knows_its_language.sql +633 -0
- package/dist/assets/migrations/20260915195000_a_price_that_holds_its_tax.sql +649 -0
- package/dist/assets/migrations/20260915200000_a_posting_names_its_boxes.sql +1004 -0
- package/dist/assets/migrations/20260916094500_a_company_files_more_than_one_declaration.sql +795 -0
- package/dist/assets/migrations/20260916103000_a_ledger_line_names_its_posting.sql +902 -0
- package/dist/assets/migrations/20260916123000_a_vocabulary_for_a_tax_that_is_not_a_vat.sql +144 -0
- package/dist/assets/migrations/20260916124000_a_box_can_be_a_rate_of_a_box.sql +525 -0
- package/dist/assets/migrations/20260916125000_a_tax_follows_the_territory.sql +1318 -0
- package/dist/assets/migrations/20260916126000_a_tax_point_and_its_exception.sql +1211 -0
- package/dist/assets/migrations/20260917090000_a_counterparty_that_learns.sql +561 -0
- package/dist/assets/migrations/20260917120000_what_the_money_pays.sql +545 -0
- package/dist/assets/migrations/20260917150000_a_filing_is_a_row.sql +488 -0
- package/dist/assets/migrations/20260917170000_when_it_is_due.sql +194 -0
- package/dist/assets/migrations/20260917180000_a_box_is_a_number_and_a_kind.sql +213 -0
- package/dist/assets/migrations/20260917190000_what_a_declaration_owes.sql +486 -0
- package/dist/assets/migrations/20260917200000_what_moved_after_it_went.sql +227 -0
- package/dist/assets/migrations/20260918090000_a_form_names_its_file.sql +27 -0
- package/dist/assets/migrations/20260918110000_a_deposit_and_what_came_back.sql +286 -0
- package/dist/assets/migrations/20260918113741_a_fourth_preset_is_named.sql +9 -0
- package/dist/assets/migrations/20260918113807_a_client_reads_and_hands_over.sql +96 -0
- package/dist/assets/migrations/20260918114322_two_definer_functions_check_their_caller.sql +75 -0
- package/dist/assets/migrations/20260918130000_every_company_somebody_keeps.sql +177 -0
- package/dist/assets/migrations/20260918140000_a_session_nobody_prepared.sql +40 -0
- package/dist/assets/migrations/20260918141107_a_line_keeps_the_tax_it_was_posted_with.sql +256 -0
- package/dist/assets/migrations/20260918141342_a_company_has_an_electronic_address.sql +66 -0
- package/dist/assets/migrations/20260918141605_an_invoice_reads_whole_from_the_views.sql +313 -0
- package/dist/assets/migrations/20260918141627_a_policy_asks_once.sql +132 -0
- package/dist/assets/migrations/20260918143352_a_suggestion_reads_the_words_once.sql +204 -0
- package/dist/assets/migrations/20260918143417_a_reference_of_the_caller_and_a_rehearsal.sql +115 -0
- package/dist/assets/migrations/20260918150712_a_company_leaves_with_its_books.sql +1119 -0
- package/dist/assets/migrations/20260918150931_a_statement_is_imported_once.sql +654 -0
- package/dist/assets/migrations/20260918161204_a_posted_document_does_not_move.sql +437 -0
- package/dist/assets/migrations/20260918161538_a_posted_entry_does_not_move.sql +252 -0
- package/dist/assets/migrations/20260918171946_an_entry_is_posted_by_post_entry.sql +289 -0
- package/dist/assets/migrations/20260918174312_schema_version_0_4_0.sql +53 -0
- package/dist/assets/modules/assets/module.json +13 -0
- package/dist/assets/modules/assets/supabase/migrations/20260913081447_assets.sql +1190 -0
- package/dist/assets/modules/assets/supabase/migrations/20260913104234_foreign_key_indexes.sql +47 -0
- package/dist/assets/modules/assets/supabase/migrations/20260913104500_assets_capabilities.sql +145 -0
- package/dist/assets/modules/assets/supabase/migrations/20260914122100_assets_round_at_the_currency.sql +564 -0
- package/dist/assets/modules/assets/supabase/migrations/20260914145012_assets_accounts_in_use.sql +37 -0
- package/dist/assets/modules/assets/supabase/migrations/20260914151530_assets_grants_its_own_rights.sql +63 -0
- package/dist/assets/modules/assets/supabase/migrations/20260918113912_assets_client_reads.sql +20 -0
- package/dist/assets/modules/assets/supabase/migrations/20260918150801_assets_leave_with_the_company.sql +41 -0
- package/dist/assets/modules/budgets/module.json +12 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260913083012_budgets.sql +210 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260913104233_foreign_key_indexes.sql +37 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260913104501_budgets_capabilities.sql +72 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260914122400_budgets_round_at_the_currency.sql +68 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260914145048_budgets_accounts_in_use.sql +30 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260914151812_budgets_grants_its_own_rights.sql +31 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260918113954_budgets_client_reads.sql +20 -0
- package/dist/assets/modules/budgets/supabase/migrations/20260918150823_budgets_leave_with_the_company.sql +37 -0
- package/dist/assets/modules/schema/module.1.json +69 -0
- package/dist/assets/seed/00_currencies.sql +15 -0
- package/dist/assets/seed/00_territories.sql +280 -0
- package/dist/assets/seed/05_framework_generic.sql +110 -0
- package/dist/assets/seed/10_pack_be.sql +1284 -0
- package/dist/assets/seed/11_pack_fr.sql +1112 -0
- package/dist/assets/seed/12_pack_lu.sql +2484 -0
- package/dist/assets/seed/13_pack_ee.sql +733 -0
- package/dist/assets/seed/14_pack_gb.sql +796 -0
- package/dist/assets/seed/15_pack_us.sql +751 -0
- package/dist/assets/seed/90_demo_company.sql +368 -0
- package/dist/assets/seed/modules/assets/10_pack_be.sql +58 -0
- package/dist/assets/seed/modules/assets/11_pack_fr.sql +57 -0
- package/dist/assets/seed/modules/assets/14_pack_gb.sql +58 -0
- package/dist/assets/seed/modules/assets/15_pack_us.sql +60 -0
- package/dist/auth.d.ts +59 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +134 -0
- package/dist/auth.js.map +1 -0
- package/dist/bin.d.ts +6 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +8 -0
- package/dist/bin.js.map +1 -0
- package/dist/books.d.ts +60 -0
- package/dist/books.d.ts.map +1 -0
- package/dist/books.js +168 -0
- package/dist/books.js.map +1 -0
- package/dist/bootstrap.d.ts +236 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +459 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/bundle.d.ts +27 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +47 -0
- package/dist/bundle.js.map +1 -0
- package/dist/checklist.d.ts +35 -0
- package/dist/checklist.d.ts.map +1 -0
- package/dist/checklist.js +64 -0
- package/dist/checklist.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +318 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/company.d.ts +59 -0
- package/dist/commands/company.d.ts.map +1 -0
- package/dist/commands/company.js +287 -0
- package/dist/commands/company.js.map +1 -0
- package/dist/commands/contact.d.ts +9 -0
- package/dist/commands/contact.d.ts.map +1 -0
- package/dist/commands/contact.js +82 -0
- package/dist/commands/contact.js.map +1 -0
- package/dist/commands/demo.d.ts +19 -0
- package/dist/commands/demo.d.ts.map +1 -0
- package/dist/commands/demo.js +72 -0
- package/dist/commands/demo.js.map +1 -0
- package/dist/commands/doctor.d.ts +12 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +68 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/document.d.ts +17 -0
- package/dist/commands/document.d.ts.map +1 -0
- package/dist/commands/document.js +217 -0
- package/dist/commands/document.js.map +1 -0
- package/dist/commands/init.d.ts +31 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +535 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/login.d.ts +24 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +128 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/migrate.d.ts +30 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +115 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/module.d.ts +32 -0
- package/dist/commands/module.d.ts.map +1 -0
- package/dist/commands/module.js +285 -0
- package/dist/commands/module.js.map +1 -0
- package/dist/commands/pack.d.ts +22 -0
- package/dist/commands/pack.d.ts.map +1 -0
- package/dist/commands/pack.js +481 -0
- package/dist/commands/pack.js.map +1 -0
- package/dist/commands/payment.d.ts +15 -0
- package/dist/commands/payment.d.ts.map +1 -0
- package/dist/commands/payment.js +97 -0
- package/dist/commands/payment.js.map +1 -0
- package/dist/commands/register.d.ts +20 -0
- package/dist/commands/register.d.ts.map +1 -0
- package/dist/commands/register.js +134 -0
- package/dist/commands/register.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +134 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whoami.d.ts +21 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +133 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/company.d.ts +16 -0
- package/dist/company.d.ts.map +1 -0
- package/dist/company.js +26 -0
- package/dist/company.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +50 -0
- package/dist/config.js.map +1 -0
- package/dist/connection.d.ts +79 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +116 -0
- package/dist/connection.js.map +1 -0
- package/dist/context.d.ts +47 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +93 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +45 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +448 -0
- package/dist/doctor.js.map +1 -0
- package/dist/grants.d.ts +88 -0
- package/dist/grants.d.ts.map +1 -0
- package/dist/grants.js +174 -0
- package/dist/grants.js.map +1 -0
- package/dist/identity.d.ts +54 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +132 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory.d.ts +155 -0
- package/dist/inventory.d.ts.map +1 -0
- package/dist/inventory.js +303 -0
- package/dist/inventory.js.map +1 -0
- package/dist/migrations.d.ts +76 -0
- package/dist/migrations.d.ts.map +1 -0
- package/dist/migrations.js +226 -0
- package/dist/migrations.js.map +1 -0
- package/dist/module/read.d.ts +91 -0
- package/dist/module/read.d.ts.map +1 -0
- package/dist/module/read.js +172 -0
- package/dist/module/read.js.map +1 -0
- package/dist/output.d.ts +110 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +173 -0
- package/dist/output.js.map +1 -0
- package/dist/pack/certification.d.ts +27 -0
- package/dist/pack/certification.d.ts.map +1 -0
- package/dist/pack/certification.js +38 -0
- package/dist/pack/certification.js.map +1 -0
- package/dist/pack/compile.d.ts +75 -0
- package/dist/pack/compile.d.ts.map +1 -0
- package/dist/pack/compile.js +801 -0
- package/dist/pack/compile.js.map +1 -0
- package/dist/pack/filing.d.ts +48 -0
- package/dist/pack/filing.d.ts.map +1 -0
- package/dist/pack/filing.js +56 -0
- package/dist/pack/filing.js.map +1 -0
- package/dist/pack/read.d.ts +766 -0
- package/dist/pack/read.d.ts.map +1 -0
- package/dist/pack/read.js +2336 -0
- package/dist/pack/read.js.map +1 -0
- package/dist/pack/schema.d.ts +26 -0
- package/dist/pack/schema.d.ts.map +1 -0
- package/dist/pack/schema.js +181 -0
- package/dist/pack/schema.js.map +1 -0
- package/dist/pack/territories.d.ts +98 -0
- package/dist/pack/territories.d.ts.map +1 -0
- package/dist/pack/territories.js +0 -0
- package/dist/pack/territories.js.map +1 -0
- package/dist/pack/upgrade.d.ts +86 -0
- package/dist/pack/upgrade.d.ts.map +1 -0
- package/dist/pack/upgrade.js +76 -0
- package/dist/pack/upgrade.js.map +1 -0
- package/dist/pack/vat-codes.d.ts +273 -0
- package/dist/pack/vat-codes.d.ts.map +1 -0
- package/dist/pack/vat-codes.js +513 -0
- package/dist/pack/vat-codes.js.map +1 -0
- package/dist/profiles.d.ts +67 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +187 -0
- package/dist/profiles.js.map +1 -0
- package/dist/prompt.d.ts +40 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +120 -0
- package/dist/prompt.js.map +1 -0
- package/dist/registry.d.ts +84 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +104 -0
- package/dist/registry.js.map +1 -0
- package/dist/rest.d.ts +81 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +245 -0
- package/dist/rest.js.map +1 -0
- package/dist/schema.d.ts +15 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +15 -0
- package/dist/schema.js.map +1 -0
- package/dist/seeds.d.ts +27 -0
- package/dist/seeds.d.ts.map +1 -0
- package/dist/seeds.js +47 -0
- package/dist/seeds.js.map +1 -0
- package/dist/session.d.ts +39 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +92 -0
- package/dist/session.js.map +1 -0
- package/dist/sql.d.ts +48 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/sql.js +112 -0
- package/dist/sql.js.map +1 -0
- package/dist/status.d.ts +94 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +120 -0
- package/dist/status.js.map +1 -0
- package/dist/ui.d.ts +55 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +114 -0
- package/dist/ui.js.map +1 -0
- package/package.json +29 -0
- package/schema/output.1.json +613 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo payment record` and `ekwo match`.
|
|
3
|
+
*
|
|
4
|
+
* `recordPayment()` of the core is the MCP server's `record_payment`: it
|
|
5
|
+
* inserts the payment, has `post_payment()` book it and `reconcile()` match
|
|
6
|
+
* it. `settleFromStatement()` is `settle_from_statement()` of the schema: the
|
|
7
|
+
* statement line is booked as the payment it is and matched to what is open
|
|
8
|
+
* on the document. Which way the money goes, who it is from and how much is
|
|
9
|
+
* still owed are read from the ledger, never worked out here.
|
|
10
|
+
*/
|
|
11
|
+
import { recordPayment, resolveContact, resolveDocument, settleFromStatement } from '@ekwo-ai/core';
|
|
12
|
+
import { UsageError, boolFlag, rejectUnknownFlags, stringFlag } from '../args.js';
|
|
13
|
+
import { BOOKS_FLAGS, CREATE_FLAGS, given, openBooks, required, stdinDocument, today, uuidArg } from '../books.js';
|
|
14
|
+
import { setResult } from '../output.js';
|
|
15
|
+
import { dim, heading, line, note, pairs, step } from '../ui.js';
|
|
16
|
+
const RECORD_FLAGS = [
|
|
17
|
+
...CREATE_FLAGS, 'doc', 'contact', 'direction', 'amount', 'date', 'bank-account', 'journal', 'reference', 'memo', 'currency', 'rate', 'no-match',
|
|
18
|
+
];
|
|
19
|
+
const RECORD_FIELDS = [
|
|
20
|
+
'document_id', 'document', 'contact_id', 'contact', 'direction', 'amount', 'payment_date', 'bank_account_id', 'journal_id',
|
|
21
|
+
'journal_code', 'reference', 'memo', 'currency_code', 'exchange_rate', 'match_open_items', 'client_ref',
|
|
22
|
+
];
|
|
23
|
+
const text = (value) => (value === null || value === undefined ? '' : String(value));
|
|
24
|
+
export async function paymentCommand(args, deps = {}) {
|
|
25
|
+
if (args.positional[0] !== 'record') {
|
|
26
|
+
throw new UsageError('usage: ekwo payment record --doc <document> --amount <amount> [--date --bank-account <id> | --journal <code>] [--ref]');
|
|
27
|
+
}
|
|
28
|
+
rejectUnknownFlags(args, RECORD_FLAGS);
|
|
29
|
+
const input = await stdinDocument(args, deps, RECORD_FIELDS);
|
|
30
|
+
const { backend, company } = await openBooks(args, deps);
|
|
31
|
+
const doc = stringFlag(args, 'doc') ?? input['document_id'] ?? input['document'];
|
|
32
|
+
const who = stringFlag(args, 'contact') ?? input['contact_id'] ?? input['contact'];
|
|
33
|
+
const direction = stringFlag(args, 'direction') ?? input['direction'];
|
|
34
|
+
if (direction !== undefined && direction !== 'inbound' && direction !== 'outbound') {
|
|
35
|
+
throw new UsageError(`bad_value: --direction is inbound or outbound, got "${direction}".`);
|
|
36
|
+
}
|
|
37
|
+
const bankAccount = stringFlag(args, 'bank-account') ?? input['bank_account_id'];
|
|
38
|
+
const date = stringFlag(args, 'date') ?? input['payment_date'];
|
|
39
|
+
const paymentDate = date ?? today();
|
|
40
|
+
const fields = given({
|
|
41
|
+
company_id: company.id,
|
|
42
|
+
document_id: doc === undefined ? undefined : await resolveDocument(backend, company.id, doc),
|
|
43
|
+
contact_id: who === undefined ? undefined : (await resolveContact(backend, company.id, who)).id,
|
|
44
|
+
direction,
|
|
45
|
+
amount: required(stringFlag(args, 'amount') ?? input['amount'], 'the amount paid', '--amount'),
|
|
46
|
+
payment_date: paymentDate,
|
|
47
|
+
bank_account_id: bankAccount === undefined ? undefined : uuidArg(bankAccount, '--bank-account'),
|
|
48
|
+
journal_id: input['journal_id'],
|
|
49
|
+
journal_code: stringFlag(args, 'journal') ?? input['journal_code'],
|
|
50
|
+
reference: stringFlag(args, 'reference') ?? input['reference'],
|
|
51
|
+
memo: stringFlag(args, 'memo') ?? input['memo'],
|
|
52
|
+
currency_code: stringFlag(args, 'currency') ?? input['currency_code'],
|
|
53
|
+
exchange_rate: stringFlag(args, 'rate') ?? input['exchange_rate'],
|
|
54
|
+
match_open_items: boolFlag(args, 'no-match') ? false : input['match_open_items'],
|
|
55
|
+
client_ref: stringFlag(args, 'ref') ?? input['client_ref'],
|
|
56
|
+
});
|
|
57
|
+
const result = (await recordPayment(backend, fields));
|
|
58
|
+
setResult(result);
|
|
59
|
+
const payment = (result['payment'] ?? {});
|
|
60
|
+
const entry = (result['entry'] ?? {});
|
|
61
|
+
const matched = (result['matched'] ?? []);
|
|
62
|
+
heading(`Payment, in ${company.name}`);
|
|
63
|
+
if (result['replayed'] === true)
|
|
64
|
+
note(dim(`already recorded under the reference ${text(fields.client_ref)}; nothing was recorded twice`));
|
|
65
|
+
if (date === undefined)
|
|
66
|
+
note(dim(`dated today, ${paymentDate}: no --date was given`));
|
|
67
|
+
pairs([
|
|
68
|
+
['payment', `${text(payment['direction'])} ${text(payment['amount'])} ${text(payment['currency_code'])} ${dim(text(payment['id']))}`],
|
|
69
|
+
['date', text(payment['payment_date'])],
|
|
70
|
+
['entry', text(entry['number'])],
|
|
71
|
+
]);
|
|
72
|
+
line();
|
|
73
|
+
if (matched.length === 0)
|
|
74
|
+
note(dim('Matched against nothing.'));
|
|
75
|
+
for (const matching of matched)
|
|
76
|
+
step(`matched ${text(matching?.['amount'])} under ${text(matching?.['matching_number'])}`);
|
|
77
|
+
line();
|
|
78
|
+
note(dim(text(result['note'])));
|
|
79
|
+
return 0;
|
|
80
|
+
}
|
|
81
|
+
export async function matchCommand(args, deps = {}) {
|
|
82
|
+
rejectUnknownFlags(args, BOOKS_FLAGS);
|
|
83
|
+
const { backend, company } = await openBooks(args, deps);
|
|
84
|
+
const transactionId = uuidArg(args.positional[0], 'the bank transaction');
|
|
85
|
+
const documentId = await resolveDocument(backend, company.id, required(args.positional[1], 'the document it pays', '<document>'));
|
|
86
|
+
const result = (await settleFromStatement(backend, { transaction_id: transactionId, document_id: documentId }));
|
|
87
|
+
setResult({ document_id: documentId, ...result });
|
|
88
|
+
const transaction = (result['transaction'] ?? {});
|
|
89
|
+
heading(`Statement line, in ${company.name}`);
|
|
90
|
+
pairs([
|
|
91
|
+
['line', `${text(transaction['transaction_date'])} ${text(transaction['amount'])} ${text(transaction['currency_code'])} ${dim(text(transaction['id']))}`],
|
|
92
|
+
['state', text(transaction['state'])],
|
|
93
|
+
['entry', dim(text(transaction['entry_id']))],
|
|
94
|
+
]);
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=payment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../../src/commands/payment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo register` and `ekwo unregister`.
|
|
3
|
+
*
|
|
4
|
+
* Registering is an opt-in and it is reversible, which is the only thing that
|
|
5
|
+
* makes it a choice. Neither command is ever required, and nothing in the
|
|
6
|
+
* schema or the CLI reads the result to decide what you may do.
|
|
7
|
+
*
|
|
8
|
+
* `register` also serves as the retry: the endpoint at Ekwo does not exist
|
|
9
|
+
* yet, so an installation that opted in during `ekwo init` may have recorded
|
|
10
|
+
* the intent locally and failed to announce it. Running this again sends it.
|
|
11
|
+
*/
|
|
12
|
+
import { type ParsedArgs } from '../args.js';
|
|
13
|
+
import { type CommandDeps } from '../context.js';
|
|
14
|
+
export declare const REGISTER_FLAGS: readonly ["db-url", "db-password", "db-region", "project-ref", "supabase-url", "service-role-key", "email", "org", "country", "registry-url", "admin-user-id", "yes"];
|
|
15
|
+
export declare const UNREGISTER_FLAGS: readonly ["db-url", "db-password", "db-region", "project-ref", "supabase-url", "service-role-key", "admin-user-id", "yes"];
|
|
16
|
+
export declare function registerCommand(args: ParsedArgs, deps?: CommandDeps & {
|
|
17
|
+
fetchImpl?: typeof globalThis.fetch | undefined;
|
|
18
|
+
}): Promise<number>;
|
|
19
|
+
export declare function unregisterCommand(args: ParsedArgs, deps?: CommandDeps): Promise<number>;
|
|
20
|
+
//# sourceMappingURL=register.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAA4C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAkC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AAcjF,eAAO,MAAM,cAAc,uKAQjB,CAAC;AAEX,eAAO,MAAM,gBAAgB,4HAAyD,CAAC;AAEvF,wBAAsB,eAAe,CACnC,IAAI,EAAE,UAAU,EAChB,IAAI,GAAE,WAAW,GAAG;IAAE,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,SAAS,CAAA;CAAO,GAC3E,OAAO,CAAC,MAAM,CAAC,CAyDjB;AA2BD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwCjG"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo register` and `ekwo unregister`.
|
|
3
|
+
*
|
|
4
|
+
* Registering is an opt-in and it is reversible, which is the only thing that
|
|
5
|
+
* makes it a choice. Neither command is ever required, and nothing in the
|
|
6
|
+
* schema or the CLI reads the result to decide what you may do.
|
|
7
|
+
*
|
|
8
|
+
* `register` also serves as the retry: the endpoint at Ekwo does not exist
|
|
9
|
+
* yet, so an installation that opted in during `ekwo init` may have recorded
|
|
10
|
+
* the intent locally and failed to announce it. Running this again sends it.
|
|
11
|
+
*/
|
|
12
|
+
import { boolFlag, rejectUnknownFlags, stringFlag } from '../args.js';
|
|
13
|
+
import { CONNECTION_FLAGS, openDatabase } from '../context.js';
|
|
14
|
+
import { NotInteractiveError, askRequired, isInteractive } from '../prompt.js';
|
|
15
|
+
import { anyAdminId, announce, payloadFor, readInstance, register, registryUrl, unregister, } from '../registry.js';
|
|
16
|
+
import { dim, heading, line, note, skipped, step, warn } from '../ui.js';
|
|
17
|
+
import { setResult } from '../output.js';
|
|
18
|
+
export const REGISTER_FLAGS = [
|
|
19
|
+
...CONNECTION_FLAGS,
|
|
20
|
+
'email',
|
|
21
|
+
'org',
|
|
22
|
+
'country',
|
|
23
|
+
'registry-url',
|
|
24
|
+
'admin-user-id',
|
|
25
|
+
'yes',
|
|
26
|
+
];
|
|
27
|
+
export const UNREGISTER_FLAGS = [...CONNECTION_FLAGS, 'admin-user-id', 'yes'];
|
|
28
|
+
export async function registerCommand(args, deps = {}) {
|
|
29
|
+
rejectUnknownFlags(args, REGISTER_FLAGS);
|
|
30
|
+
const interactive = !boolFlag(args, 'yes') && isInteractive();
|
|
31
|
+
const { db } = await openDatabase(args, { interactive, connect: deps.connect });
|
|
32
|
+
try {
|
|
33
|
+
const instance = await readInstance(db);
|
|
34
|
+
if (instance === undefined) {
|
|
35
|
+
warn('this installation has no instance row yet. Run `ekwo init` first.');
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
const adminUserId = stringFlag(args, 'admin-user-id') ?? (await anyAdminId(db));
|
|
39
|
+
if (adminUserId === undefined) {
|
|
40
|
+
warn('no instance administrator on this installation; there is nobody to register as.');
|
|
41
|
+
return 1;
|
|
42
|
+
}
|
|
43
|
+
const url = stringFlag(args, 'registry-url') ?? registryUrl();
|
|
44
|
+
// Already registered and only the announcement is missing: just send it.
|
|
45
|
+
const email = stringFlag(args, 'email') ??
|
|
46
|
+
instance.contact_email ??
|
|
47
|
+
(interactive ? await askRequired('Contact address?') : undefined);
|
|
48
|
+
if (email === undefined)
|
|
49
|
+
throw new NotInteractiveError('the contact address', '--email');
|
|
50
|
+
heading('Registration');
|
|
51
|
+
if (instance.registered_at !== null && stringFlag(args, 'email') === undefined) {
|
|
52
|
+
skipped(`already registered as ${instance.contact_email ?? email}; re-sending the announcement`);
|
|
53
|
+
const result = await announce(payloadFor(instance, email), {
|
|
54
|
+
url,
|
|
55
|
+
...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),
|
|
56
|
+
});
|
|
57
|
+
report(result.announced, url, result.reason);
|
|
58
|
+
setResult(registration(true, instance.contact_email ?? email, url, result));
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
const result = await register(db, {
|
|
62
|
+
adminUserId,
|
|
63
|
+
email,
|
|
64
|
+
url,
|
|
65
|
+
...(stringFlag(args, 'org') !== undefined ? { organization: stringFlag(args, 'org') } : {}),
|
|
66
|
+
...(stringFlag(args, 'country') !== undefined
|
|
67
|
+
? { country: stringFlag(args, 'country') }
|
|
68
|
+
: {}),
|
|
69
|
+
...(deps.fetchImpl !== undefined ? { fetchImpl: deps.fetchImpl } : {}),
|
|
70
|
+
});
|
|
71
|
+
step(`recorded on the instance row: ${email}`);
|
|
72
|
+
note(dim(`Sent: ${JSON.stringify(result.payload)}`));
|
|
73
|
+
report(result.announced, url, result.reason);
|
|
74
|
+
setResult(registration(true, email, url, result));
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
finally {
|
|
78
|
+
await db.close();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function registration(registered, email, url, result) {
|
|
82
|
+
return {
|
|
83
|
+
registered,
|
|
84
|
+
email,
|
|
85
|
+
registryUrl: url,
|
|
86
|
+
announced: result.announced,
|
|
87
|
+
...(result.reason === undefined ? {} : { reason: result.reason }),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function report(announced, url, reason) {
|
|
91
|
+
if (announced) {
|
|
92
|
+
step(`announced to ${url}`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
warn(`could not reach ${url} (${reason ?? 'unknown'}).`);
|
|
96
|
+
note(dim('The local registration stands. Run `ekwo register` again when you can.'));
|
|
97
|
+
}
|
|
98
|
+
line();
|
|
99
|
+
}
|
|
100
|
+
export async function unregisterCommand(args, deps = {}) {
|
|
101
|
+
rejectUnknownFlags(args, UNREGISTER_FLAGS);
|
|
102
|
+
const interactive = !boolFlag(args, 'yes') && isInteractive();
|
|
103
|
+
const { db } = await openDatabase(args, { interactive, connect: deps.connect });
|
|
104
|
+
try {
|
|
105
|
+
const instance = await readInstance(db);
|
|
106
|
+
if (instance === undefined) {
|
|
107
|
+
warn('this installation has no instance row. Nothing to undo.');
|
|
108
|
+
return 1;
|
|
109
|
+
}
|
|
110
|
+
heading('Registration');
|
|
111
|
+
if (instance.registered_at === null) {
|
|
112
|
+
skipped('this installation is not registered');
|
|
113
|
+
setResult({ registered: false, changed: false });
|
|
114
|
+
line();
|
|
115
|
+
return 0;
|
|
116
|
+
}
|
|
117
|
+
const adminUserId = stringFlag(args, 'admin-user-id') ?? (await anyAdminId(db));
|
|
118
|
+
if (adminUserId === undefined) {
|
|
119
|
+
warn('no instance administrator on this installation.');
|
|
120
|
+
return 1;
|
|
121
|
+
}
|
|
122
|
+
await unregister(db, adminUserId);
|
|
123
|
+
setResult({ registered: false, changed: true });
|
|
124
|
+
step('the address and the date are cleared on the instance row');
|
|
125
|
+
note(dim('Nothing is sent to Ekwo: the CLI only clears the local row. ' +
|
|
126
|
+
'Write to privacy@ekwo.ai to have a registration deleted at our end.'));
|
|
127
|
+
line();
|
|
128
|
+
return 0;
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await db.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=register.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/commands/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo status` — what is on the other end of the connection string.
|
|
3
|
+
*/
|
|
4
|
+
import { type ParsedArgs } from '../args.js';
|
|
5
|
+
import { type CommandDeps } from '../context.js';
|
|
6
|
+
export declare const STATUS_FLAGS: readonly ["db-url", "db-password", "db-region", "project-ref", "supabase-url", "service-role-key", "yes"];
|
|
7
|
+
export declare function statusCommand(args: ParsedArgs, deps?: CommandDeps): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAgC,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAG3E,OAAO,EAAkC,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AASjF,eAAO,MAAM,YAAY,2GAAwC,CAAC;AAsBlE,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiH7F"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo status` — what is on the other end of the connection string.
|
|
3
|
+
*/
|
|
4
|
+
import { boolFlag, rejectUnknownFlags } from '../args.js';
|
|
5
|
+
import { migrationsDir } from '../bundle.js';
|
|
6
|
+
import { describeCertification } from '../pack/certification.js';
|
|
7
|
+
import { CONNECTION_FLAGS, openDatabase } from '../context.js';
|
|
8
|
+
import { listMigrations } from '../migrations.js';
|
|
9
|
+
import { allModuleMigrations, listModules } from '../module/read.js';
|
|
10
|
+
import { isInteractive } from '../prompt.js';
|
|
11
|
+
import { SCHEMA_MIN } from '../schema.js';
|
|
12
|
+
import { status } from '../status.js';
|
|
13
|
+
import { setResult } from '../output.js';
|
|
14
|
+
import { dim, heading, line, note, pairs, warn, yellow } from '../ui.js';
|
|
15
|
+
export const STATUS_FLAGS = [...CONNECTION_FLAGS, 'yes'];
|
|
16
|
+
/**
|
|
17
|
+
* The migrations this release carries, the socle's and the modules'.
|
|
18
|
+
*
|
|
19
|
+
* `ekwo migrate` installs the modules by default — a module is a schema whose
|
|
20
|
+
* tables are empty until a company enables it — and records their versions in
|
|
21
|
+
* the same history table as the socle's. So a gap computed against the socle
|
|
22
|
+
* alone reads eight module versions as history this CLI has no file for, and
|
|
23
|
+
* an installation that was merely kept up to date is reported as "ahead of
|
|
24
|
+
* this CLI: upgrade the CLI before migrating" — advice to upgrade something
|
|
25
|
+
* that is already current. Found by the end-to-end run of 14 September 2026
|
|
26
|
+
* against a real project, where `ekwo migrate` and `ekwo doctor` disagreed
|
|
27
|
+
* about the same database one command apart.
|
|
28
|
+
*/
|
|
29
|
+
async function everything() {
|
|
30
|
+
const modules = await listModules();
|
|
31
|
+
return [...(await listMigrations(migrationsDir())), ...allModuleMigrations(modules)].sort((a, b) => a.version.localeCompare(b.version));
|
|
32
|
+
}
|
|
33
|
+
export async function statusCommand(args, deps = {}) {
|
|
34
|
+
rejectUnknownFlags(args, STATUS_FLAGS);
|
|
35
|
+
const interactive = !boolFlag(args, 'yes') && isInteractive();
|
|
36
|
+
const { db, connection } = await openDatabase(args, { interactive, connect: deps.connect });
|
|
37
|
+
try {
|
|
38
|
+
const migrations = await everything();
|
|
39
|
+
const report = await status(db, migrations);
|
|
40
|
+
setResult(report);
|
|
41
|
+
if (!report.schemaInstalled) {
|
|
42
|
+
heading('Schema');
|
|
43
|
+
warn('not installed on this project. Run `ekwo init`.');
|
|
44
|
+
return 1;
|
|
45
|
+
}
|
|
46
|
+
heading('Schema');
|
|
47
|
+
pairs([
|
|
48
|
+
['project', connection.supabaseUrl ?? connection.projectRef ?? '(from --db-url)'],
|
|
49
|
+
['installed version', report.installedVersion ?? 'unknown'],
|
|
50
|
+
['available version', report.availableVersion ?? 'unknown'],
|
|
51
|
+
['this CLI needs', `${SCHEMA_MIN} or newer`],
|
|
52
|
+
['migrations', `${report.appliedCount} applied, ${report.pending.length} pending`],
|
|
53
|
+
]);
|
|
54
|
+
if (report.pending.length > 0) {
|
|
55
|
+
line();
|
|
56
|
+
for (const migration of report.pending)
|
|
57
|
+
note(yellow(`pending ${migration.file}`));
|
|
58
|
+
note(dim('Run `ekwo migrate` to apply them.'));
|
|
59
|
+
}
|
|
60
|
+
if (report.unknown.length > 0) {
|
|
61
|
+
line();
|
|
62
|
+
warn(`${report.unknown.length} migration(s) applied here are not in this release.`);
|
|
63
|
+
}
|
|
64
|
+
heading('Instance');
|
|
65
|
+
if (report.instance === undefined) {
|
|
66
|
+
note(dim('the schema is there but init_instance() has not run — `ekwo init` finishes it'));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
pairs([
|
|
70
|
+
['organisation', report.instance.organization_name],
|
|
71
|
+
['country', report.instance.country],
|
|
72
|
+
['edition', report.instance.edition],
|
|
73
|
+
['instance id', report.instance.instance_id],
|
|
74
|
+
['administrators', String(report.admins)],
|
|
75
|
+
[
|
|
76
|
+
'registered',
|
|
77
|
+
report.instance.registered_at === null
|
|
78
|
+
? 'no'
|
|
79
|
+
: `${report.instance.contact_email ?? ''} since ${report.instance.registered_at}`,
|
|
80
|
+
],
|
|
81
|
+
]);
|
|
82
|
+
}
|
|
83
|
+
heading(`Country packs (${report.packs.length})`);
|
|
84
|
+
if (report.packs.length === 0) {
|
|
85
|
+
note(dim('none recorded — this installation was seeded before packs, or the seeds have not run'));
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
pairs(report.packs.map((p) => [
|
|
89
|
+
`${p.country} ${p.name}`,
|
|
90
|
+
`${p.version} · ${describeCertification({
|
|
91
|
+
status: p.certificationStatus,
|
|
92
|
+
by: p.certifiedBy,
|
|
93
|
+
on: p.certifiedAt,
|
|
94
|
+
})} · charts: ${p.charts.length === 0
|
|
95
|
+
? 'none recorded'
|
|
96
|
+
: p.charts.map((c) => `${c.code}${c.isDefault ? ' (default)' : ''}`).join(', ')}${p.einvoiceProfile === null ? '' : ` · e-invoicing: ${p.einvoiceProfile}`}`,
|
|
97
|
+
]));
|
|
98
|
+
}
|
|
99
|
+
heading(`Companies (${report.companies.length})`);
|
|
100
|
+
if (report.companies.length === 0) {
|
|
101
|
+
note(dim('none yet'));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
pairs(report.companies.map((c) => [
|
|
105
|
+
c.name,
|
|
106
|
+
`${c.country} · pack ${c.packVersion ?? 'unknown'} · chart ${c.chartCode ?? 'unknown'} · ` +
|
|
107
|
+
`files ${c.filingPeriods.length === 0
|
|
108
|
+
? 'nothing on a recorded cadence'
|
|
109
|
+
: c.filingPeriods
|
|
110
|
+
.map((f) => `${f.reportName ?? f.reportCode} every ${f.period}`)
|
|
111
|
+
.join(', ')} · ` +
|
|
112
|
+
`${c.accounts} accounts · ${c.entries} entries · ` +
|
|
113
|
+
`${c.fiscalYears} financial year(s), ${c.fiscalYears - c.closedFiscalYears} open` +
|
|
114
|
+
(c.liveShares === 0 ? '' : ` · ${c.liveShares} document(s) published behind a link`),
|
|
115
|
+
]));
|
|
116
|
+
const behind = report.companies.filter((c) => {
|
|
117
|
+
const loaded = report.packs.find((p) => p.country === c.country);
|
|
118
|
+
return loaded !== undefined && c.packVersion !== null && c.packVersion !== loaded.version;
|
|
119
|
+
});
|
|
120
|
+
for (const company of behind) {
|
|
121
|
+
const loaded = report.packs.find((p) => p.country === company.country);
|
|
122
|
+
line();
|
|
123
|
+
warn(`${company.name} copied ${company.country} pack ${company.packVersion}, this installation holds ` +
|
|
124
|
+
`${loaded?.version}. \`ekwo pack upgrade\` will show the difference.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
line();
|
|
128
|
+
return report.pending.length > 0 ? 1 : 0;
|
|
129
|
+
}
|
|
130
|
+
finally {
|
|
131
|
+
await db.close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo whoami` and `ekwo use`.
|
|
3
|
+
*
|
|
4
|
+
* `whoami` answers the four questions a caller has before it touches a
|
|
5
|
+
* ledger: who am I here, on which instance and at which schema version, which
|
|
6
|
+
* companies can I see, and what may I do on the one in use. Every part of the
|
|
7
|
+
* answer is asked of the instance as the person — the companies are the rows
|
|
8
|
+
* the policies let through, and the capabilities are `member_capabilities()`,
|
|
9
|
+
* the function the MCP server calls for `your_capabilities`. Nothing is
|
|
10
|
+
* worked out here.
|
|
11
|
+
*
|
|
12
|
+
* `use` records the company the next commands run on. It is checked against
|
|
13
|
+
* the instance first, as the person: a company they cannot see is unknown.
|
|
14
|
+
*/
|
|
15
|
+
import { type ParsedArgs } from '../args.js';
|
|
16
|
+
import { type UserDeps } from '../identity.js';
|
|
17
|
+
export declare const WHOAMI_FLAGS: readonly ["profile", "company", "supabase-url", "anon-key"];
|
|
18
|
+
export declare const USE_FLAGS: readonly ["profile"];
|
|
19
|
+
export declare function whoamiCommand(args: ParsedArgs, deps?: UserDeps): Promise<number>;
|
|
20
|
+
export declare function useCommand(args: ParsedArgs, deps?: UserDeps): Promise<number>;
|
|
21
|
+
//# sourceMappingURL=whoami.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAA8C,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzF,OAAO,EAA8D,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAM3G,eAAO,MAAM,YAAY,6DAA+B,CAAC;AACzD,eAAO,MAAM,SAAS,sBAAuB,CAAC;AAwB9C,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA6E1F;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,QAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BvF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ekwo whoami` and `ekwo use`.
|
|
3
|
+
*
|
|
4
|
+
* `whoami` answers the four questions a caller has before it touches a
|
|
5
|
+
* ledger: who am I here, on which instance and at which schema version, which
|
|
6
|
+
* companies can I see, and what may I do on the one in use. Every part of the
|
|
7
|
+
* answer is asked of the instance as the person — the companies are the rows
|
|
8
|
+
* the policies let through, and the capabilities are `member_capabilities()`,
|
|
9
|
+
* the function the MCP server calls for `your_capabilities`. Nothing is
|
|
10
|
+
* worked out here.
|
|
11
|
+
*
|
|
12
|
+
* `use` records the company the next commands run on. It is checked against
|
|
13
|
+
* the instance first, as the person: a company they cannot see is unknown.
|
|
14
|
+
*/
|
|
15
|
+
import { schemaIsAtLeast } from '@ekwo-ai/core';
|
|
16
|
+
import { UsageError, rejectUnknownFlags, stringFlag } from '../args.js';
|
|
17
|
+
import { matchCompany } from '../company.js';
|
|
18
|
+
import { IDENTITY_FLAGS, actAsUser, refuseInstallerKey } from '../identity.js';
|
|
19
|
+
import { setContext, setResult } from '../output.js';
|
|
20
|
+
import { readProfiles, writeProfiles } from '../profiles.js';
|
|
21
|
+
import { SCHEMA_MIN } from '../schema.js';
|
|
22
|
+
import { bold, dim, heading, line, note, pairs, step, table, warn } from '../ui.js';
|
|
23
|
+
export const WHOAMI_FLAGS = [...IDENTITY_FLAGS];
|
|
24
|
+
export const USE_FLAGS = ['profile'];
|
|
25
|
+
const COMPANY_COLUMNS = ['id', 'name', 'country', 'currency_code'];
|
|
26
|
+
function visibleCompanies(acting) {
|
|
27
|
+
return acting.client.select('companies', { columns: COMPANY_COLUMNS, order: 'name.asc' });
|
|
28
|
+
}
|
|
29
|
+
/** `setof text` arrives as strings over PostgREST, and as one-column rows from some gateways. */
|
|
30
|
+
function capabilityCodes(rows) {
|
|
31
|
+
return rows
|
|
32
|
+
.map((row) => typeof row === 'string' ? row : row?.['member_capabilities'])
|
|
33
|
+
.filter((code) => typeof code === 'string');
|
|
34
|
+
}
|
|
35
|
+
export async function whoamiCommand(args, deps = {}) {
|
|
36
|
+
refuseInstallerKey(args);
|
|
37
|
+
rejectUnknownFlags(args, WHOAMI_FLAGS);
|
|
38
|
+
const acting = await actAsUser(args, deps);
|
|
39
|
+
const instance = acting.client.instance.supabaseUrl;
|
|
40
|
+
const user = await acting.client.user();
|
|
41
|
+
const companies = await visibleCompanies(acting);
|
|
42
|
+
// `--company` for this one answer, else the one in use. A company in use
|
|
43
|
+
// that is no longer visible — a membership that ended — is said, not hidden.
|
|
44
|
+
const asked = stringFlag(args, 'company');
|
|
45
|
+
let company;
|
|
46
|
+
if (asked !== undefined)
|
|
47
|
+
company = matchCompany(companies, asked);
|
|
48
|
+
else if (acting.storedCompany !== undefined) {
|
|
49
|
+
const stored = acting.storedCompany;
|
|
50
|
+
company = companies.find((c) => c.id === stored.id);
|
|
51
|
+
if (company === undefined) {
|
|
52
|
+
warn(`the company in use, ${stored.name}, is no longer visible to you. \`ekwo use <company>\` picks another.`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
setContext({
|
|
56
|
+
profile: acting.profile ?? null,
|
|
57
|
+
instance,
|
|
58
|
+
company: company === undefined ? null : { id: company.id, name: company.name },
|
|
59
|
+
});
|
|
60
|
+
const versions = await acting.client.rpc('ekwo_schema_version');
|
|
61
|
+
const schemaVersion = typeof versions[0] === 'string' ? versions[0] : null;
|
|
62
|
+
if (schemaVersion !== null && !schemaIsAtLeast(schemaVersion, SCHEMA_MIN)) {
|
|
63
|
+
warn(`this instance is at schema ${schemaVersion} and this CLI is written against ${SCHEMA_MIN}. Its operator runs \`ekwo migrate\`.`);
|
|
64
|
+
}
|
|
65
|
+
const capabilities = company === undefined
|
|
66
|
+
? null
|
|
67
|
+
: capabilityCodes(await acting.client.rpc('member_capabilities', { p_company_id: company.id }));
|
|
68
|
+
const profiles = acting.source === 'profile' ? Object.keys((await readProfiles(acting.configDir)).profiles).sort() : [];
|
|
69
|
+
setResult({
|
|
70
|
+
source: acting.source,
|
|
71
|
+
profile: acting.profile ?? null,
|
|
72
|
+
profiles,
|
|
73
|
+
instance: { url: instance, schemaVersion },
|
|
74
|
+
user: { id: user.id, email: user.email ?? null },
|
|
75
|
+
company: company ?? null,
|
|
76
|
+
capabilities,
|
|
77
|
+
companies: companies.map((c) => ({ ...c, inUse: c.id === company?.id })),
|
|
78
|
+
});
|
|
79
|
+
heading('Who');
|
|
80
|
+
pairs([
|
|
81
|
+
['user', `${user.email ?? dim('no address')} ${dim(user.id)}`],
|
|
82
|
+
['instance', instance],
|
|
83
|
+
['schema', schemaVersion ?? dim('unknown')],
|
|
84
|
+
['from', acting.source === 'environment' ? 'the environment' : `the profile ${acting.profile}`],
|
|
85
|
+
]);
|
|
86
|
+
heading('Companies you can see');
|
|
87
|
+
if (companies.length === 0)
|
|
88
|
+
note(dim('None. Somebody has to invite you to one.'));
|
|
89
|
+
else {
|
|
90
|
+
table([{ title: '' }, { title: 'name' }, { title: 'country' }, { title: 'currency' }, { title: 'id' }], companies.map((c) => [c.id === company?.id ? '*' : '', c.name, c.country, c.currency_code, dim(c.id)]));
|
|
91
|
+
}
|
|
92
|
+
if (company !== undefined && capabilities !== null) {
|
|
93
|
+
heading(`What you may do on ${company.name}`);
|
|
94
|
+
if (capabilities.length === 0)
|
|
95
|
+
note(dim('Nothing: you are not a member of it.'));
|
|
96
|
+
else
|
|
97
|
+
for (const code of capabilities)
|
|
98
|
+
line(` ${code}`);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
line();
|
|
102
|
+
note(dim(`No company in use. ${bold('ekwo use <company>')} picks one; --company names one for a single command.`));
|
|
103
|
+
}
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
export async function useCommand(args, deps = {}) {
|
|
107
|
+
refuseInstallerKey(args);
|
|
108
|
+
rejectUnknownFlags(args, USE_FLAGS);
|
|
109
|
+
const wanted = args.positional[0];
|
|
110
|
+
if (wanted === undefined || args.positional.length > 1) {
|
|
111
|
+
throw new UsageError('usage: ekwo use <company> — its name, in quotes when it has a space, or its id');
|
|
112
|
+
}
|
|
113
|
+
const acting = await actAsUser(args, deps);
|
|
114
|
+
if (acting.profile === undefined) {
|
|
115
|
+
throw new UsageError('no_profile: the environment says who you are, and the environment has nowhere to keep a company. Pass --company to each command instead.');
|
|
116
|
+
}
|
|
117
|
+
const company = matchCompany(await visibleCompanies(acting), wanted);
|
|
118
|
+
const ref = { id: company.id, name: company.name };
|
|
119
|
+
const file = await readProfiles(acting.configDir);
|
|
120
|
+
const profile = file.profiles[acting.profile];
|
|
121
|
+
if (profile === undefined)
|
|
122
|
+
throw new UsageError(`unknown_profile: there is no profile called ${acting.profile}.`);
|
|
123
|
+
await writeProfiles(acting.configDir, {
|
|
124
|
+
...file,
|
|
125
|
+
profiles: { ...file.profiles, [acting.profile]: { ...profile, company: ref } },
|
|
126
|
+
});
|
|
127
|
+
setContext({ profile: acting.profile, instance: acting.client.instance.supabaseUrl, company: ref });
|
|
128
|
+
setResult({ profile: acting.profile, company });
|
|
129
|
+
heading('Company in use');
|
|
130
|
+
step(`${company.name} ${dim(company.id)}, for the profile ${acting.profile}`);
|
|
131
|
+
return 0;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=whoami.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/commands/whoami.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The company a name or an id refers to, among those a caller can see.
|
|
3
|
+
*
|
|
4
|
+
* A name is what a person types and a uuid is what a script passes, so both
|
|
5
|
+
* are accepted; an ambiguous name is refused rather than resolved to the first
|
|
6
|
+
* match, because working on the wrong company is not a mistake anybody
|
|
7
|
+
* notices the same day. The list is whatever the caller was allowed to read —
|
|
8
|
+
* every company for the installer's connection, the ones row level security
|
|
9
|
+
* lets through for a person — so a company somebody was never invited to is
|
|
10
|
+
* simply unknown, which is also all they should learn about it.
|
|
11
|
+
*/
|
|
12
|
+
export declare function matchCompany<C extends {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
}>(companies: readonly C[], wanted: string): C;
|
|
16
|
+
//# sourceMappingURL=company.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"company.d.ts","sourceRoot":"","sources":["../src/company.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,wBAAgB,YAAY,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,CAkB/G"}
|