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,47 @@
|
|
|
1
|
+
-- Ekwo OS — a foreign key without an index is a sequential scan waiting for
|
|
2
|
+
-- a big enough table.
|
|
3
|
+
--
|
|
4
|
+
-- Postgres indexes the *referenced* side of a foreign key, because that side
|
|
5
|
+
-- is a primary key. It indexes nothing on the referencing side. Two things
|
|
6
|
+
-- then read the whole table:
|
|
7
|
+
--
|
|
8
|
+
-- * every delete or key update of the parent, which has to prove no child
|
|
9
|
+
-- points at the row — deleting one contact scans `entry_lines`;
|
|
10
|
+
-- * every join written the natural way, which for an accounting core is
|
|
11
|
+
-- most of them: a document to its lines, an entry to its lines, a line to
|
|
12
|
+
-- its account, its tax, its contact.
|
|
13
|
+
--
|
|
14
|
+
-- On the demo company nothing is slow, which is exactly why this survived 49
|
|
15
|
+
-- migrations. On a company with four years of books it is the difference
|
|
16
|
+
-- between a report and a timeout.
|
|
17
|
+
--
|
|
18
|
+
-- 11 indexes: every foreign key of the `assets` module that had none, and the
|
|
19
|
+
-- `company_id` of the tables that had none either — which the sweep covers,
|
|
20
|
+
-- because `company_id` is itself a foreign key everywhere it appears.
|
|
21
|
+
--
|
|
22
|
+
-- Where a table has both a single-column key and a composite one leading with
|
|
23
|
+
-- the same column — `(account_id)` and `(account_id, company_id)`, the shape
|
|
24
|
+
-- this schema uses to keep a child in its parent's company — one index on the
|
|
25
|
+
-- composite serves both, and that is the one created.
|
|
26
|
+
--
|
|
27
|
+
-- The list is not maintained by hand. `tests/schema.test.ts` asks the
|
|
28
|
+
-- catalogue the same question and fails when the answer is not empty, so a
|
|
29
|
+
-- foreign key added later arrives with its index or the build says so.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
-- assets.assets
|
|
33
|
+
create index if not exists assets_asset_account_company_idx on assets.assets (asset_account_id, company_id);
|
|
34
|
+
create index if not exists assets_contact_company_idx on assets.assets (contact_id, company_id);
|
|
35
|
+
create index if not exists assets_depreciation_account_company_idx on assets.assets (depreciation_account_id, company_id);
|
|
36
|
+
create index if not exists assets_expense_account_company_idx on assets.assets (expense_account_id, company_id);
|
|
37
|
+
create index if not exists assets_product_idx on assets.assets (product_id);
|
|
38
|
+
|
|
39
|
+
-- assets.depreciation_lines
|
|
40
|
+
create index if not exists depreciation_lines_asset_company_idx on assets.depreciation_lines (asset_id, company_id);
|
|
41
|
+
|
|
42
|
+
-- assets.disposals
|
|
43
|
+
create index if not exists disposals_asset_company_idx on assets.disposals (asset_id, company_id);
|
|
44
|
+
create index if not exists disposals_company_idx on assets.disposals (company_id);
|
|
45
|
+
create index if not exists disposals_contact_idx on assets.disposals (contact_id);
|
|
46
|
+
create index if not exists disposals_counterpart_account_idx on assets.disposals (counterpart_account_id);
|
|
47
|
+
create index if not exists disposals_entry_idx on assets.disposals (entry_id);
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
-- Ekwo module `assets` — the module names what it lets somebody do.
|
|
2
|
+
--
|
|
3
|
+
-- Its policies asked `public.can_write_company()`, which is `entries.write`:
|
|
4
|
+
-- whoever may draft a journal entry may also create a fixed asset, change its
|
|
5
|
+
-- cost, rewrite its schedule and record its disposal. That is one lock for two
|
|
6
|
+
-- doors, and the wrong one — the register that explains a depreciation entry
|
|
7
|
+
-- is not the entry, and the person who keeps it is often not the person who
|
|
8
|
+
-- posts the books.
|
|
9
|
+
--
|
|
10
|
+
-- So the module declares its own vocabulary, in its own migration, which is
|
|
11
|
+
-- where it belongs: a migration of the socle that named `assets` would be the
|
|
12
|
+
-- socle knowing what is built beside it. `capabilities.area` is the module
|
|
13
|
+
-- code, exactly as the socle's comment says it should be.
|
|
14
|
+
--
|
|
15
|
+
-- assets.read — see the register.
|
|
16
|
+
-- assets.write — create an asset, change it, plan its depreciation.
|
|
17
|
+
-- assets.post — put a period or a disposal into the ledger.
|
|
18
|
+
--
|
|
19
|
+
-- `assets.post` is not the same as `entries.post`, and both are asked: this
|
|
20
|
+
-- one says the module may send *this* to the ledger, and `post_entry()` still
|
|
21
|
+
-- asks the socle's own question afterwards. Neither is redundant — an
|
|
22
|
+
-- accountant who may post the books may be deliberately kept off the asset
|
|
23
|
+
-- register, and somebody who keeps the register is not thereby allowed to
|
|
24
|
+
-- post anything else.
|
|
25
|
+
--
|
|
26
|
+
-- The presets follow the socle's: a viewer reads, an accountant does the work,
|
|
27
|
+
-- an owner holds everything. The socle filled the owner preset with `select
|
|
28
|
+
-- 'owner', code from capabilities` at its own migration time, so a code added
|
|
29
|
+
-- later has to name the owner itself.
|
|
30
|
+
|
|
31
|
+
insert into public.capabilities (code, area, description) values
|
|
32
|
+
('assets.read', 'assets', 'Read the fixed asset register, its depreciation schedules and its disposals.'),
|
|
33
|
+
('assets.write', 'assets', 'Create and change fixed assets and plan their depreciation.'),
|
|
34
|
+
('assets.post', 'assets', 'Book a depreciation period or a disposal to the ledger. Cannot be undone.')
|
|
35
|
+
on conflict (code) do update set area = excluded.area, description = excluded.description;
|
|
36
|
+
|
|
37
|
+
insert into public.role_capabilities (role, capability) values
|
|
38
|
+
('viewer'::public.member_role, 'assets.read'),
|
|
39
|
+
('accountant'::public.member_role, 'assets.read'),
|
|
40
|
+
('accountant'::public.member_role, 'assets.write'),
|
|
41
|
+
('accountant'::public.member_role, 'assets.post'),
|
|
42
|
+
('owner'::public.member_role, 'assets.read'),
|
|
43
|
+
('owner'::public.member_role, 'assets.write'),
|
|
44
|
+
('owner'::public.member_role, 'assets.post')
|
|
45
|
+
on conflict do nothing;
|
|
46
|
+
|
|
47
|
+
-- ---------------------------------------------------------------------------
|
|
48
|
+
-- The policies, on the module's own words
|
|
49
|
+
--
|
|
50
|
+
-- `module_enabled()` stays in front of every one of them: a capability says
|
|
51
|
+
-- what a person may do, and the module being enabled says whether the company
|
|
52
|
+
-- has this at all. The two questions are not the same and neither replaces
|
|
53
|
+
-- the other.
|
|
54
|
+
-- ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
drop policy assets_select on assets.assets;
|
|
57
|
+
create policy assets_select on assets.assets
|
|
58
|
+
for select using (
|
|
59
|
+
public.module_enabled(company_id, 'assets')
|
|
60
|
+
and public.has_capability(company_id, 'assets.read')
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
drop policy assets_write on assets.assets;
|
|
64
|
+
create policy assets_write on assets.assets
|
|
65
|
+
for all using (
|
|
66
|
+
public.module_enabled(company_id, 'assets')
|
|
67
|
+
and public.has_capability(company_id, 'assets.write')
|
|
68
|
+
)
|
|
69
|
+
with check (
|
|
70
|
+
public.module_enabled(company_id, 'assets')
|
|
71
|
+
and public.has_capability(company_id, 'assets.write')
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
drop policy assets_lines_select on assets.depreciation_lines;
|
|
75
|
+
create policy assets_lines_select on assets.depreciation_lines
|
|
76
|
+
for select using (
|
|
77
|
+
public.module_enabled(company_id, 'assets')
|
|
78
|
+
and public.has_capability(company_id, 'assets.read')
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
drop policy assets_lines_write on assets.depreciation_lines;
|
|
82
|
+
create policy assets_lines_write on assets.depreciation_lines
|
|
83
|
+
for all using (
|
|
84
|
+
public.module_enabled(company_id, 'assets')
|
|
85
|
+
and public.has_capability(company_id, 'assets.write')
|
|
86
|
+
)
|
|
87
|
+
with check (
|
|
88
|
+
public.module_enabled(company_id, 'assets')
|
|
89
|
+
and public.has_capability(company_id, 'assets.write')
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
drop policy assets_disposals_select on assets.disposals;
|
|
93
|
+
create policy assets_disposals_select on assets.disposals
|
|
94
|
+
for select using (
|
|
95
|
+
public.module_enabled(company_id, 'assets')
|
|
96
|
+
and public.has_capability(company_id, 'assets.read')
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
drop policy assets_disposals_write on assets.disposals;
|
|
100
|
+
create policy assets_disposals_write on assets.disposals
|
|
101
|
+
for all using (
|
|
102
|
+
public.module_enabled(company_id, 'assets')
|
|
103
|
+
and public.has_capability(company_id, 'assets.write')
|
|
104
|
+
)
|
|
105
|
+
with check (
|
|
106
|
+
public.module_enabled(company_id, 'assets')
|
|
107
|
+
and public.has_capability(company_id, 'assets.write')
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
-- ---------------------------------------------------------------------------
|
|
111
|
+
-- What `assets.post` actually guards
|
|
112
|
+
--
|
|
113
|
+
-- Guards on the transition rather than inside `run_depreciation()` and
|
|
114
|
+
-- `dispose_asset()`, for the reason the socle gives for its own three: a
|
|
115
|
+
-- guard on the transition holds for every path into it, including a client
|
|
116
|
+
-- that writes the column itself, and it does not require republishing four
|
|
117
|
+
-- hundred lines of depreciation arithmetic for four lines of permission.
|
|
118
|
+
--
|
|
119
|
+
-- `is_installer()` for the same reason as everywhere else: the seeds and the
|
|
120
|
+
-- CLI hold a connection and no session.
|
|
121
|
+
-- ---------------------------------------------------------------------------
|
|
122
|
+
|
|
123
|
+
create or replace function assets.assert_may_post()
|
|
124
|
+
returns trigger
|
|
125
|
+
language plpgsql
|
|
126
|
+
as $$
|
|
127
|
+
begin
|
|
128
|
+
if not public.is_installer() and not public.has_capability(new.company_id, 'assets.post') then
|
|
129
|
+
raise exception 'not_allowed: booking this to the ledger needs assets.post'
|
|
130
|
+
using errcode = '42501';
|
|
131
|
+
end if;
|
|
132
|
+
return new;
|
|
133
|
+
end;
|
|
134
|
+
$$;
|
|
135
|
+
|
|
136
|
+
create trigger assets_lines_assert_may_post
|
|
137
|
+
before update of posted_at on assets.depreciation_lines
|
|
138
|
+
for each row when (new.posted_at is not null and old.posted_at is null)
|
|
139
|
+
execute function assets.assert_may_post();
|
|
140
|
+
|
|
141
|
+
create trigger assets_disposals_assert_may_post
|
|
142
|
+
before insert on assets.disposals
|
|
143
|
+
for each row execute function assets.assert_may_post();
|
|
144
|
+
|
|
145
|
+
revoke execute on all functions in schema assets from public;
|