celerp 2.1.1__tar.gz → 2.2.0__tar.gz
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.
- {celerp-2.1.1 → celerp-2.2.0}/PKG-INFO +12 -9
- {celerp-2.1.1 → celerp-2.2.0}/README.md +11 -8
- {celerp-2.1.1 → celerp-2.2.0}/celerp/config.py +5 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/events/schemas.py +2 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/main.py +41 -1
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/companies.py +2 -4
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/events.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/health.py +0 -10
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/stars.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/auto_je.py +3 -2
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/cost_visibility.py +18 -5
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/field_schema.py +23 -1
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/permissions.py +1 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/PKG-INFO +12 -9
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/scm_file_list.json +21 -0
- celerp-2.2.0/celerp.egg-info/scm_version.json +8 -0
- {celerp-2.1.1 → celerp-2.2.0}/conftest.py +31 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/doc_constants.py +7 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/routes.py +396 -85
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_audits.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_freight_je.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_freight_lines.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +4 -4
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +3 -3
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_landed_receive.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_line_delete_persist.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_line_identifier.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_payment_void_activity.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_service_lines.py +3 -3
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_void_guards.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/routes.py +452 -37
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/tests/test_labels.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +19 -5
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_build_api.py +45 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +2 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +8 -8
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_production_order.py +2 -2
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +4 -4
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +13 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +20 -0
- celerp-2.2.0/default_modules/first_party.lock.json +16 -0
- {celerp-2.1.1 → celerp-2.2.0}/test_helpers.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/api_client.py +42 -3
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/activity.py +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/shell.py +77 -9
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/table.py +37 -6
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/ar.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/de.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/en.json +1 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/es.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/fr.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/id.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/it.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/ja.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/pt.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/th.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/locales/vi.json +0 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/contacts.py +2 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/documents.py +482 -134
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/inventory.py +212 -22
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/manufacturing.py +4 -2
- celerp-2.2.0/ui/routes/search.py +152 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings.py +0 -24
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_general.py +0 -7
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/subscriptions.py +2 -1
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/app.css +51 -7
- celerp-2.1.1/celerp.egg-info/scm_version.json +0 -8
- celerp-2.1.1/default_modules/first_party.lock.json +0 -16
- celerp-2.1.1/ui/routes/search.py +0 -72
- {celerp-2.1.1 → celerp-2.2.0}/CLA.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/CONTRIBUTING.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/LICENSING.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/MANIFEST.in +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/NOTICE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/alembic.ini +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/__main__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/batch.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/cleanup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/commands.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/conversations.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/files.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/intent.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/llm.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/memory.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/models.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/page_count.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/quota.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/service.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/ai/tools.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/alembic.ini +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/alembic_config.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/cli.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/compat.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/compute/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/compute/aggregations.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/compute/valuation.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/base.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/daily_scheduler.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/http.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/images.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/quickbooks.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/registry.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/relay_token.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/shopify.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/sync_runner.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/upsert.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/util.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/webhooks.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/woocommerce.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/connectors/xero.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/constants.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/db.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/embedded_pg.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/events/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/events/engine.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/events/types.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/gateway/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/gateway/client.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/gateway/state.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/importers/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/importers/importer.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/importers/schema.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/middleware.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/README.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/_auto_stamp.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/_data_reconcile.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/_json_compat.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/env.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/script.py.mako +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/accounting.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/ai.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/auth.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/base.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/company.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/connector_config.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/import_batch.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/ledger.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/marketplace.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/notification.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/projections.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/share.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/supporter.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/models/sync_run.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/api.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/audit.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/demotion.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/importer.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/license.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/loader.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/meta.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/migrations_runner.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/references.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/registry.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/modules/slots.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/notifications/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/notifications/service.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/notifications/sse.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/output/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/output/branding.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/output/doc_print.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/output/pdf.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/output/share_render.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/engine.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/handlers/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/handlers/marketplace.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/handlers/scanning.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/handlers/shopify.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/projections/handlers/system.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/auth.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/debug.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/doctor.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/ledger.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/notifications.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/routers/system.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/schemas/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/activity_redaction.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/attachments.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/auth.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup_export.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup_repo.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup_scheduler.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/backup_state.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/demo.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/dev_release_guard.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/email.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/fulfill.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/holdings.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/je_keys.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/landed_cost.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/line_measures.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/list_behavior.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/money.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/payments.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/pick.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/pricing.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/relay_share.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/reorder.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/runtime_state.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/session_tracker.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/shipping.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/star_cta.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/status_doc_backfill.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/supporter_badge.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/system_health.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/services/units.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/session_gate.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp/tax_regimes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/SOURCES.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/dependency_links.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/entry_points.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/requires.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/celerp.egg-info/top_level.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/journal.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/statement.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_cash_flow.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_route_permissions.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-admin/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-admin/celerp_admin/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/celerp_ai/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/celerp_ai/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/conftest.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_batch.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_conversations.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_intent.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_llm.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_memory.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_models.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_page_count.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_quota.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_router.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_service.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-ai/tests/test_tools.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-backup/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-backup/celerp_backup/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/conftest.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_images.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/migrations.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-dashboard/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-dashboard/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/api_setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/doc_projections.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/doc_service.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/routes_payments.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/routes_share.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/sequences.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/taxes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/conftest.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-docs/tests/test_send_visibility.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/projections.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/routes_scanning.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/services.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/celerp_labels/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/requirements.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/requirements.txt +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_recost_api.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/celerp_reports/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/tests/test_reports_full.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-reports/tests/test_reports_unit.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/LICENSE +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/tests/test_verticals.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-verticals/tests/test_verticals_routers.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/legal/OFFICIAL-COMPONENTS.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/legal/TRADEMARK.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/packaging/winget/Celerp.Celerp.yaml +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/packaging/winget/README.md +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/pyproject.toml +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/setup.cfg +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/app.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/attrs.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/backup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/cloud_gate.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/currency.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/files.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/journal.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/notes.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/phone.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/components/report_kit.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/config.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/i18n.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/marketplace_catalog.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/__init__.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/account.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/accounting.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/accounting_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/auth.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/csv_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/dashboard.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/docs_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/events.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/financial_reports.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/lists_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/modules_page.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/notifications.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/reconciliation.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/reports.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_accounting.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_cloud.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_connectors.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_contacts.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_inventory.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_manufacturing.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_payments.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_purchasing.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/settings_sales.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/setup.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/stars.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/routes/subscriptions_import.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/security.py +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/htmx.min.js +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/icon.png +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/logo.png +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
- {celerp-2.1.1 → celerp-2.2.0}/ui/static/vendor/intl-tel-input/utils.js +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: celerp
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Free, self-hosted ERP for small businesses
|
|
5
5
|
License: Business Source License 1.1
|
|
6
6
|
|
|
@@ -185,18 +185,22 @@ Celerp is simple to use, flexible, customizable, and designed to transition your
|
|
|
185
185
|
[](https://github.com/celerp/celerp/actions)
|
|
186
186
|
[](LICENSE)
|
|
187
187
|
|
|
188
|
+
<!-- PRESS_KIT:root-hero start -->
|
|
188
189
|

|
|
190
|
+
<!-- PRESS_KIT:root-hero end -->
|
|
189
191
|
|
|
190
192
|
## Screenshots
|
|
191
193
|
|
|
192
194
|
Real double-entry accounting, multi-location inventory, manufacturing, and a built-in REST API - one self-hosted app.
|
|
193
195
|
|
|
196
|
+
<!-- PRESS_KIT:root-grid start -->
|
|
194
197
|
| | |
|
|
195
198
|
|---|---|
|
|
199
|
+
| <br>**Dashboard** - revenue trend, AR aging, inventory mix | <br>**Inventory** - multi-location, barcode, valuation |
|
|
196
200
|
| <br>**Trial balance** - ties out to zero | <br>**Balance sheet** - live from the ledger |
|
|
197
|
-
| <br>**Production planning** - work orders, priorities, due dates | <br>**Shipping documents** - commercial invoice and customs |
|
|
202
|
+
| <br>**REST API** - integrate anything | <br>**Statement of account** - customer AR at a glance |
|
|
203
|
+
<!-- PRESS_KIT:root-grid end -->
|
|
200
204
|
|
|
201
205
|
More in the [press kit](docs/press-kit/).
|
|
202
206
|
|
|
@@ -206,9 +210,9 @@ More in the [press kit](docs/press-kit/).
|
|
|
206
210
|
|
|
207
211
|
| Platform | Link |
|
|
208
212
|
|----------|------|
|
|
209
|
-
| Windows (.exe) | [
|
|
210
|
-
| Linux (.
|
|
211
|
-
| macOS (.dmg) | [
|
|
213
|
+
| Windows (.exe) | [Download](https://celerp.com/download-thanks.html?dl=win) |
|
|
214
|
+
| Linux (.deb) | [Download](https://celerp.com/download-thanks.html?dl=linux) |
|
|
215
|
+
| macOS (.dmg) | [Download](https://celerp.com/download-thanks.html?dl=mac) |
|
|
212
216
|
|
|
213
217
|
**Double-click. No account. No credit card. Your computer securely becomes the server for your office**
|
|
214
218
|
|
|
@@ -335,8 +339,7 @@ Celerp is open-core:
|
|
|
335
339
|
self-hosting permitted, contributions welcome.
|
|
336
340
|
- **An MIT-licensed module ecosystem** - the default business modules are MIT, so you can
|
|
337
341
|
fork them, build your own modules, and ship them however you like. See [LICENSING.md](LICENSING.md).
|
|
338
|
-
- **A
|
|
339
|
-
services) that powers the hosted experience.
|
|
342
|
+
- **A source available application** (official UI, document/PDF output and AI & Connect services).
|
|
340
343
|
|
|
341
344
|
See [LICENSING.md](LICENSING.md) for the full map and [TRADEMARK.md](legal/TRADEMARK.md) for use of the Celerp
|
|
342
345
|
name. One restriction: don't resell Celerp itself as a competing product.
|
|
@@ -12,18 +12,22 @@ Celerp is simple to use, flexible, customizable, and designed to transition your
|
|
|
12
12
|
[](https://github.com/celerp/celerp/actions)
|
|
13
13
|
[](LICENSE)
|
|
14
14
|
|
|
15
|
+
<!-- PRESS_KIT:root-hero start -->
|
|
15
16
|

|
|
17
|
+
<!-- PRESS_KIT:root-hero end -->
|
|
16
18
|
|
|
17
19
|
## Screenshots
|
|
18
20
|
|
|
19
21
|
Real double-entry accounting, multi-location inventory, manufacturing, and a built-in REST API - one self-hosted app.
|
|
20
22
|
|
|
23
|
+
<!-- PRESS_KIT:root-grid start -->
|
|
21
24
|
| | |
|
|
22
25
|
|---|---|
|
|
26
|
+
| <br>**Dashboard** - revenue trend, AR aging, inventory mix | <br>**Inventory** - multi-location, barcode, valuation |
|
|
23
27
|
| <br>**Trial balance** - ties out to zero | <br>**Balance sheet** - live from the ledger |
|
|
24
|
-
| <br>**Production planning** - work orders, priorities, due dates | <br>**Shipping documents** - commercial invoice and customs |
|
|
29
|
+
| <br>**REST API** - integrate anything | <br>**Statement of account** - customer AR at a glance |
|
|
30
|
+
<!-- PRESS_KIT:root-grid end -->
|
|
27
31
|
|
|
28
32
|
More in the [press kit](docs/press-kit/).
|
|
29
33
|
|
|
@@ -33,9 +37,9 @@ More in the [press kit](docs/press-kit/).
|
|
|
33
37
|
|
|
34
38
|
| Platform | Link |
|
|
35
39
|
|----------|------|
|
|
36
|
-
| Windows (.exe) | [
|
|
37
|
-
| Linux (.
|
|
38
|
-
| macOS (.dmg) | [
|
|
40
|
+
| Windows (.exe) | [Download](https://celerp.com/download-thanks.html?dl=win) |
|
|
41
|
+
| Linux (.deb) | [Download](https://celerp.com/download-thanks.html?dl=linux) |
|
|
42
|
+
| macOS (.dmg) | [Download](https://celerp.com/download-thanks.html?dl=mac) |
|
|
39
43
|
|
|
40
44
|
**Double-click. No account. No credit card. Your computer securely becomes the server for your office**
|
|
41
45
|
|
|
@@ -162,8 +166,7 @@ Celerp is open-core:
|
|
|
162
166
|
self-hosting permitted, contributions welcome.
|
|
163
167
|
- **An MIT-licensed module ecosystem** - the default business modules are MIT, so you can
|
|
164
168
|
fork them, build your own modules, and ship them however you like. See [LICENSING.md](LICENSING.md).
|
|
165
|
-
- **A
|
|
166
|
-
services) that powers the hosted experience.
|
|
169
|
+
- **A source available application** (official UI, document/PDF output and AI & Connect services).
|
|
167
170
|
|
|
168
171
|
See [LICENSING.md](LICENSING.md) for the full map and [TRADEMARK.md](legal/TRADEMARK.md) for use of the Celerp
|
|
169
172
|
name. One restriction: don't resell Celerp itself as a competing product.
|
|
@@ -25,6 +25,11 @@ class Settings(BaseSettings):
|
|
|
25
25
|
idle_logout_minutes: int = 15
|
|
26
26
|
# Set to "true" to allow the default JWT secret (CI only).
|
|
27
27
|
allow_insecure_jwt: str = "false"
|
|
28
|
+
# Serve the OpenAPI schema (/openapi.json) and the grouped API reference.
|
|
29
|
+
# Default off: production does not publish the API shape. Enabled only by the
|
|
30
|
+
# press-kit capture harness (and CI) to render the reference. Never set true
|
|
31
|
+
# in production.
|
|
32
|
+
expose_openapi_schema: bool = False
|
|
28
33
|
# Logging level for both API and UI processes. Override with LOG_LEVEL env var.
|
|
29
34
|
# Accepted values: debug, info, warning, error, critical (case-insensitive).
|
|
30
35
|
log_level: str = "INFO"
|
|
@@ -356,7 +356,47 @@ log = logging.getLogger(__name__)
|
|
|
356
356
|
_storage_uri = settings.redis_url or "memory://"
|
|
357
357
|
limiter = Limiter(key_func=get_remote_address, default_limits=["60/minute"], storage_uri=_storage_uri)
|
|
358
358
|
|
|
359
|
-
|
|
359
|
+
_OPENAPI_TAGS = [
|
|
360
|
+
{"name": "auth", "description": "Sign in, sessions, and access tokens."},
|
|
361
|
+
{"name": "companies", "description": "Companies, members, and roles."},
|
|
362
|
+
{"name": "items", "description": "Inventory items, stock, and valuation."},
|
|
363
|
+
{"name": "docs", "description": "Invoices, purchase orders, quotations, and credit notes."},
|
|
364
|
+
{"name": "lists", "description": "Shipping documents and packing lists."},
|
|
365
|
+
{"name": "accounting", "description": "Chart of accounts and journal entries."},
|
|
366
|
+
{"name": "ledger", "description": "Event-sourced ledger and projections."},
|
|
367
|
+
{"name": "reports", "description": "Financial statements and aging reports."},
|
|
368
|
+
{"name": "manufacturing", "description": "Bills of materials and production orders."},
|
|
369
|
+
{"name": "labels", "description": "Label templates and barcode printing."},
|
|
370
|
+
{"name": "crm", "description": "Contacts, pipeline, and activity."},
|
|
371
|
+
{"name": "subscriptions", "description": "Recurring billing and auto-invoicing."},
|
|
372
|
+
{"name": "connectors", "description": "External integrations."},
|
|
373
|
+
{"name": "payments", "description": "Payment collection."},
|
|
374
|
+
{"name": "backup", "description": "Data export and import."},
|
|
375
|
+
{"name": "notifications", "description": "In-app notifications."},
|
|
376
|
+
{"name": "events", "description": "Server-sent event stream for live updates."},
|
|
377
|
+
{"name": "system", "description": "Health, status, and instance metadata."},
|
|
378
|
+
]
|
|
379
|
+
|
|
380
|
+
_OPENAPI_DESCRIPTION = "REST API for Celerp, the self-hosted business management platform."
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
def _openapi_settings() -> dict:
|
|
384
|
+
"""FastAPI OpenAPI kwargs for the current settings. Production keeps the schema
|
|
385
|
+
unserved (openapi_url=None); the press-kit capture harness turns
|
|
386
|
+
expose_openapi_schema on to publish it for the API reference shot, and that
|
|
387
|
+
non-default state is logged so it is never silent. Isolated so the exposure
|
|
388
|
+
boundary is unit-testable without reconstructing the whole app."""
|
|
389
|
+
expose = settings.expose_openapi_schema
|
|
390
|
+
if expose:
|
|
391
|
+
log.warning("expose_openapi_schema is on: serving the public OpenAPI schema at /openapi.json")
|
|
392
|
+
return {
|
|
393
|
+
"description": _OPENAPI_DESCRIPTION,
|
|
394
|
+
"openapi_tags": _OPENAPI_TAGS,
|
|
395
|
+
"openapi_url": "/openapi.json" if expose else None,
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
app = FastAPI(title="Celerp", docs_url=None, redoc_url=None, lifespan=lifespan, **_openapi_settings())
|
|
360
400
|
app.state.limiter = limiter
|
|
361
401
|
app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
|
|
362
402
|
app.add_middleware(DrainMiddleware)
|
|
@@ -685,18 +685,16 @@ async def patch_user(
|
|
|
685
685
|
# Item schema configuration
|
|
686
686
|
# ---------------------------------------------------------------------------
|
|
687
687
|
|
|
688
|
+
from celerp.services.field_schema import COST_SCHEMA_KEYS # noqa: F401 re-export
|
|
688
689
|
from celerp.services.field_schema import DEFAULT_ITEM_SCHEMA # noqa: F401 re-export
|
|
689
690
|
from celerp.services.field_schema import get_effective_field_schema # noqa: F401 re-export
|
|
690
691
|
|
|
691
692
|
|
|
692
|
-
_COST_SCHEMA_KEYS: frozenset[str] = frozenset({"cost_price", "cost_price_total"})
|
|
693
|
-
|
|
694
|
-
|
|
695
693
|
@router.get("/me/item-schema")
|
|
696
694
|
async def get_item_schema(company_id=Depends(get_current_company_id), role: str = Depends(get_current_role), settings: dict = Depends(get_current_company_settings), session: AsyncSession = Depends(get_session)) -> list[dict]:
|
|
697
695
|
schema = await get_effective_field_schema(session, company_id)
|
|
698
696
|
if not role_has_permission(settings, role, "view_inventory_costs"):
|
|
699
|
-
schema = [f for f in schema if f.get("key") not in
|
|
697
|
+
schema = [f for f in schema if f.get("key") not in COST_SCHEMA_KEYS]
|
|
700
698
|
return schema
|
|
701
699
|
|
|
702
700
|
|
|
@@ -171,16 +171,6 @@ async def backup_status() -> dict:
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
|
|
174
|
-
@router.get("/settings/email-status")
|
|
175
|
-
async def email_status() -> dict:
|
|
176
|
-
"""Return whether SMTP and/or gateway are configured for email sending."""
|
|
177
|
-
from celerp.config import settings
|
|
178
|
-
return {
|
|
179
|
-
"smtp_configured": bool(settings.smtp_host),
|
|
180
|
-
"gateway_connected": bool(settings.gateway_token),
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
|
|
184
174
|
@router.post("/settings/cloud-disconnect", dependencies=[Depends(get_current_user)])
|
|
185
175
|
async def cloud_disconnect() -> dict:
|
|
186
176
|
"""Stop the gateway WebSocket client and record a sticky Cloud disconnect.
|
|
@@ -31,9 +31,9 @@ async def star_cta(
|
|
|
31
31
|
session: AsyncSession = Depends(get_session),
|
|
32
32
|
) -> dict:
|
|
33
33
|
"""Return the relay-resolved CTA for ``medium`` (or the neutral link if the relay
|
|
34
|
-
is unreachable), plus the install-level dismissed flag.
|
|
34
|
+
is unreachable), plus the install-level dismissed flag. Neutral mode when disabled."""
|
|
35
35
|
if not settings.star_cta_enabled:
|
|
36
|
-
return {}
|
|
36
|
+
return {"mode": "neutral"}
|
|
37
37
|
cta = await get_star_cta(medium) or neutral_cta(medium)
|
|
38
38
|
return {**cta, "dismissed": await star_prompt_dismissed(session)}
|
|
39
39
|
|
|
@@ -837,8 +837,9 @@ async def upsert_opening_inventory_je(
|
|
|
837
837
|
)
|
|
838
838
|
).scalars().all()
|
|
839
839
|
|
|
840
|
-
# Inactive statuses: items no longer owned
|
|
841
|
-
|
|
840
|
+
# Inactive statuses: items whose stock is not counted - no longer owned, or
|
|
841
|
+
# (draft) not yet committed. Must match get_valuation()'s filter.
|
|
842
|
+
_INACTIVE = frozenset({"archived", "deleted", "void", "sold", "fulfilled", "merged", "expired", "draft"})
|
|
842
843
|
|
|
843
844
|
catalog_total = _Dec("0")
|
|
844
845
|
for row in item_rows:
|
|
@@ -18,7 +18,8 @@ COST_ITEM_KEYS: frozenset[str] = frozenset({"cost_price", "cost_total"})
|
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def apply_field_visibility(
|
|
21
|
-
items: list[dict], role: str, field_schema: list[dict], can_see_costs: bool
|
|
21
|
+
items: list[dict], role: str, field_schema: list[dict], can_see_costs: bool,
|
|
22
|
+
can_author_drafts: bool = False,
|
|
22
23
|
) -> list[dict]:
|
|
23
24
|
"""Strip fields from item dicts that the caller is not allowed to see.
|
|
24
25
|
|
|
@@ -30,6 +31,11 @@ def apply_field_visibility(
|
|
|
30
31
|
Cost keys are governed only by the permission, so the cost column's own
|
|
31
32
|
visible_to_roles floor never double-gates them: a granted operator sees cost,
|
|
32
33
|
an ungranted manager does not.
|
|
34
|
+
|
|
35
|
+
Draft carve-out: cost stripping attaches when an item is committed to
|
|
36
|
+
available, not at creation. When ``can_author_drafts`` (the caller holds
|
|
37
|
+
edit_inventory), a DRAFT item keeps its cost keys so its creator can finish
|
|
38
|
+
authoring it; every non-draft item is stripped as before.
|
|
33
39
|
"""
|
|
34
40
|
caller_level = ROLE_LEVELS.get(role, 0)
|
|
35
41
|
restricted = {
|
|
@@ -40,8 +46,15 @@ def apply_field_visibility(
|
|
|
40
46
|
)
|
|
41
47
|
}
|
|
42
48
|
restricted -= COST_ITEM_KEYS
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if not restricted:
|
|
49
|
+
cost_hidden = not can_see_costs
|
|
50
|
+
if not restricted and not cost_hidden:
|
|
46
51
|
return items
|
|
47
|
-
|
|
52
|
+
out = []
|
|
53
|
+
for item in items:
|
|
54
|
+
drop = set(restricted)
|
|
55
|
+
if cost_hidden and not (
|
|
56
|
+
can_author_drafts and str(item.get("status") or "").lower() == "draft"
|
|
57
|
+
):
|
|
58
|
+
drop |= COST_ITEM_KEYS
|
|
59
|
+
out.append({k: v for k, v in item.items() if k not in drop} if drop else item)
|
|
60
|
+
return out
|
|
@@ -31,6 +31,11 @@ AMOUNT_ITEM_KEYS: frozenset[str] = frozenset({"quantity", "weight", "pieces", "g
|
|
|
31
31
|
# and import - sell_by is a unit string and must never reach that float() path.
|
|
32
32
|
AMOUNT_EDIT_GATED_KEYS: frozenset[str] = AMOUNT_ITEM_KEYS | {"sell_by"}
|
|
33
33
|
|
|
34
|
+
# Schema-field keys for the canonical cost price list, stripped from /me/item-schema
|
|
35
|
+
# for callers without view_inventory_costs. Distinct from cost_visibility.COST_ITEM_KEYS,
|
|
36
|
+
# which names the item-DATA keys (cost_total, not the virtual schema key cost_price_total).
|
|
37
|
+
COST_SCHEMA_KEYS: frozenset[str] = frozenset({"cost_price", "cost_price_total"})
|
|
38
|
+
|
|
34
39
|
# Default price lists (used when company has none configured)
|
|
35
40
|
_DEFAULT_PRICE_LISTS: list[dict] = [
|
|
36
41
|
{"name": "Wholesale"},
|
|
@@ -56,7 +61,9 @@ _BASE_FIELDS: list[dict] = [
|
|
|
56
61
|
{"key": "pick_method", "label": "Stock Cutting", "type": "select", "editable": True, "required": False, "options": ["default", "fifo", "fefo", "lifo"], "visible_to_roles": [], "position": 4.6, "show_in_table": False, "tooltip_key": "field.tooltip.pick_method"},
|
|
57
62
|
{"key": "location_name", "label": "Location", "type": "text", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 5, "show_in_table": True, "tooltip_key": "field.tooltip.location_name"},
|
|
58
63
|
# Price columns are injected dynamically at position 6+ by _inject_price_columns()
|
|
59
|
-
|
|
64
|
+
# Read-only: status changes only through dedicated actions (Make Available, Revert
|
|
65
|
+
# to Draft), never a free-form dropdown edit - same convention as document status.
|
|
66
|
+
{"key": "status", "label": "Status", "type": "status", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 100, "show_in_table": True},
|
|
60
67
|
{"key": "short_description", "label": "Short Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 101, "show_in_table": False},
|
|
61
68
|
{"key": "description", "label": "Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 102, "show_in_table": False},
|
|
62
69
|
{"key": "notes", "label": "Notes", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 103, "show_in_table": False},
|
|
@@ -119,6 +126,14 @@ def _inject_price_columns(base: list[dict], price_lists: list[dict]) -> list[dic
|
|
|
119
126
|
return sorted(base + price_cols, key=lambda f: f.get("position", 999))
|
|
120
127
|
|
|
121
128
|
|
|
129
|
+
def cost_columns(price_lists: list[dict]) -> list[dict]:
|
|
130
|
+
"""The cost schema columns (cost_price and its virtual total) generated for the given
|
|
131
|
+
price lists, empty if none is a cost list. Used to re-inject the cost fields that the
|
|
132
|
+
company-scoped /me/item-schema strips, for a draft whose cost is item-visible - the
|
|
133
|
+
single source the schema endpoint would have produced, never a hand-built copy."""
|
|
134
|
+
return [f for f in _inject_price_columns([], price_lists) if f.get("key") in COST_SCHEMA_KEYS]
|
|
135
|
+
|
|
136
|
+
|
|
122
137
|
# Backward-compatible constant: base fields + default price columns
|
|
123
138
|
DEFAULT_ITEM_SCHEMA: list[dict] = _inject_price_columns(_BASE_FIELDS, _DEFAULT_PRICE_LISTS)
|
|
124
139
|
|
|
@@ -161,6 +176,13 @@ async def get_effective_field_schema(
|
|
|
161
176
|
for f in base_schema
|
|
162
177
|
]
|
|
163
178
|
|
|
179
|
+
# Status is never a free-form dropdown, regardless of a stored schema round-trip
|
|
180
|
+
# captured before this became a hard rule.
|
|
181
|
+
base_schema = [
|
|
182
|
+
{**f, "editable": False, "options": []} if f["key"] == "status" else f
|
|
183
|
+
for f in base_schema
|
|
184
|
+
]
|
|
185
|
+
|
|
164
186
|
if category:
|
|
165
187
|
cat_schemas: dict[str, list[dict]] = settings.get("category_schemas") or {}
|
|
166
188
|
cat_fields: list[dict] = cat_schemas.get(category) or []
|
|
@@ -70,6 +70,7 @@ PERMISSIONS: list[Permission] = [
|
|
|
70
70
|
Permission("set_sales_doc_prices", "Set sales document prices", "operator", True, "viewer"),
|
|
71
71
|
Permission("delete_documents", "Delete documents", "manager", True, "viewer"),
|
|
72
72
|
Permission("adjust_inventory", "Adjust stock & bulk operations", "manager", True, "viewer"),
|
|
73
|
+
Permission("revert_items_to_draft", "Revert items to draft", "manager", True, "viewer"),
|
|
73
74
|
Permission("import_export_data", "Import / export data", "manager", True, "viewer"),
|
|
74
75
|
Permission("view_payments", "View payments", "manager", True, "viewer"),
|
|
75
76
|
Permission("view_financial_reports", "View financial reports", "manager", True, "viewer"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: celerp
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.0
|
|
4
4
|
Summary: Free, self-hosted ERP for small businesses
|
|
5
5
|
License: Business Source License 1.1
|
|
6
6
|
|
|
@@ -185,18 +185,22 @@ Celerp is simple to use, flexible, customizable, and designed to transition your
|
|
|
185
185
|
[](https://github.com/celerp/celerp/actions)
|
|
186
186
|
[](LICENSE)
|
|
187
187
|
|
|
188
|
+
<!-- PRESS_KIT:root-hero start -->
|
|
188
189
|

|
|
190
|
+
<!-- PRESS_KIT:root-hero end -->
|
|
189
191
|
|
|
190
192
|
## Screenshots
|
|
191
193
|
|
|
192
194
|
Real double-entry accounting, multi-location inventory, manufacturing, and a built-in REST API - one self-hosted app.
|
|
193
195
|
|
|
196
|
+
<!-- PRESS_KIT:root-grid start -->
|
|
194
197
|
| | |
|
|
195
198
|
|---|---|
|
|
199
|
+
| <br>**Dashboard** - revenue trend, AR aging, inventory mix | <br>**Inventory** - multi-location, barcode, valuation |
|
|
196
200
|
| <br>**Trial balance** - ties out to zero | <br>**Balance sheet** - live from the ledger |
|
|
197
|
-
| <br>**Production planning** - work orders, priorities, due dates | <br>**Shipping documents** - commercial invoice and customs |
|
|
202
|
+
| <br>**REST API** - integrate anything | <br>**Statement of account** - customer AR at a glance |
|
|
203
|
+
<!-- PRESS_KIT:root-grid end -->
|
|
200
204
|
|
|
201
205
|
More in the [press kit](docs/press-kit/).
|
|
202
206
|
|
|
@@ -206,9 +210,9 @@ More in the [press kit](docs/press-kit/).
|
|
|
206
210
|
|
|
207
211
|
| Platform | Link |
|
|
208
212
|
|----------|------|
|
|
209
|
-
| Windows (.exe) | [
|
|
210
|
-
| Linux (.
|
|
211
|
-
| macOS (.dmg) | [
|
|
213
|
+
| Windows (.exe) | [Download](https://celerp.com/download-thanks.html?dl=win) |
|
|
214
|
+
| Linux (.deb) | [Download](https://celerp.com/download-thanks.html?dl=linux) |
|
|
215
|
+
| macOS (.dmg) | [Download](https://celerp.com/download-thanks.html?dl=mac) |
|
|
212
216
|
|
|
213
217
|
**Double-click. No account. No credit card. Your computer securely becomes the server for your office**
|
|
214
218
|
|
|
@@ -335,8 +339,7 @@ Celerp is open-core:
|
|
|
335
339
|
self-hosting permitted, contributions welcome.
|
|
336
340
|
- **An MIT-licensed module ecosystem** - the default business modules are MIT, so you can
|
|
337
341
|
fork them, build your own modules, and ship them however you like. See [LICENSING.md](LICENSING.md).
|
|
338
|
-
- **A
|
|
339
|
-
services) that powers the hosted experience.
|
|
342
|
+
- **A source available application** (official UI, document/PDF output and AI & Connect services).
|
|
340
343
|
|
|
341
344
|
See [LICENSING.md](LICENSING.md) for the full map and [TRADEMARK.md](legal/TRADEMARK.md) for use of the Celerp
|
|
342
345
|
name. One restriction: don't resell Celerp itself as a competing product.
|
|
@@ -548,12 +548,16 @@
|
|
|
548
548
|
"docs/press-kit/screenshots/apparel/dashboard.webp",
|
|
549
549
|
"docs/press-kit/screenshots/apparel/general-ledger.webp",
|
|
550
550
|
"docs/press-kit/screenshots/apparel/inventory.webp",
|
|
551
|
+
"docs/press-kit/screenshots/apparel/invoice-pay.webp",
|
|
551
552
|
"docs/press-kit/screenshots/apparel/invoices.webp",
|
|
553
|
+
"docs/press-kit/screenshots/apparel/label-designer.webp",
|
|
552
554
|
"docs/press-kit/screenshots/apparel/manufacturing-worksheet.webp",
|
|
555
|
+
"docs/press-kit/screenshots/apparel/modules.webp",
|
|
553
556
|
"docs/press-kit/screenshots/apparel/permissions.webp",
|
|
554
557
|
"docs/press-kit/screenshots/apparel/production-planning.webp",
|
|
555
558
|
"docs/press-kit/screenshots/apparel/rest-api.webp",
|
|
556
559
|
"docs/press-kit/screenshots/apparel/trial-balance.webp",
|
|
560
|
+
"docs/press-kit/screenshots/apparel/work-centers.webp",
|
|
557
561
|
"docs/press-kit/screenshots/apparel/worksheet-print.webp",
|
|
558
562
|
"docs/press-kit/screenshots/balance-sheet.png",
|
|
559
563
|
"docs/press-kit/screenshots/coffee/README.md",
|
|
@@ -561,7 +565,9 @@
|
|
|
561
565
|
"docs/press-kit/screenshots/coffee/balance-sheet.webp",
|
|
562
566
|
"docs/press-kit/screenshots/coffee/chart-of-accounts.webp",
|
|
563
567
|
"docs/press-kit/screenshots/coffee/dashboard.webp",
|
|
568
|
+
"docs/press-kit/screenshots/coffee/extended-journal.webp",
|
|
564
569
|
"docs/press-kit/screenshots/coffee/general-ledger.webp",
|
|
570
|
+
"docs/press-kit/screenshots/coffee/international-shipping-document.webp",
|
|
565
571
|
"docs/press-kit/screenshots/coffee/inventory.webp",
|
|
566
572
|
"docs/press-kit/screenshots/coffee/invoices.webp",
|
|
567
573
|
"docs/press-kit/screenshots/coffee/manufacturing-worksheet.webp",
|
|
@@ -585,7 +591,9 @@
|
|
|
585
591
|
"docs/press-kit/screenshots/cosmetics/trial-balance.webp",
|
|
586
592
|
"docs/press-kit/screenshots/cosmetics/worksheet-print.webp",
|
|
587
593
|
"docs/press-kit/screenshots/dashboard.png",
|
|
594
|
+
"docs/press-kit/screenshots/extended-journal.png",
|
|
588
595
|
"docs/press-kit/screenshots/general-ledger.png",
|
|
596
|
+
"docs/press-kit/screenshots/international-shipping-document.png",
|
|
589
597
|
"docs/press-kit/screenshots/inventory.png",
|
|
590
598
|
"docs/press-kit/screenshots/jewelry/README.md",
|
|
591
599
|
"docs/press-kit/screenshots/jewelry/audit-log.webp",
|
|
@@ -596,15 +604,19 @@
|
|
|
596
604
|
"docs/press-kit/screenshots/jewelry/inventory.webp",
|
|
597
605
|
"docs/press-kit/screenshots/jewelry/invoices.webp",
|
|
598
606
|
"docs/press-kit/screenshots/jewelry/manufacturing-worksheet.webp",
|
|
607
|
+
"docs/press-kit/screenshots/jewelry/memo-holdings.webp",
|
|
599
608
|
"docs/press-kit/screenshots/jewelry/permissions.webp",
|
|
600
609
|
"docs/press-kit/screenshots/jewelry/production-planning.webp",
|
|
601
610
|
"docs/press-kit/screenshots/jewelry/rest-api.webp",
|
|
611
|
+
"docs/press-kit/screenshots/jewelry/statement-of-account.webp",
|
|
602
612
|
"docs/press-kit/screenshots/jewelry/trial-balance.webp",
|
|
603
613
|
"docs/press-kit/screenshots/jewelry/worksheet-print.webp",
|
|
604
614
|
"docs/press-kit/screenshots/manufacturing-worksheet.png",
|
|
605
615
|
"docs/press-kit/screenshots/production-planning.png",
|
|
606
616
|
"docs/press-kit/screenshots/rest-api.png",
|
|
617
|
+
"docs/press-kit/screenshots/statement-of-account.png",
|
|
607
618
|
"docs/press-kit/screenshots/trial-balance.png",
|
|
619
|
+
"docs/press-kit/screenshots/work-centers.png",
|
|
608
620
|
"electron/.gitignore",
|
|
609
621
|
"electron/README.md",
|
|
610
622
|
"electron/after-pack.js",
|
|
@@ -746,6 +758,7 @@
|
|
|
746
758
|
"tests/test_browser/test_freight_accounting_ui.py",
|
|
747
759
|
"tests/test_browser/test_freight_ui.py",
|
|
748
760
|
"tests/test_browser/test_fulfillment.py",
|
|
761
|
+
"tests/test_browser/test_global_search_tooltip.py",
|
|
749
762
|
"tests/test_browser/test_i18n_ui.py",
|
|
750
763
|
"tests/test_browser/test_import_flows.py",
|
|
751
764
|
"tests/test_browser/test_import_history.py",
|
|
@@ -753,9 +766,11 @@
|
|
|
753
766
|
"tests/test_browser/test_inventory_filters.py",
|
|
754
767
|
"tests/test_browser/test_invoice_layout_doc_types.py",
|
|
755
768
|
"tests/test_browser/test_item_detail_audit.py",
|
|
769
|
+
"tests/test_browser/test_item_draft_status.py",
|
|
756
770
|
"tests/test_browser/test_label_font_size.py",
|
|
757
771
|
"tests/test_browser/test_label_print_positions.py",
|
|
758
772
|
"tests/test_browser/test_line_identifier.py",
|
|
773
|
+
"tests/test_browser/test_list_scan_in_place.py",
|
|
759
774
|
"tests/test_browser/test_lists_audit.py",
|
|
760
775
|
"tests/test_browser/test_manual_journal_entry.py",
|
|
761
776
|
"tests/test_browser/test_manufacturing_hub.py",
|
|
@@ -775,6 +790,7 @@
|
|
|
775
790
|
"tests/test_browser/test_production_order.py",
|
|
776
791
|
"tests/test_browser/test_reorder_digest_upsell.py",
|
|
777
792
|
"tests/test_browser/test_reprice_preserves_lines.py",
|
|
793
|
+
"tests/test_browser/test_reserved_conflict_modal.py",
|
|
778
794
|
"tests/test_browser/test_settings_tabs.py",
|
|
779
795
|
"tests/test_browser/test_split_ghost_cols.py",
|
|
780
796
|
"tests/test_browser/test_split_ux.py",
|
|
@@ -842,9 +858,12 @@
|
|
|
842
858
|
"tests/test_importers.py",
|
|
843
859
|
"tests/test_imports.py",
|
|
844
860
|
"tests/test_instance_identity.py",
|
|
861
|
+
"tests/test_inventory_search_grammar.py",
|
|
845
862
|
"tests/test_inventory_table_helpers.py",
|
|
846
863
|
"tests/test_inventory_transform.py",
|
|
864
|
+
"tests/test_inventory_valuation_scope.py",
|
|
847
865
|
"tests/test_invoice_line_total_recalc.py",
|
|
866
|
+
"tests/test_item_draft_status.py",
|
|
848
867
|
"tests/test_item_history.py",
|
|
849
868
|
"tests/test_line_measures.py",
|
|
850
869
|
"tests/test_lists_import_idempotency.py",
|
|
@@ -893,6 +912,7 @@
|
|
|
893
912
|
"tests/test_notifications/test_service.py",
|
|
894
913
|
"tests/test_notifications/test_sse.py",
|
|
895
914
|
"tests/test_onboarding_connect_store.py",
|
|
915
|
+
"tests/test_openapi_docs.py",
|
|
896
916
|
"tests/test_packaging.py",
|
|
897
917
|
"tests/test_password_reset.py",
|
|
898
918
|
"tests/test_payments_funnel.py",
|
|
@@ -901,6 +921,7 @@
|
|
|
901
921
|
"tests/test_perishables.py",
|
|
902
922
|
"tests/test_permissions.py",
|
|
903
923
|
"tests/test_pieces_stored_in_attributes.py",
|
|
924
|
+
"tests/test_press_kit.py",
|
|
904
925
|
"tests/test_pricing.py",
|
|
905
926
|
"tests/test_proactive_qa.py",
|
|
906
927
|
"tests/test_prod_hardening.py",
|
|
@@ -18,6 +18,17 @@ os.environ.setdefault(
|
|
|
18
18
|
"CELERP_CONFIG",
|
|
19
19
|
os.path.join(_tempfile.gettempdir(), f"celerp-test-config-{_worker}.toml"),
|
|
20
20
|
)
|
|
21
|
+
# Start from a clean config: a temp file left by a previous local run (e.g. a
|
|
22
|
+
# persisted [cloud] disconnected = true from the disconnect endpoint) must not
|
|
23
|
+
# leak into this session. Scoped to our own temp path so a real CELERP_CONFIG
|
|
24
|
+
# passed in by CI is never touched.
|
|
25
|
+
_cfg_start = os.environ["CELERP_CONFIG"]
|
|
26
|
+
if (
|
|
27
|
+
os.path.dirname(_cfg_start) == _tempfile.gettempdir()
|
|
28
|
+
and os.path.basename(_cfg_start).startswith("celerp-test-config-")
|
|
29
|
+
and os.path.exists(_cfg_start)
|
|
30
|
+
):
|
|
31
|
+
os.remove(_cfg_start)
|
|
21
32
|
|
|
22
33
|
# ── Postgres for the whole test suite ──────────────────────────────────────────
|
|
23
34
|
# Both production targets (the server and the Electron embedded-postgres build)
|
|
@@ -472,9 +483,29 @@ def _reset_cloud_settings():
|
|
|
472
483
|
"""
|
|
473
484
|
from celerp.config import settings as _s
|
|
474
485
|
snapshot = {f: getattr(_s, f) for f in _CLOUD_SETTINGS_FIELDS}
|
|
486
|
+
# The disconnect endpoint also PERSISTS to the config file
|
|
487
|
+
# ([cloud] disconnected = true via write_config). That file is shared per
|
|
488
|
+
# xdist worker, so a persisted disconnect leaks into a later test whose app
|
|
489
|
+
# lifespan calls load_cloud_config() and re-reads it - which re-sets
|
|
490
|
+
# cloud_disconnected and defeats the in-memory restore below. Snapshot and
|
|
491
|
+
# restore the file too, symmetric with the settings restore.
|
|
492
|
+
_cfg_path = os.environ.get("CELERP_CONFIG")
|
|
493
|
+
_cfg_before = None
|
|
494
|
+
if _cfg_path and os.path.exists(_cfg_path):
|
|
495
|
+
with open(_cfg_path, "rb") as _fh:
|
|
496
|
+
_cfg_before = _fh.read()
|
|
475
497
|
yield
|
|
476
498
|
for f, v in snapshot.items():
|
|
477
499
|
setattr(_s, f, v)
|
|
500
|
+
if _cfg_path:
|
|
501
|
+
if _cfg_before is None:
|
|
502
|
+
try:
|
|
503
|
+
os.remove(_cfg_path)
|
|
504
|
+
except FileNotFoundError:
|
|
505
|
+
pass
|
|
506
|
+
elif _cfg_before != (open(_cfg_path, "rb").read() if os.path.exists(_cfg_path) else None):
|
|
507
|
+
with open(_cfg_path, "wb") as _fh:
|
|
508
|
+
_fh.write(_cfg_before)
|
|
478
509
|
|
|
479
510
|
|
|
480
511
|
@pytest.fixture(autouse=True)
|
{celerp-2.1.1 → celerp-2.2.0}/default_modules/celerp-accounting/tests/test_accounting_gaps.py
RENAMED
|
@@ -607,12 +607,12 @@ async def test_opening_inventory_je_excludes_inactive_items(client):
|
|
|
607
607
|
auth = _h(tok)
|
|
608
608
|
|
|
609
609
|
r1 = await client.post("/items", headers=auth, json={
|
|
610
|
-
"sku": "OB-ACTIVE", "name": "Active Item", "quantity": 1,
|
|
610
|
+
"status": "available", "sku": "OB-ACTIVE", "name": "Active Item", "quantity": 1,
|
|
611
611
|
"sell_by": "piece", "cost_price": 100.0,
|
|
612
612
|
})
|
|
613
613
|
assert r1.status_code == 200
|
|
614
614
|
r2 = await client.post("/items", headers=auth, json={
|
|
615
|
-
"sku": "OB-SOLD", "name": "Sold Item", "quantity": 1,
|
|
615
|
+
"status": "available", "sku": "OB-SOLD", "name": "Sold Item", "quantity": 1,
|
|
616
616
|
"sell_by": "piece", "cost_price": 200.0,
|
|
617
617
|
})
|
|
618
618
|
assert r2.status_code == 200
|
|
@@ -50,7 +50,7 @@ async def get_kpis(company_id=Depends(get_current_company_id), role: str = Depen
|
|
|
50
50
|
|
|
51
51
|
# For KPI sub-fields that need per-item access, re-use already-loaded items list.
|
|
52
52
|
_CONSIGNMENT_IN = "in"
|
|
53
|
-
_INACTIVE_STATUSES = frozenset({"archived", "deleted", "void", "sold", "fulfilled", "merged", "expired"})
|
|
53
|
+
_INACTIVE_STATUSES = frozenset({"archived", "deleted", "void", "sold", "fulfilled", "merged", "expired", "draft"})
|
|
54
54
|
active_items = []
|
|
55
55
|
for i in items:
|
|
56
56
|
s = i.state
|