celerp 2.5.2__tar.gz → 2.5.3__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.5.2 → celerp-2.5.3}/PKG-INFO +8 -6
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/memory.py +4 -1
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/ownership.py +4 -3
- {celerp-2.5.2 → celerp-2.5.3}/celerp/events/engine.py +1 -1
- {celerp-2.5.2 → celerp-2.5.3}/celerp/events/schemas.py +54 -2
- {celerp-2.5.2 → celerp-2.5.3}/celerp/gateway/state.py +3 -1
- {celerp-2.5.2 → celerp-2.5.3}/celerp/main.py +41 -31
- celerp-2.5.3/celerp/migrations/versions/l9a0b1c2d3e4_fold_list_contact_fields.py +46 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/__init__.py +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/loader.py +31 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/doc_print.py +30 -12
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/companies.py +80 -98
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/doctor.py +2 -12
- celerp-2.5.3/celerp/schemas/numbers.py +12 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/auto_je.py +536 -207
- celerp-2.5.3/celerp/services/business_type.py +99 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/cloud_entitlement.py +9 -3
- celerp-2.5.3/celerp/services/company_lock.py +100 -0
- celerp-2.5.2/ui/components/currency.py → celerp-2.5.3/celerp/services/currencies.py +8 -56
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/demo.py +191 -79
- celerp-2.5.3/celerp/services/doc_balance.py +120 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/landed_cost.py +27 -19
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/money.py +24 -0
- celerp-2.5.3/celerp/services/payment_terms.py +44 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/physical_codes.py +5 -21
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/pricing.py +10 -7
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/reorder.py +18 -20
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/units.py +8 -0
- celerp-2.5.3/celerp/services/vertical_presets.py +157 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/PKG-INFO +8 -6
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/SOURCES.txt +20 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/requires.txt +13 -5
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/scm_file_list.json +55 -0
- {celerp-2.5.2 → celerp-2.5.3}/conftest.py +78 -0
- {celerp-2.5.2 → celerp-2.5.3}/constraints.txt +11 -5
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/routes.py +14 -21
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +4 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-admin/celerp_admin/routes.py +135 -15
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/migrations.py +8 -7
- celerp-2.5.3/default_modules/celerp-contacts/celerp_contacts/references.py +96 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/routes.py +67 -82
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/search.py +3 -9
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +17 -9
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/__init__.py +3 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/api_setup.py +4 -1
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/doc_constants.py +59 -1
- celerp-2.5.3/default_modules/celerp-docs/celerp_docs/doc_money.py +116 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/doc_projections.py +55 -28
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/doc_service.py +7 -2
- celerp-2.5.3/default_modules/celerp-docs/celerp_docs/received.py +670 -0
- celerp-2.5.3/default_modules/celerp-docs/celerp_docs/received_legacy.py +155 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/routes.py +1597 -771
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/routes_payments.py +4 -1
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/routes_share.py +165 -129
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/search.py +2 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/sequences.py +7 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/taxes.py +3 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_audits.py +189 -9
- celerp-2.5.3/default_modules/celerp-docs/tests/test_bulk_payment_alloc_lock.py +233 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_cogs_lifecycle_concurrency.py +207 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_contact_reference_lifecycle.py +277 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_contact_selection.py +486 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_contact_write_doors.py +547 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_list_contact_currency.py +86 -0
- celerp-2.5.3/default_modules/celerp-docs/tests/test_list_contact_reference.py +85 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_query_pushdown.py +4 -4
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_close_review_fixes.py +3 -5
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_lifecycle_concurrency.py +6 -1
- celerp-2.5.3/default_modules/celerp-docs/tests/test_received_concurrency.py +88 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/projections.py +71 -40
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/routes.py +146 -80
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/services.py +348 -56
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_import_service.py +29 -21
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +2 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/routes.py +5 -4
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +29 -21
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/celerp_reports/routes.py +18 -20
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/tests/test_reports_full.py +18 -3
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +2 -1
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +5 -5
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +1 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +1 -0
- celerp-2.5.3/default_modules/celerp-verticals/celerp_verticals/routes.py +132 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/tests/test_verticals.py +2 -2
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/tests/test_verticals_routers.py +23 -1
- celerp-2.5.3/default_modules/first_party.lock.json +16 -0
- {celerp-2.5.2 → celerp-2.5.3}/pyproject.toml +7 -5
- {celerp-2.5.2 → celerp-2.5.3}/test_helpers.py +16 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/api_client.py +108 -53
- celerp-2.5.3/ui/components/currency.py +62 -0
- celerp-2.5.3/ui/components/operation_key.py +31 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/shell.py +88 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/table.py +118 -38
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/am.json +277 -198
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/ar.json +86 -7
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/de.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/en.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/es.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/fr.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/id.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/it.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/ja.json +86 -7
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/pt.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/th.json +85 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/locales/vi.json +86 -7
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/accounting.py +2 -3
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/contacts.py +25 -24
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/csv_import.py +23 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/dashboard.py +39 -33
- celerp-2.5.3/ui/routes/docs_import.py +673 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/documents.py +464 -480
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/inventory.py +25 -28
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/lists_import.py +3 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings.py +90 -6
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_manufacturing.py +5 -11
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/setup.py +53 -123
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/subscriptions.py +4 -3
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/app.css +19 -17
- celerp-2.5.2/default_modules/celerp-docs/tests/test_bulk_payment_alloc_lock.py +0 -502
- celerp-2.5.2/default_modules/celerp-verticals/celerp_verticals/routes.py +0 -257
- celerp-2.5.2/default_modules/first_party.lock.json +0 -16
- celerp-2.5.2/ui/routes/docs_import.py +0 -356
- {celerp-2.5.2 → celerp-2.5.3}/CLA.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/CONTRIBUTING.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/LICENSING.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/MANIFEST.in +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/NOTICE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/README.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/alembic.ini +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/__main__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/batch.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/cleanup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/conversations.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/files.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/intent.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/llm.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/models.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/page_count.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/quota.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/service.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/ai/tools.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/alembic.ini +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/alembic_config.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/capacity.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/cli.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/compat.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/compute/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/compute/aggregations.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/compute/valuation.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/config.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/config_store.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/base.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/daily_scheduler.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/http.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/images.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/outbound_queue.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/quickbooks.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/registry.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/relay_token.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/remote_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/shopify.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/sync_runner.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/upsert.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/util.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/webhooks.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/woocommerce.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/connectors/xero.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/constants.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/db.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/db_url.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/embedded_pg.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/entitlement_preflight.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/events/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/events/types.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/gateway/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/gateway/bootstrap.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/gateway/client.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/gateway/fixtures/entitlement_flags_fixture.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/importers/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/importers/importer.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/importers/schema.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/importers/tabular.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/inventory_codes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/middleware.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/README.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/_auto_stamp.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/_data_reconcile.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/_json_compat.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/env.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/script.py.mako +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/bc0d1e2f3a4b_barcode_unique_index.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/c9d8e7f6a5b4_seed_shrinkage_writeoff_account.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/d1e2f3a4b5c6_rfid_epc_unique_index.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/f3a4b5c6d7e8_purge_session_registry.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/g4b5c6d7e8f9_add_install_owner.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/h5c6d7e8f9a0_backfill_install_owner.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/i6d7e8f9a0b1_add_sync_run_attention.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/j7e8f9a0b1c2_add_connector_sources.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/k8f9a0b1c2d3_drop_physical_code_unique_indexes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/accounting.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/ai.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/auth.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/base.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/company.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/connector_config.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/connector_source.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/import_batch.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/ledger.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/marketplace.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/notification.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/projections.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/share.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/supporter.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/models/sync_run.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/api.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/audit.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/demotion.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/importer.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/license.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/meta.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/migrations_runner.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/references.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/registry.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/modules/slots.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/notifications/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/notifications/service.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/notifications/sse.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/branding.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/document_context.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/pdf.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/output/share_render.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/engine.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/handlers/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/handlers/marketplace.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/handlers/scanning.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/handlers/shopify.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/projections/handlers/system.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/attachments.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/auth.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/debug.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/events.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/health.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/ledger.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/notifications.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/stars.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/routers/system.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/runtime.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/schemas/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/activity_redaction.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/attachments.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/auth.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/background.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup_export.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup_import.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup_repo.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup_scheduler.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/backup_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/business_time.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/cogs_backfill.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/cost_visibility.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/csv_export.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/dev_release_guard.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/document_lines.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/email.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/field_schema.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/fulfill.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/holdings.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/je_keys.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/line_measures.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/list_behavior.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/outbound_url.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/payments.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/permissions.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/pick.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/relay_share.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/runtime_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/session_tracker.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/shipping.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/star_cta.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/status_doc_backfill.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/supporter_badge.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/system_health.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/terms.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/services/update.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/session_gate.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp/tax_regimes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/dependency_links.txt +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/entry_points.txt +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/celerp.egg-info/top_level.txt +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/conftest_support.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/journal.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/statement.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_cash_flow.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_reconciliation_agent.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-accounting/tests/test_route_permissions.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-admin/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/celerp_ai/routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/celerp_ai/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/_fixtures.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/conftest.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_agent_loop.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_batch.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_commercial_routing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_confirm_race_pg.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_conversations.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_intent.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_live_agent.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_llm.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_memory.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_models.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_page_count.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_quota.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_router.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_showcase_claims.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-ai/tests/test_workflows.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-backup/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-backup/celerp_backup/routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/conftest.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_images.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-dashboard/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-dashboard/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/conftest.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_consolidate_lots.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_cross_lot_settlement.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_freight_je.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_freight_lines.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_landed_receive.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_line_delete_persist.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_line_identifier.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_line_page_patch_truncate.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_concurrency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_ids_filter.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_outcome_concurrency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_page_no_full_state.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_quantity_integrity.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_reprice.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_list_sell_by_and_reference.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_close.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_close_projection.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_line_labels.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_memo_unfulfilled_filter.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_payment_void_activity.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_send_visibility.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_service_lines.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_sold_label_ordering.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_void_guards.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-docs/tests/test_writeoffs.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/routes_scanning.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_import_agent_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-inventory/tests/test_physical_mutation_concurrency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/am.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/ar.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/de.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/en.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/es.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/fr.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/id.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/it.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/ja.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/pt.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/th.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/locales/vi.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/celerp_labels/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/requirements.txt +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/tests/test_labels.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/requirements.txt +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_build_api.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_completion_lock_order.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_production_order.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_recost_api.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_run_records.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-reports/tests/test_reports_unit.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/celerp_subscriptions/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/LICENSE +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/legal/OFFICIAL-COMPONENTS.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/legal/TRADEMARK.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/packaging/winget/Celerp.Celerp.yaml +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/packaging/winget/README.md +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/setup.cfg +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/app.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/activity.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/attrs.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/backup.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/cloud_gate.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/files.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/journal.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/notes.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/phone.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/components/report_kit.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/config.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/i18n.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/marketplace_catalog.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/__init__.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/account.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/accounting_import.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/auth.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/commercial.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/events.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/financial_reports.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/manufacturing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/modules_page.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/notifications.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/reconciliation.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/reports.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/search.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_accounting.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_cloud.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_connectors.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_contacts.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_general.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_import.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_inventory.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_payments.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_purchasing.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/settings_sales.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/stars.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/subscriptions_import.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/routes/system_update.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/security.py +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/htmx.min.js +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/icon.png +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/logo.png +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
- {celerp-2.5.2 → celerp-2.5.3}/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.5.
|
|
3
|
+
Version: 2.5.3
|
|
4
4
|
Summary: Free, self-hosted ERP for small businesses
|
|
5
5
|
License: Business Source License 1.1
|
|
6
6
|
|
|
@@ -143,13 +143,15 @@ Requires-Dist: cffi==2.1.1; platform_python_implementation != "PyPy"
|
|
|
143
143
|
Requires-Dist: charset-normalizer==3.5.1
|
|
144
144
|
Requires-Dist: click==8.5.0
|
|
145
145
|
Requires-Dist: colorama==0.4.6; sys_platform == "win32"
|
|
146
|
-
Requires-Dist: cryptography==
|
|
147
|
-
Requires-Dist:
|
|
146
|
+
Requires-Dist: cryptography==48.0.1; platform_machine == "x86_64" and sys_platform == "darwin"
|
|
147
|
+
Requires-Dist: cryptography==50.0.1; platform_machine != "x86_64" or sys_platform != "darwin"
|
|
148
|
+
Requires-Dist: deprecated==1.3.1; python_full_version < "3.12"
|
|
149
|
+
Requires-Dist: deprecated==3.0.0; python_full_version >= "3.12"
|
|
148
150
|
Requires-Dist: ecdsa==0.19.2
|
|
149
151
|
Requires-Dist: et-xmlfile==2.0.0
|
|
150
152
|
Requires-Dist: exceptiongroup==1.3.1; python_full_version < "3.11"
|
|
151
153
|
Requires-Dist: fastapi==0.141.1
|
|
152
|
-
Requires-Dist: fastcore==2.2.
|
|
154
|
+
Requires-Dist: fastcore==2.2.31
|
|
153
155
|
Requires-Dist: greenlet==3.5.6
|
|
154
156
|
Requires-Dist: h11==0.16.0
|
|
155
157
|
Requires-Dist: httpcore==1.0.9
|
|
@@ -166,7 +168,7 @@ Requires-Dist: markupsafe==3.0.3
|
|
|
166
168
|
Requires-Dist: numpy==2.2.6; python_full_version < "3.11"
|
|
167
169
|
Requires-Dist: numpy==2.4.6; python_full_version == "3.11.*"
|
|
168
170
|
Requires-Dist: numpy==2.5.3; python_full_version >= "3.12"
|
|
169
|
-
Requires-Dist: oauthlib==
|
|
171
|
+
Requires-Dist: oauthlib==4.0.0
|
|
170
172
|
Requires-Dist: openpyxl==3.1.5
|
|
171
173
|
Requires-Dist: packaging==26.3
|
|
172
174
|
Requires-Dist: passlib==1.7.4
|
|
@@ -205,7 +207,7 @@ Requires-Dist: uvloop==0.22.1; platform_python_implementation != "PyPy" and sys_
|
|
|
205
207
|
Requires-Dist: watchfiles==1.3.0
|
|
206
208
|
Requires-Dist: websockets==16.1.1; python_full_version < "3.11"
|
|
207
209
|
Requires-Dist: websockets==17.1; python_full_version >= "3.11"
|
|
208
|
-
Requires-Dist: wrapt==2.
|
|
210
|
+
Requires-Dist: wrapt==2.5.0
|
|
209
211
|
Provides-Extra: dev
|
|
210
212
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
211
213
|
Requires-Dist: pytest-asyncio>=0.23; extra == "dev"
|
|
@@ -27,6 +27,7 @@ from sqlalchemy import select
|
|
|
27
27
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
28
28
|
|
|
29
29
|
from celerp.models.company import Company
|
|
30
|
+
from celerp.services.company_lock import locked_company
|
|
30
31
|
|
|
31
32
|
MAX_NOTES = 50
|
|
32
33
|
MAX_KV_KEYS = 100
|
|
@@ -52,7 +53,7 @@ async def set_memory(
|
|
|
52
53
|
memory: dict[str, Any],
|
|
53
54
|
) -> None:
|
|
54
55
|
"""Persist AI memory. Caller is responsible for committing the session."""
|
|
55
|
-
row = await session
|
|
56
|
+
row = await locked_company(session, company_id)
|
|
56
57
|
if row is None:
|
|
57
58
|
return
|
|
58
59
|
settings = dict(row.settings)
|
|
@@ -67,6 +68,7 @@ async def add_note(
|
|
|
67
68
|
content: str,
|
|
68
69
|
) -> None:
|
|
69
70
|
"""Append a note to AI memory, trimming to MAX_NOTES oldest."""
|
|
71
|
+
await locked_company(session, company_id)
|
|
70
72
|
mem = await get_memory(session, company_id)
|
|
71
73
|
notes = list(mem.get("notes", []))
|
|
72
74
|
notes.append({"content": content, "added_at": datetime.now(timezone.utc).isoformat()})
|
|
@@ -83,6 +85,7 @@ async def set_kv(
|
|
|
83
85
|
value: str,
|
|
84
86
|
) -> None:
|
|
85
87
|
"""Set a key-value fact in AI memory."""
|
|
88
|
+
await locked_company(session, company_id)
|
|
86
89
|
mem = await get_memory(session, company_id)
|
|
87
90
|
kv = dict(mem.get("kv", {}))
|
|
88
91
|
if len(kv) >= MAX_KV_KEYS and key not in kv:
|
|
@@ -14,6 +14,7 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
14
14
|
from celerp.config import ensure_instance_id
|
|
15
15
|
from celerp.models.company import Company
|
|
16
16
|
from celerp.models.connector_config import ConnectorConfig
|
|
17
|
+
from celerp.services.company_lock import lock_company
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class ConnectorOwnershipError(RuntimeError):
|
|
@@ -128,9 +129,9 @@ async def _lock_active_company(
|
|
|
128
129
|
cid = uuid.UUID(str(company_id))
|
|
129
130
|
except (TypeError, ValueError) as exc:
|
|
130
131
|
raise ConnectorOwnershipError("Connector company is invalid") from exc
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
132
|
+
if for_update:
|
|
133
|
+
await lock_company(session, cid)
|
|
134
|
+
company = await session.get(Company, cid, populate_existing=True)
|
|
134
135
|
if company is None or not company.is_active:
|
|
135
136
|
raise ConnectorOwnershipError("Connector company is inactive")
|
|
136
137
|
return company
|
|
@@ -69,7 +69,7 @@ async def _check_period_lock(session, company_id, data: dict) -> None:
|
|
|
69
69
|
raise HTTPException(status_code=422, detail=str(exc)) from exc
|
|
70
70
|
event_date = instant.astimezone(zone).date()
|
|
71
71
|
except (ValueError, TypeError):
|
|
72
|
-
|
|
72
|
+
raise HTTPException(status_code=422, detail=f"{event_date_str} is not a date. Enter it as YYYY-MM-DD.") from None
|
|
73
73
|
else:
|
|
74
74
|
try:
|
|
75
75
|
zone = business_timezone((company.settings or {}).get("timezone"))
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from typing import Any
|
|
6
|
+
from typing import Any, Literal
|
|
7
7
|
|
|
8
8
|
from pydantic import BaseModel, Field, model_validator
|
|
9
9
|
|
|
@@ -627,10 +627,23 @@ class DocPaymentReceived(BaseModel):
|
|
|
627
627
|
paired_index: int | None = None
|
|
628
628
|
|
|
629
629
|
|
|
630
|
+
class PaymentBatchRecorded(BaseModel):
|
|
631
|
+
doc_ids: list[str]
|
|
632
|
+
amount: float
|
|
633
|
+
currency: str
|
|
634
|
+
payment_date: str
|
|
635
|
+
allocations: list[dict]
|
|
636
|
+
skipped: list[dict]
|
|
637
|
+
total_allocated: float
|
|
638
|
+
remaining: float
|
|
639
|
+
|
|
640
|
+
|
|
630
641
|
class DocPaymentRefunded(BaseModel):
|
|
631
642
|
amount: float
|
|
632
643
|
reason: str | None = None
|
|
633
644
|
method: str | None = None
|
|
645
|
+
payment_index: int | None = None # the payment the money is given back from
|
|
646
|
+
refund_date: str | None = None
|
|
634
647
|
|
|
635
648
|
|
|
636
649
|
class DocPaymentVoided(BaseModel):
|
|
@@ -681,6 +694,39 @@ class DocSharedImport(BaseModel):
|
|
|
681
694
|
model_config = {"extra": "allow"} # carries the allowlisted shared-document fields
|
|
682
695
|
|
|
683
696
|
|
|
697
|
+
class ReceivedDocImported(BaseModel):
|
|
698
|
+
"""A document another business shared, held apart from our own documents.
|
|
699
|
+
|
|
700
|
+
Carries the sender identity, the revision digest and the sanitized document.
|
|
701
|
+
The same event type records a first import and a later sender revision."""
|
|
702
|
+
source_installation: str
|
|
703
|
+
source_company: str = ""
|
|
704
|
+
source_document: str
|
|
705
|
+
source_revision: str | None = None
|
|
706
|
+
source_link: str | None = None
|
|
707
|
+
digest: str
|
|
708
|
+
received_at: str
|
|
709
|
+
document: dict[str, Any]
|
|
710
|
+
|
|
711
|
+
|
|
712
|
+
class ReceivedDocBooked(BaseModel):
|
|
713
|
+
"""The recipient booked a received document as a local draft."""
|
|
714
|
+
target_id: str
|
|
715
|
+
target_kind: Literal["doc", "list"]
|
|
716
|
+
target_type: str
|
|
717
|
+
revision_seq: int
|
|
718
|
+
revision_digest: str
|
|
719
|
+
target_version: int
|
|
720
|
+
|
|
721
|
+
|
|
722
|
+
class ReceivedDocDraftUpdated(BaseModel):
|
|
723
|
+
"""The booked draft now stands for a newer revision: the recipient applied
|
|
724
|
+
it (draft_updated) or reconciled the draft with it by hand (reconciled)."""
|
|
725
|
+
revision_seq: int
|
|
726
|
+
revision_digest: str
|
|
727
|
+
target_version: int
|
|
728
|
+
|
|
729
|
+
|
|
684
730
|
class DocNoteAdded(BaseModel):
|
|
685
731
|
doc_id: str
|
|
686
732
|
note_id: str
|
|
@@ -1067,7 +1113,7 @@ class ListCreated(BaseModel):
|
|
|
1067
1113
|
model_config = {"extra": "allow"}
|
|
1068
1114
|
list_type: str | None = None
|
|
1069
1115
|
ref_id: str | None = None
|
|
1070
|
-
|
|
1116
|
+
contact_id: str | None = None
|
|
1071
1117
|
status: str = "draft"
|
|
1072
1118
|
|
|
1073
1119
|
|
|
@@ -1226,11 +1272,17 @@ EVENT_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
|
1226
1272
|
"doc.sent": DocSent,
|
|
1227
1273
|
"doc.payment.received": DocPaymentReceived,
|
|
1228
1274
|
"doc.payment.refunded": DocPaymentRefunded,
|
|
1275
|
+
"payment_batch.recorded": PaymentBatchRecorded,
|
|
1229
1276
|
"doc.payment.voided": DocPaymentVoided,
|
|
1230
1277
|
"doc.payment.deleted": DocPaymentDeleted,
|
|
1231
1278
|
"doc.converted": DocConverted,
|
|
1232
1279
|
"doc.received": DocReceived,
|
|
1233
1280
|
"doc.shared_import": DocSharedImport,
|
|
1281
|
+
"received_doc.imported": ReceivedDocImported,
|
|
1282
|
+
"received_doc.revised": ReceivedDocImported,
|
|
1283
|
+
"received_doc.booked": ReceivedDocBooked,
|
|
1284
|
+
"received_doc.draft_updated": ReceivedDocDraftUpdated,
|
|
1285
|
+
"received_doc.reconciled": ReceivedDocDraftUpdated,
|
|
1234
1286
|
"doc.note_added": DocNoteAdded,
|
|
1235
1287
|
"doc.note_updated": DocNoteUpdated,
|
|
1236
1288
|
"doc.note_removed": DocNoteRemoved,
|
|
@@ -826,7 +826,7 @@ def _launch_mode() -> str | None:
|
|
|
826
826
|
|
|
827
827
|
def activate_payload(
|
|
828
828
|
instance_id: str, *, first_boot: bool | None = None,
|
|
829
|
-
activation_verifier: str | None = None,
|
|
829
|
+
activation_verifier: str | None = None, boot_id: str | None = None,
|
|
830
830
|
) -> dict:
|
|
831
831
|
"""Build Connect activation and check-in metadata."""
|
|
832
832
|
import platform as _platform
|
|
@@ -843,6 +843,8 @@ def activate_payload(
|
|
|
843
843
|
payload["first_boot"] = first_boot
|
|
844
844
|
if activation_verifier:
|
|
845
845
|
payload["activation_verifier"] = activation_verifier
|
|
846
|
+
if boot_id:
|
|
847
|
+
payload["boot_id"] = boot_id
|
|
846
848
|
from celerp.config import settings as _settings
|
|
847
849
|
if _settings.backup_encryption_key:
|
|
848
850
|
payload["backup_encryption_key"] = _settings.backup_encryption_key
|
|
@@ -4,9 +4,13 @@
|
|
|
4
4
|
from contextlib import asynccontextmanager
|
|
5
5
|
import asyncio
|
|
6
6
|
import logging
|
|
7
|
+
import math
|
|
7
8
|
import sys
|
|
9
|
+
import uuid
|
|
8
10
|
|
|
9
11
|
from fastapi import FastAPI, Request
|
|
12
|
+
from fastapi.encoders import jsonable_encoder
|
|
13
|
+
from fastapi.exceptions import RequestValidationError
|
|
10
14
|
from fastapi.responses import JSONResponse
|
|
11
15
|
from slowapi import Limiter, _rate_limit_exceeded_handler
|
|
12
16
|
from slowapi.errors import RateLimitExceeded
|
|
@@ -16,12 +20,16 @@ from celerp import __version__, runtime as _runtime
|
|
|
16
20
|
_runtime.watch_supervisor_pipe()
|
|
17
21
|
from celerp.db import engine, lifecycle_engine, mask_db_credentials
|
|
18
22
|
from celerp.inventory_codes import CodeConflictError
|
|
23
|
+
from celerp.services.auto_je import UnbalancedJournalEntry
|
|
19
24
|
from celerp.config import settings, assert_secure_jwt, ensure_instance_id, load_cloud_config, load_backup_config
|
|
20
25
|
from celerp.gateway.state import load_commercial_context
|
|
21
26
|
load_cloud_config()
|
|
22
27
|
load_backup_config()
|
|
23
28
|
load_commercial_context()
|
|
24
29
|
assert_secure_jwt()
|
|
30
|
+
# Read before ensure_instance_id() writes the id.
|
|
31
|
+
_FIRST_BOOT = not settings.gateway_instance_id
|
|
32
|
+
_BOOT_ID = uuid.uuid4().hex
|
|
25
33
|
ensure_instance_id()
|
|
26
34
|
from celerp.middleware import DrainMiddleware, MaxBodySizeMiddleware, SecurityHeadersMiddleware, SlidingTokenRefreshMiddleware, log_unhandled_exception
|
|
27
35
|
from celerp.models.base import Base
|
|
@@ -82,45 +90,28 @@ _MODULE_DIR = _os.environ["MODULE_DIR"]
|
|
|
82
90
|
|
|
83
91
|
|
|
84
92
|
async def _try_auto_activate() -> None:
|
|
85
|
-
"""
|
|
86
|
-
|
|
87
|
-
The verifier is durable, so retrying it after response loss returns the same
|
|
88
|
-
credential. UUID-only activation is intentionally not retried at startup.
|
|
89
|
-
"""
|
|
93
|
+
"""Check in with the relay at startup, or finish a pending activation."""
|
|
90
94
|
_log = logging.getLogger(__name__)
|
|
91
95
|
try:
|
|
92
|
-
import
|
|
93
|
-
from celerp.config import (
|
|
94
|
-
settings as _s, ensure_instance_id, config_path)
|
|
96
|
+
from celerp.config import settings as _s, ensure_instance_id
|
|
95
97
|
if _s.cloud_disconnected:
|
|
96
98
|
return
|
|
97
|
-
first_boot = not config_path().exists()
|
|
98
99
|
iid = await asyncio.to_thread(ensure_instance_id)
|
|
99
|
-
from celerp.gateway.state import
|
|
100
|
+
from celerp.gateway.state import (
|
|
101
|
+
activate_payload, relay_http_url as _rhu, relay_post_with_retry)
|
|
100
102
|
relay_base = _rhu()
|
|
101
103
|
verifier = _s.activation_verifier or ""
|
|
102
104
|
|
|
103
105
|
if not verifier:
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
f"{relay_base}/auth/checkin",
|
|
108
|
-
json=activate_payload(iid, first_boot=first_boot),
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
try:
|
|
112
|
-
await asyncio.wait_for(_checkin(), timeout=6.0)
|
|
113
|
-
except (httpx.HTTPError, asyncio.TimeoutError):
|
|
114
|
-
pass
|
|
106
|
+
await relay_post_with_retry(
|
|
107
|
+
f"{relay_base}/auth/checkin",
|
|
108
|
+
activate_payload(iid, first_boot=_FIRST_BOOT, boot_id=_BOOT_ID))
|
|
115
109
|
return
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
f"{relay_base}/auth/activate",
|
|
122
|
-
activate_payload(
|
|
123
|
-
iid, first_boot=first_boot, activation_verifier=verifier))
|
|
110
|
+
r = await relay_post_with_retry(
|
|
111
|
+
f"{relay_base}/auth/activate",
|
|
112
|
+
activate_payload(
|
|
113
|
+
iid, first_boot=_FIRST_BOOT, activation_verifier=verifier,
|
|
114
|
+
boot_id=_BOOT_ID))
|
|
124
115
|
|
|
125
116
|
if r is None or r.status_code != 200:
|
|
126
117
|
return
|
|
@@ -146,7 +137,8 @@ async def _try_sync_existing_entitlement() -> None:
|
|
|
146
137
|
"""Best-effort boot convergence for an already-persisted relay credential."""
|
|
147
138
|
try:
|
|
148
139
|
from celerp.services.cloud_entitlement import sync_existing_entitlement
|
|
149
|
-
await sync_existing_entitlement(
|
|
140
|
+
await sync_existing_entitlement(
|
|
141
|
+
require_persisted_key=True, first_boot=_FIRST_BOOT, boot_id=_BOOT_ID)
|
|
150
142
|
except Exception as exc:
|
|
151
143
|
logging.getLogger(__name__).debug(
|
|
152
144
|
"Cloud startup reconciliation failed (non-fatal): %s", exc)
|
|
@@ -218,7 +210,7 @@ async def lifespan(_app: FastAPI):
|
|
|
218
210
|
if _enabled_env:
|
|
219
211
|
_enabled: set[str] = set(_enabled_env.split(","))
|
|
220
212
|
else:
|
|
221
|
-
# Fall back to
|
|
213
|
+
# Fall back to the module list saved in config.toml.
|
|
222
214
|
_cfg = _read_config()
|
|
223
215
|
_enabled = set(_cfg.get("modules", {}).get("enabled") or [])
|
|
224
216
|
if _enabled:
|
|
@@ -544,6 +536,17 @@ async def unhandled_exception_handler(request: Request, exc: Exception):
|
|
|
544
536
|
return JSONResponse(status_code=500, content={"detail": "Internal server error"})
|
|
545
537
|
|
|
546
538
|
|
|
539
|
+
def _finite_or_text(value: float) -> float | str:
|
|
540
|
+
return value if math.isfinite(value) else str(value)
|
|
541
|
+
|
|
542
|
+
|
|
543
|
+
@app.exception_handler(RequestValidationError)
|
|
544
|
+
async def request_validation_handler(_request: Request, exc: RequestValidationError):
|
|
545
|
+
# A rejected NaN or Infinity is echoed back as text, since JSON cannot carry it as a number.
|
|
546
|
+
return JSONResponse(status_code=422, content={
|
|
547
|
+
"detail": jsonable_encoder(exc.errors(), custom_encoder={float: _finite_or_text})})
|
|
548
|
+
|
|
549
|
+
|
|
547
550
|
@app.exception_handler(RateLimitExceeded)
|
|
548
551
|
async def rate_limit_handler(_request: Request, _exc: RateLimitExceeded):
|
|
549
552
|
return JSONResponse(status_code=429, content={"detail": "Rate limit exceeded"})
|
|
@@ -557,6 +560,13 @@ async def code_conflict_handler(_request: Request, exc: CodeConflictError):
|
|
|
557
560
|
return JSONResponse(status_code=409, content={"detail": str(exc)})
|
|
558
561
|
|
|
559
562
|
|
|
563
|
+
@app.exception_handler(UnbalancedJournalEntry)
|
|
564
|
+
async def unbalanced_je_handler(_request: Request, exc: UnbalancedJournalEntry):
|
|
565
|
+
# An automatic journal entry that would not balance is refused, and the write that
|
|
566
|
+
# produced it rolls back with it; the message names the document and the amounts.
|
|
567
|
+
return JSONResponse(status_code=422, content={"detail": str(exc)})
|
|
568
|
+
|
|
569
|
+
|
|
560
570
|
# Kernel routes — always present regardless of module configuration
|
|
561
571
|
app.include_router(health.router, tags=["system"])
|
|
562
572
|
app.include_router(health.settings_router, tags=["settings"])
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Copyright (c) 2026 Noah Severs
|
|
2
|
+
# SPDX-License-Identifier: BUSL-1.1
|
|
3
|
+
|
|
4
|
+
"""Store every List's counterparty as contact_id and contact_name.
|
|
5
|
+
|
|
6
|
+
Revision ID: l9a0b1c2d3e4
|
|
7
|
+
Revises: k8f9a0b1c2d3
|
|
8
|
+
Create Date: 2026-09-29
|
|
9
|
+
|
|
10
|
+
Lists stored their counterparty as customer_id and customer_name (transfers:
|
|
11
|
+
receiver). Lists now read contact_id and contact_name only, so this moves the
|
|
12
|
+
older fields onto them. A contact already on the List is kept.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from alembic import op
|
|
18
|
+
|
|
19
|
+
from celerp.migrations._json_compat import update_projection_state
|
|
20
|
+
|
|
21
|
+
revision = "l9a0b1c2d3e4"
|
|
22
|
+
down_revision = "k8f9a0b1c2d3"
|
|
23
|
+
branch_labels = None
|
|
24
|
+
depends_on = None
|
|
25
|
+
|
|
26
|
+
# Hardcoded (migrations must be self-contained), in the order the List projection folds them.
|
|
27
|
+
_FOLD = (("customer_id", "contact_id"), ("customer_name", "contact_name"), ("receiver", "contact_name"))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def upgrade() -> None:
|
|
31
|
+
def _fold(state, row):
|
|
32
|
+
changed = False
|
|
33
|
+
for older, field in _FOLD:
|
|
34
|
+
if older not in state:
|
|
35
|
+
continue
|
|
36
|
+
value = state.pop(older)
|
|
37
|
+
if value and not state.get(field):
|
|
38
|
+
state[field] = value
|
|
39
|
+
changed = True
|
|
40
|
+
return changed
|
|
41
|
+
|
|
42
|
+
update_projection_state(op.get_bind(), _fold, where="entity_type = 'list'")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def downgrade() -> None:
|
|
46
|
+
pass # Data migration - no safe downgrade
|
|
@@ -11,3 +11,4 @@ from celerp.models.notification import Notification # noqa: F401
|
|
|
11
11
|
from celerp.models.share import DocShareToken # noqa: F401 - ensure doc_share_tokens table registered
|
|
12
12
|
from celerp.models.sync_run import SyncRun # noqa: F401 - ensure sync_runs table registered
|
|
13
13
|
from celerp.models.supporter import SupporterBadge # noqa: F401 - ensure supporter_badges table registered
|
|
14
|
+
import celerp.services.company_lock # noqa: F401,E402 - company settings changes need the company lock
|
|
@@ -313,6 +313,15 @@ def _module_candidates(
|
|
|
313
313
|
return out
|
|
314
314
|
|
|
315
315
|
|
|
316
|
+
def module_search_path() -> str:
|
|
317
|
+
"""Every directory an installed module can live in, as a MODULE_DIR-style string:
|
|
318
|
+
the MODULE_DIR entries (administrative precedence) followed by the bundled and
|
|
319
|
+
trusted dirs. Lets a caller locate an installed module's data even when the
|
|
320
|
+
module system is off or the module is not enabled."""
|
|
321
|
+
entries = [e.strip() for e in os.environ.get("MODULE_DIR", "").split(",") if e.strip()]
|
|
322
|
+
return ",".join([*entries, *(str(d) for d in _BUNDLED_MODULES_DIRS)])
|
|
323
|
+
|
|
324
|
+
|
|
316
325
|
def resolve_module_path(
|
|
317
326
|
name: str, module_dir: str | Path | None = None,
|
|
318
327
|
) -> Path | None:
|
|
@@ -514,6 +523,28 @@ def is_running(pkg_name: str) -> bool:
|
|
|
514
523
|
return any(m["name"] == pkg_name for m in _loaded) or is_core_folded(pkg_name)
|
|
515
524
|
|
|
516
525
|
|
|
526
|
+
def restart_would_load(pkg_name: str) -> bool:
|
|
527
|
+
"""True when a server restart would load *pkg_name*.
|
|
528
|
+
|
|
529
|
+
That needs the module system on with an installed copy in MODULE_DIR, and an
|
|
530
|
+
enabled list the restart re-reads from the config file: under the supervisor
|
|
531
|
+
ENABLED_MODULES is rebuilt from config on every restart, while outside it a set
|
|
532
|
+
ENABLED_MODULES pins the list and only the names it holds can load."""
|
|
533
|
+
if not _module_candidates(pkg_name):
|
|
534
|
+
return False
|
|
535
|
+
pinned = os.environ.get("ENABLED_MODULES", "")
|
|
536
|
+
if not pinned or os.environ.get("CELERP_SUPERVISED") == "1":
|
|
537
|
+
return True
|
|
538
|
+
return pkg_name in {n.strip() for n in pinned.split(",")}
|
|
539
|
+
|
|
540
|
+
|
|
541
|
+
def module_label(pkg_name: str) -> str:
|
|
542
|
+
"""The module's display name from its manifest, or the package name."""
|
|
543
|
+
path = resolve_runtime_module_path(pkg_name, module_search_path())
|
|
544
|
+
meta = read_manifest_metadata(path) if path is not None else {}
|
|
545
|
+
return meta.get("display_name") or meta.get("label") or pkg_name
|
|
546
|
+
|
|
547
|
+
|
|
517
548
|
# Fields to extract from PLUGIN_MANIFEST for display purposes.
|
|
518
549
|
# All must be string or list-of-strings literals in __init__.py (safe for ast.literal_eval).
|
|
519
550
|
_MANIFEST_DISPLAY_FIELDS: frozenset[str] = frozenset({
|
|
@@ -21,6 +21,7 @@ from fasthtml.common import (
|
|
|
21
21
|
|
|
22
22
|
from celerp.output.branding import BRAND_TEXT as _BRAND_LABEL, brand_url as _brand_url
|
|
23
23
|
from celerp.output.document_context import prepare_document_output
|
|
24
|
+
from celerp.services.doc_balance import outstanding_balance
|
|
24
25
|
from celerp.services.line_measures import line_identifier as _line_identifier, measure_sublines, qty_label
|
|
25
26
|
from celerp.services.shipping import REASON_EXPORT_LABELS, SHIPPING_LIST_TYPE
|
|
26
27
|
from celerp.services.units import DEFAULT_UNITS, build_unit_map
|
|
@@ -30,9 +31,24 @@ EMPTY = "--"
|
|
|
30
31
|
# Doc types that show pieces/weight measure sub-lines (the invoice layout).
|
|
31
32
|
INVOICE_LAYOUT_DOC_TYPES: frozenset[str] = frozenset({"invoice", "memo", "list"})
|
|
32
33
|
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
|
|
34
|
+
# The celerp.com page a recipient lands on to import a shared document. It is
|
|
35
|
+
# handed the share page's own address as `link`.
|
|
36
|
+
IMPORT_ACCEPT_URL = "https://www.celerp.com/accept"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def import_accept_url(page: str) -> str:
|
|
40
|
+
"""Accept URL carrying the share page address as `link`."""
|
|
41
|
+
from urllib.parse import urlencode
|
|
42
|
+
return f"{IMPORT_ACCEPT_URL}?{urlencode({'link': page})}"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# On a share page the address the recipient is actually reading is the one to
|
|
46
|
+
# import from; behind the relay the server cannot know it, so the page fills it in.
|
|
47
|
+
_IMPORT_FROM_PAGE_JS = (
|
|
48
|
+
"(function(){var a=document.getElementById('dp-import');"
|
|
49
|
+
"if(a&&/^https?:$/.test(location.protocol)){a.href='" + IMPORT_ACCEPT_URL
|
|
50
|
+
+ "?link='+encodeURIComponent(location.origin+location.pathname);}})();"
|
|
51
|
+
)
|
|
36
52
|
|
|
37
53
|
_BRAND_URL = _brand_url("doc-print")
|
|
38
54
|
|
|
@@ -179,17 +195,20 @@ body { font-family: Arial, sans-serif; font-size: 10pt; color: #111; background:
|
|
|
179
195
|
"""
|
|
180
196
|
|
|
181
197
|
|
|
182
|
-
def _doc_footer(import_url: str | None):
|
|
198
|
+
def _doc_footer(import_url: str | None, import_from_page: bool = False):
|
|
183
199
|
"""One footer format everywhere: brand left, pipe, import link right.
|
|
184
200
|
The import link is only rendered when the document's share link is live,
|
|
185
|
-
so a printed or PDF'd copy never carries a URL that 404s.
|
|
201
|
+
so a printed or PDF'd copy never carries a URL that 404s. On the share
|
|
202
|
+
page itself (``import_from_page``) the link is pointed at the page's own
|
|
203
|
+
address once it loads."""
|
|
186
204
|
brand = A(_BRAND_LABEL, href=_BRAND_URL, target="_blank", rel="noopener")
|
|
187
205
|
if not import_url:
|
|
188
206
|
return Div(brand, cls="dp-footer")
|
|
189
207
|
return Div(
|
|
190
208
|
brand,
|
|
191
209
|
Span("|", cls="dp-footer__sep"),
|
|
192
|
-
A("Import into Celerp", href=import_url),
|
|
210
|
+
A("Import into Celerp", href=import_url, id="dp-import"),
|
|
211
|
+
Script(_IMPORT_FROM_PAGE_JS) if import_from_page else None,
|
|
193
212
|
cls="dp-footer",
|
|
194
213
|
)
|
|
195
214
|
|
|
@@ -201,10 +220,7 @@ def _pay_bar(pay_url: str | None, doc: dict, currency: str):
|
|
|
201
220
|
buttons."""
|
|
202
221
|
if not pay_url:
|
|
203
222
|
return None
|
|
204
|
-
|
|
205
|
-
outstanding = float(doc.get("amount_outstanding", doc.get("total", 0)) or 0)
|
|
206
|
-
except (TypeError, ValueError):
|
|
207
|
-
outstanding = 0.0
|
|
223
|
+
outstanding = float(outstanding_balance(doc) or 0)
|
|
208
224
|
if outstanding <= 0:
|
|
209
225
|
return None
|
|
210
226
|
amount = fmt_money(outstanding, currency)
|
|
@@ -216,6 +232,7 @@ def _pay_bar(pay_url: str | None, doc: dict, currency: str):
|
|
|
216
232
|
|
|
217
233
|
|
|
218
234
|
def render_doc_print_html(doc: dict, *, import_url: str | None = None,
|
|
235
|
+
import_from_page: bool = False,
|
|
219
236
|
pay_url: str | None = None, auto_print: bool = False,
|
|
220
237
|
layout: str | None = None,
|
|
221
238
|
line_identifier: str = "sku") -> str:
|
|
@@ -225,7 +242,8 @@ def render_doc_print_html(doc: dict, *, import_url: str | None = None,
|
|
|
225
242
|
fields, and (for invoice-layout types) enriched line measures - both the
|
|
226
243
|
UI print routes and the API share view prepare it the same way.
|
|
227
244
|
``pay_url`` adds the screen-only payment bar (public share view of a
|
|
228
|
-
payable doc on a Stripe-connected instance).
|
|
245
|
+
payable doc on a Stripe-connected instance). ``import_from_page`` marks
|
|
246
|
+
the public share view, whose import link points at its own address.
|
|
229
247
|
|
|
230
248
|
A shipping document (list_type="shipping_doc") is one shipment record with
|
|
231
249
|
two paper renderings, chosen via ``layout``: "delivery_note" (the default -
|
|
@@ -622,7 +640,7 @@ def render_doc_print_html(doc: dict, *, import_url: str | None = None,
|
|
|
622
640
|
Div(P("Note to Customer", cls="dp-notes-label"), P(customer_note), cls="dp-notes") if customer_note else None,
|
|
623
641
|
declaration_section,
|
|
624
642
|
signature_section,
|
|
625
|
-
_doc_footer(import_url),
|
|
643
|
+
_doc_footer(import_url, import_from_page),
|
|
626
644
|
Script("window.onload = function() { window.print(); }") if auto_print else None,
|
|
627
645
|
),
|
|
628
646
|
)
|