celerp 2.5.4__tar.gz → 2.5.6__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.4 → celerp-2.5.6}/PKG-INFO +16 -15
- {celerp-2.5.4 → celerp-2.5.6}/README.md +2 -2
- {celerp-2.5.4 → celerp-2.5.6}/celerp/accounting_roles.py +4 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/config.py +0 -9
- {celerp-2.5.4 → celerp-2.5.6}/celerp/events/engine.py +12 -3
- {celerp-2.5.4 → celerp-2.5.6}/celerp/events/schemas.py +63 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/events/types.py +5 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/client.py +16 -4
- {celerp-2.5.4 → celerp-2.5.6}/celerp/main.py +18 -9
- {celerp-2.5.4 → celerp-2.5.6}/celerp/middleware.py +155 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/service.py +23 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/doc_print.py +2 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/pdf.py +2 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/engine.py +9 -4
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/system.py +5 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/auth.py +40 -18
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/companies.py +11 -18
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/company_backup.py +6 -5
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/migrations.py +4 -2
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/notifications.py +7 -3
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/account_roles.py +81 -10
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/auth.py +132 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/auto_je.py +412 -86
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup.py +104 -32
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_export.py +19 -20
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_repo.py +76 -57
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cogs_backfill.py +3 -3
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_backup.py +28 -16
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_settings.py +4 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/doc_balance.py +13 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/document_lines.py +8 -3
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/journal_accounts.py +5 -3
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/list_behavior.py +68 -2
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/locations.py +12 -0
- celerp-2.5.6/celerp/services/lot_origin.py +2214 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migrations.py +4 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/posting_readiness.py +71 -28
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/pricing.py +12 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/reorder.py +15 -13
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/terms.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/update.py +1 -4
- {celerp-2.5.4 → celerp-2.5.6}/celerp/tax_regimes.py +78 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/PKG-INFO +16 -15
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/SOURCES.txt +3 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/requires.txt +17 -12
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/scm_file_list.json +31 -1
- {celerp-2.5.4 → celerp-2.5.6}/conftest.py +3 -4
- {celerp-2.5.4 → celerp-2.5.6}/constraints.txt +14 -12
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/chart_rules.py +29 -4
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/routes.py +265 -68
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +1 -1
- celerp-2.5.6/default_modules/celerp-accounting/tests/report_goldens/opening-tie-out.html +98 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/statement.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +11 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +23 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_locked_reversal_party.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +16 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_route_permissions.py +1 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/routes.py +124 -43
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_router.py +0 -2
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -2
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/__init__.py +1 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/consignment_buy.py +6 -4
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_constants.py +19 -12
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_money.py +10 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_projections.py +27 -4
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_service.py +5 -5
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/import_service.py +12 -2
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes.py +891 -280
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/sequences.py +1 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_audits.py +30 -27
- celerp-2.5.6/default_modules/celerp-docs/tests/test_doc_scan.py +1068 -0
- celerp-2.5.6/default_modules/celerp-docs/tests/test_doc_scan_concurrency.py +166 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_outcome_concurrency.py +6 -6
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_quantity_integrity.py +6 -10
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_reprice.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/projections.py +25 -2
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/routes.py +3 -180
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/services.py +176 -3
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_import_service.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/routes.py +58 -134
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/tests/test_reports_unit.py +62 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/__init__.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +5 -2
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/first_party.lock.json +7 -7
- {celerp-2.5.4 → celerp-2.5.6}/pyproject.toml +13 -12
- {celerp-2.5.4 → celerp-2.5.6}/stock_books.py +16 -5
- {celerp-2.5.4 → celerp-2.5.6}/test_helpers.py +21 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/api_client.py +96 -10
- {celerp-2.5.4 → celerp-2.5.6}/ui/app.py +5 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/activity.py +38 -12
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/files.py +2 -2
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/shell.py +7 -2
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/table.py +68 -13
- {celerp-2.5.4 → celerp-2.5.6}/ui/i18n.py +1 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/am.json +252 -29
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/ar.json +253 -30
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/de.json +252 -29
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/en.json +252 -29
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/es.json +1268 -1045
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/fr.json +252 -29
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/id.json +253 -30
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/it.json +252 -29
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/ja.json +253 -30
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/pt.json +255 -32
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/th.json +253 -30
- {celerp-2.5.4 → celerp-2.5.6}/ui/locales/vi.json +254 -31
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/contacts.py +1 -1
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/dashboard.py +77 -11
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/docs_import.py +6 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/documents.py +312 -328
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/financial_reports.py +143 -3
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/inventory.py +16 -18
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/manufacturing.py +2 -3
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/reports.py +26 -31
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/search.py +8 -7
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings.py +1 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_accounting.py +420 -66
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/subscriptions.py +4 -4
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/app.css +9 -2
- celerp-2.5.4/celerp/services/lot_origin.py +0 -1093
- {celerp-2.5.4 → celerp-2.5.6}/CLA.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/CONTRIBUTING.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/LICENSING.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/MANIFEST.in +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/NOTICE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/SECURITY.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/alembic.ini +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/__main__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/cleanup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/conversations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/files.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/intent.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/llm.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/memory.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/models.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/page_count.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/quota.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/service.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/tools.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/alembic.ini +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/alembic_config.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/capacity.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/cli.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/compat.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/aggregations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/valuation.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/config_store.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/base.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/daily_scheduler.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/http.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/images.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/outbound_queue.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/ownership.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/quickbooks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/registry.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/relay_token.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/remote_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/shopify.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/sync_runner.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/upsert.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/util.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/webhooks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/woocommerce.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/xero.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/constants.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/credentials.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/db.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/db_catalog.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/db_url.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/desktop_child.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/embedded_pg.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/entitlement_preflight.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/events/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/bootstrap.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/fixtures/entitlement_flags_fixture.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/held_back.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/base.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/adapter.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/attachments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/book.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/fields.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/ledger.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/mappings.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/protobuf.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/reconcile.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/sqlite_reader.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/types.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/registry.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/importer.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/results.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sample/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sample/sample.manager +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/schema.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sinks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/tabular.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/inventory_codes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/README.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_auto_stamp.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_data_reconcile.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_json_compat.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/compatibility.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/env.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/script.py.mako +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/bc0d1e2f3a4b_barcode_unique_index.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c7f1a2b3d4e5_seed_cash_flow_sections.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c9d8e7f6a5b4_seed_shrinkage_writeoff_account.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d1e2f3a4b5c6_rfid_epc_unique_index.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d8e9f0a1b2c3_notification_i18n.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e9f0a1b2c3d4_account_code_generated.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f3a4b5c6d7e8_purge_session_registry.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/g4b5c6d7e8f9_add_install_owner.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/h5c6d7e8f9a0_backfill_install_owner.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/i6d7e8f9a0b1_add_sync_run_attention.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/j7e8f9a0b1c2_add_connector_sources.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/k8f9a0b1c2d3_drop_physical_code_unique_indexes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/l9a0b1c2d3e4_fold_list_contact_fields.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/m0b1c2d3e4f5_migration_runs.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/n1c2d3e4f5a6_migration_lock_date_and_attachment_tasks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/o2d3e4f5a6b7_add_import_batch_operation_key.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/p3e4f5a6b7c8_session_registry_company.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/q4f5a6b7c8d9_payment_closures.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/r5g6b7c8d9e0_unmatched_payment_paid_at.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/s6h7c8d9e0f1_unmatched_refunds.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/t7i8j9k0l1m2_company_modules_from_2_5.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/u8j9k0l1m2n3_unmatched_payment_recorded_on.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/v0m1n2o3p4q5_import_batch_reversible.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/w1n2o3p4q5r6_notification_reads.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/accounting.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/ai.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/auth.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/base.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/company.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/connector_config.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/connector_source.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/import_batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/ledger.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/marketplace.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/migration.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/notification.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/payment_closure.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/projections.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/share.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/supporter.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/models/sync_run.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/api.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/audit.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/demotion.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/importer.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/license.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/loader.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/marketplace_stage.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/meta.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/migrations_runner.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/outcome.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/references.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/registry.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/requirements.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/slots.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/sse.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/branding.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/document_context.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/output/share_render.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/marketplace.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/shopify.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/retired.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/attachments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/debug.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/events.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/health.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/ledger.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/stars.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/system.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/runtime.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/schemas/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/schemas/numbers.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/activity_redaction.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/app_paths.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/attachments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/background.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_scheduler.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/bootstrap.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/business_time.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/business_type.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cloud_entitlement.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_backup_files.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_files.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_lifecycle.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_lock.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_reset.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cost_visibility.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/csv_export.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/currencies.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/demo.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/dev_release_guard.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/email.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/field_schema.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/fulfill.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/goods_cost.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/holdings.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/import_stage.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/item_erasure.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/je_keys.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/landed_cost.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/ledger_display.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/line_measures.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migration_core_sink.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migration_scan_store.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/money.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/outbound_url.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/payment_terms.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/payments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/permissions.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/physical_codes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/pick.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/posting_dates.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/provisioning.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/relay_share.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/runtime_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/session_tracker.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/shipping.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/staged_downloads.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/star_cta.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/starter_modules.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/status_doc_backfill.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/supporter_badge.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/system_health.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/units.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/services/vertical_presets.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp/session_gate.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/dependency_links.txt +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/entry_points.txt +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/top_level.txt +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/conftest_support.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/account_tree.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/import_service.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/ledger_accounts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/migration_sink.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_account_mutation_rules.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_bank_chart_accounts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_cash_flow.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_chart_import_batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_account_boundary.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_agent.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_line_attachments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_opening_balance.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/_fixtures.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/conftest.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_agent_loop.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_commercial_routing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_confirm_race_pg.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_conversations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_intent.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_live_agent.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_llm.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_memory.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_models.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_page_count.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_quota.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_showcase_claims.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_workflows.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/conftest.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_images.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/migration_sink.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/migrations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/references.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/api_setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/historical_lots.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/imported_cutover.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/legacy_credit_notes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/legacy_receipts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/migration_sink.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/received.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/received_legacy.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes_payments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes_share.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/taxes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/conftest.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_bulk_payment_alloc_lock.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_cogs_lifecycle_concurrency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_consolidate_lots.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_reference_lifecycle.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_selection.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_write_doors.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_cross_lot_settlement.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_freight_je.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_freight_lines.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_historical_receipt.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_landed_receive.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_delete_persist.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_identifier.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_page_patch_truncate.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_concurrency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_contact_currency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_contact_reference.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_ids_filter.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_page_no_full_state.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_query_pushdown.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_sell_by_and_reference.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close_projection.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close_review_fixes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_lifecycle_concurrency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_line_labels.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_unfulfilled_filter.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_online_deposit_account_refusal.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_payment_void_activity.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_received_concurrency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_send_visibility.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_service_lines.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_sold_label_ordering.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_void_guards.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_writeoffs.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/migration_sink.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_import_agent_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_physical_mutation_concurrency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/am.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/ar.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/de.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/en.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/es.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/fr.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/id.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/it.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/ja.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/pt.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/th.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/vi.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/tests/test_labels.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/movements.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/run_events.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_build_api.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_bulk_run_atomicity.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_completion_lock_order.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_mfg_route_permissions.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_production_order.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recost_api.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_run_records.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_work_center_wip_location.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/tests/test_reports_full.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/search.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/LICENSE +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/retail.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/tests/test_verticals.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/tests/test_verticals_routers.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/legal/OFFICIAL-COMPONENTS.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/legal/TRADEMARK.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.yaml +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/README.md +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/setup.cfg +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/attrs.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/backup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/cloud_gate.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/currency.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/deleted_items.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/demo_items.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/icons.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/import_access.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/journal.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/notes.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/operation_key.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/phone.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/posting_accounts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/report_kit.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/components/start_options.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/config.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/marketplace_catalog.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/module_slots.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/__init__.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/account.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/accounting.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/accounting_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/auth.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/commercial.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/company_backup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/csv_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/doctor.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/events.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/lists_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/migrations.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/modules_page.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/notifications.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/reconciliation.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_cloud.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_connectors.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_contacts.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_general.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_inventory.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_manufacturing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_payments.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_purchasing.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_sales.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/setup.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/stars.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/subscriptions_import.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/routes/system_update.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/security.py +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/apple-touch-icon.png +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/currency-guess.js +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/favicon-32x32.png +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/favicon.ico +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/htmx.min.js +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/logo.png +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
- {celerp-2.5.4 → celerp-2.5.6}/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.6
|
|
4
4
|
Summary: Free, self-hosted ERP for small businesses
|
|
5
5
|
License: Business Source License 1.1
|
|
6
6
|
|
|
@@ -134,7 +134,7 @@ Requires-Dist: annotated-doc==0.0.5
|
|
|
134
134
|
Requires-Dist: annotated-types==0.8.0
|
|
135
135
|
Requires-Dist: anyio==4.15.1
|
|
136
136
|
Requires-Dist: async-timeout==5.0.1; python_full_version < "3.11"
|
|
137
|
-
Requires-Dist: asyncpg==0.
|
|
137
|
+
Requires-Dist: asyncpg==0.32.0
|
|
138
138
|
Requires-Dist: bcrypt==5.0.0
|
|
139
139
|
Requires-Dist: beautifulsoup4==4.15.0
|
|
140
140
|
Requires-Dist: celerp-postgres==17.10.0; (platform_machine == "aarch64" and sys_platform == "linux") or (platform_machine == "x86_64" and sys_platform == "linux") or (platform_machine == "AMD64" and sys_platform == "win32")
|
|
@@ -150,13 +150,13 @@ Requires-Dist: deprecated==3.0.0; python_full_version >= "3.12"
|
|
|
150
150
|
Requires-Dist: ecdsa==0.19.2
|
|
151
151
|
Requires-Dist: et-xmlfile==2.0.0
|
|
152
152
|
Requires-Dist: exceptiongroup==1.3.1; python_full_version < "3.11"
|
|
153
|
-
Requires-Dist: fastapi==0.
|
|
153
|
+
Requires-Dist: fastapi==0.143.0
|
|
154
154
|
Requires-Dist: fastcore==2.2.33
|
|
155
155
|
Requires-Dist: greenlet==3.5.6
|
|
156
156
|
Requires-Dist: h11==0.16.0
|
|
157
157
|
Requires-Dist: httpcore==1.0.9
|
|
158
158
|
Requires-Dist: httpcore2==2.13.1; sys_platform != "emscripten"
|
|
159
|
-
Requires-Dist: httptools==0.
|
|
159
|
+
Requires-Dist: httptools==0.9.0
|
|
160
160
|
Requires-Dist: httpx==0.28.1
|
|
161
161
|
Requires-Dist: httpx2==2.13.1
|
|
162
162
|
Requires-Dist: httpx2-jsfetch==1.0; python_full_version >= "3.12" and sys_platform == "emscripten"
|
|
@@ -167,21 +167,21 @@ Requires-Dist: mako==1.4.3
|
|
|
167
167
|
Requires-Dist: markupsafe==3.0.4
|
|
168
168
|
Requires-Dist: numpy==2.2.6; python_full_version < "3.11"
|
|
169
169
|
Requires-Dist: numpy==2.4.6; python_full_version == "3.11.*"
|
|
170
|
-
Requires-Dist: numpy==2.5.
|
|
170
|
+
Requires-Dist: numpy==2.5.4; python_full_version >= "3.12"
|
|
171
171
|
Requires-Dist: oauthlib==4.0.0
|
|
172
172
|
Requires-Dist: openpyxl==3.1.5
|
|
173
|
-
Requires-Dist: opentelemetry-api==1.45.
|
|
173
|
+
Requires-Dist: opentelemetry-api==1.45.1
|
|
174
174
|
Requires-Dist: packaging==26.3
|
|
175
175
|
Requires-Dist: passlib==1.7.4
|
|
176
176
|
Requires-Dist: pillow==12.3.0
|
|
177
177
|
Requires-Dist: psutil==7.2.2
|
|
178
178
|
Requires-Dist: psycopg2-binary==2.9.13
|
|
179
179
|
Requires-Dist: pyasn1==0.6.4
|
|
180
|
-
Requires-Dist: pycparser==3.
|
|
181
|
-
Requires-Dist: pydantic==2.
|
|
182
|
-
Requires-Dist: pydantic-core==2.
|
|
180
|
+
Requires-Dist: pycparser==3.11; implementation_name != "PyPy" and platform_python_implementation != "PyPy"
|
|
181
|
+
Requires-Dist: pydantic==2.14.1
|
|
182
|
+
Requires-Dist: pydantic-core==2.50.1
|
|
183
183
|
Requires-Dist: pydantic-settings==2.15.0
|
|
184
|
-
Requires-Dist: pypdf==6.
|
|
184
|
+
Requires-Dist: pypdf==6.20.0
|
|
185
185
|
Requires-Dist: python-barcode==0.16.1
|
|
186
186
|
Requires-Dist: python-dateutil==2.9.0.post0
|
|
187
187
|
Requires-Dist: python-dotenv==1.2.4
|
|
@@ -194,11 +194,12 @@ Requires-Dist: reportlab==5.0.1
|
|
|
194
194
|
Requires-Dist: rsa==4.9.1
|
|
195
195
|
Requires-Dist: six==1.17.0
|
|
196
196
|
Requires-Dist: slowapi==0.1.10
|
|
197
|
-
Requires-Dist: soupsieve==2.10
|
|
197
|
+
Requires-Dist: soupsieve==2.10; python_full_version < "3.11.5"
|
|
198
|
+
Requires-Dist: soupsieve==3.0.2; python_full_version >= "3.11.5"
|
|
198
199
|
Requires-Dist: sqlalchemy==2.0.54; python_full_version < "3.11"
|
|
199
|
-
Requires-Dist: sqlalchemy==2.1.
|
|
200
|
+
Requires-Dist: sqlalchemy==2.1.4; python_full_version >= "3.11"
|
|
200
201
|
Requires-Dist: starlette==1.7.0
|
|
201
|
-
Requires-Dist: tomli==2.
|
|
202
|
+
Requires-Dist: tomli==2.5.0; python_full_version < "3.11"
|
|
202
203
|
Requires-Dist: truststore==0.10.4; sys_platform != "emscripten"
|
|
203
204
|
Requires-Dist: typing-extensions==4.16.0
|
|
204
205
|
Requires-Dist: typing-inspection==0.4.4
|
|
@@ -300,7 +301,7 @@ card in the notifications panel.
|
|
|
300
301
|
- Connect Shopify, WooCommerce, QuickBooks, Xero
|
|
301
302
|
- Manufacturing - BOMs, production orders, merge/split/transform
|
|
302
303
|
- CRM - contacts, pipeline, memos, activity feed
|
|
303
|
-
- Recurring subscriptions
|
|
304
|
+
- Recurring subscriptions: generate each invoice or purchase order when it is due
|
|
304
305
|
- CSV import/export everything - idempotent, audited, column-mapped
|
|
305
306
|
- Multi-company from one install
|
|
306
307
|
- Role-based permissions - five access levels (viewer, operator, manager, admin, owner) for controlled employee access
|
|
@@ -329,7 +330,7 @@ Every business domain is a self-contained module. The full set ships with the do
|
|
|
329
330
|
| `celerp-docs` | Invoices, POs, quotations, credit notes, receipts |
|
|
330
331
|
| `celerp-accounting` | Chart of accounts, journal entries, P&L, balance sheet |
|
|
331
332
|
| `celerp-reports` | AR/AP aging, sales, purchases, inventory valuation |
|
|
332
|
-
| `celerp-subscriptions` | Recurring billing
|
|
333
|
+
| `celerp-subscriptions` | Recurring billing templates; generate each document when it is due |
|
|
333
334
|
| `celerp-manufacturing` | BOMs, production orders, merge/split/transform |
|
|
334
335
|
| `celerp-labels` | Label printing, barcode generation |
|
|
335
336
|
| `celerp-verticals` | Industry presets - configure for your business type on first run |
|
|
@@ -73,7 +73,7 @@ card in the notifications panel.
|
|
|
73
73
|
- Connect Shopify, WooCommerce, QuickBooks, Xero
|
|
74
74
|
- Manufacturing - BOMs, production orders, merge/split/transform
|
|
75
75
|
- CRM - contacts, pipeline, memos, activity feed
|
|
76
|
-
- Recurring subscriptions
|
|
76
|
+
- Recurring subscriptions: generate each invoice or purchase order when it is due
|
|
77
77
|
- CSV import/export everything - idempotent, audited, column-mapped
|
|
78
78
|
- Multi-company from one install
|
|
79
79
|
- Role-based permissions - five access levels (viewer, operator, manager, admin, owner) for controlled employee access
|
|
@@ -102,7 +102,7 @@ Every business domain is a self-contained module. The full set ships with the do
|
|
|
102
102
|
| `celerp-docs` | Invoices, POs, quotations, credit notes, receipts |
|
|
103
103
|
| `celerp-accounting` | Chart of accounts, journal entries, P&L, balance sheet |
|
|
104
104
|
| `celerp-reports` | AR/AP aging, sales, purchases, inventory valuation |
|
|
105
|
-
| `celerp-subscriptions` | Recurring billing
|
|
105
|
+
| `celerp-subscriptions` | Recurring billing templates; generate each document when it is due |
|
|
106
106
|
| `celerp-manufacturing` | BOMs, production orders, merge/split/transform |
|
|
107
107
|
| `celerp-labels` | Label printing, barcode generation |
|
|
108
108
|
| `celerp-verticals` | Industry presets - configure for your business type on first run |
|
|
@@ -58,8 +58,11 @@ INVENTORY_ORIGIN_SCHEMA = 1
|
|
|
58
58
|
# stock (celerp.services.lot_origin.in_stock). Only the system writes it.
|
|
59
59
|
ON_BOOKS_FIELD = "inventory_on_books"
|
|
60
60
|
|
|
61
|
+
# Settings > Accounting, which only those who manage accounting can use: a notice
|
|
62
|
+
# linking into it is listed with no link to anyone else (notifications.service.link_for).
|
|
63
|
+
ACCOUNTING_SETTINGS_PATH = "/settings/accounting"
|
|
61
64
|
# Where a user fixes a missing or invalid role.
|
|
62
|
-
POSTING_ACCOUNTS_PATH = "
|
|
65
|
+
POSTING_ACCOUNTS_PATH = f"{ACCOUNTING_SETTINGS_PATH}?tab=posting-accounts"
|
|
63
66
|
|
|
64
67
|
|
|
65
68
|
class AccountRole(StrEnum):
|
|
@@ -125,8 +125,6 @@ class Settings(BaseSettings):
|
|
|
125
125
|
|
|
126
126
|
# Cookie security — set True in prod (HTTPS); False allows HTTP in dev/CI
|
|
127
127
|
cookie_secure: bool = False
|
|
128
|
-
# Redis URL for distributed rate limiting; empty = per-process only
|
|
129
|
-
redis_url: str = "" # e.g. redis://localhost:6379/0
|
|
130
128
|
# Email: SMTP fallback for self-hosted installs.
|
|
131
129
|
# If GATEWAY_TOKEN is set, email routes through the cloud relay instead.
|
|
132
130
|
# If neither is configured, email notifications are silently skipped.
|
|
@@ -137,13 +135,6 @@ class Settings(BaseSettings):
|
|
|
137
135
|
smtp_from: str = ""
|
|
138
136
|
smtp_from_name: str = "Celerp" # Display name shown to recipients, e.g. "Acme ERP"
|
|
139
137
|
smtp_tls: bool = True
|
|
140
|
-
# Worker counts for multi-worker server deploys.
|
|
141
|
-
# api_workers: number of Uvicorn workers for the API process.
|
|
142
|
-
# gui_workers: number of Uvicorn workers for the GUI process.
|
|
143
|
-
# Electron builds always use 1/1 regardless of this setting.
|
|
144
|
-
api_workers: int = 2
|
|
145
|
-
gui_workers: int = 1
|
|
146
|
-
|
|
147
138
|
# GitHub-star CTA. The relay (celerp.com) is the single source of the count,
|
|
148
139
|
# tier ladder, and copy; the install only renders the relay's resolved CTA and
|
|
149
140
|
# falls back to a static neutral link when the relay is unreachable.
|
|
@@ -338,8 +338,10 @@ async def _record_lot_account(session, kwargs: dict, previous_state: dict | None
|
|
|
338
338
|
inventory account when it is booked as opening stock (lot_origin.draft_boundary,
|
|
339
339
|
lot_origin.recognize_opening_lots). Stock a migration brings in keeps the account its
|
|
340
340
|
source books held it in. Nothing else is guessed: a snapshot of another system's item
|
|
341
|
-
records none until its stock is placed
|
|
342
|
-
|
|
341
|
+
records none until its stock is placed, which the writer bringing it in does at once
|
|
342
|
+
(lot_origin.place_company_stock). Only a move changes it (lot_origin.
|
|
343
|
+
move_lot_accounts), and only from the account the mover read, so a move made on a stale
|
|
344
|
+
read is refused rather than applied over a later one; its entry moves the value with it."""
|
|
343
345
|
from celerp.accounting_roles import LOT_ACCOUNT_FIELD, refusal
|
|
344
346
|
from celerp.services.account_roles import source_lot_account
|
|
345
347
|
|
|
@@ -360,6 +362,12 @@ async def _record_lot_account(session, kwargs: dict, previous_state: dict | None
|
|
|
360
362
|
"inventory.account_already_recorded",
|
|
361
363
|
"This stock already records its inventory account."))
|
|
362
364
|
return
|
|
365
|
+
if kwargs["event_type"] == "item.inventory_account.moved":
|
|
366
|
+
if not current or current != data.get("from_account"):
|
|
367
|
+
raise HTTPException(status_code=409, detail=refusal(
|
|
368
|
+
"inventory.account_moved_since",
|
|
369
|
+
"This stock has moved to another inventory account since it was read. Reload and try again."))
|
|
370
|
+
return
|
|
363
371
|
changed = data.get("fields_changed")
|
|
364
372
|
if LOT_ACCOUNT_FIELD in data:
|
|
365
373
|
written = data[LOT_ACCOUNT_FIELD]
|
|
@@ -550,7 +558,8 @@ async def emit_event(
|
|
|
550
558
|
if kwargs["event_type"] == "acc.journal_entry.created":
|
|
551
559
|
from celerp.services.journal_accounts import prepare_journal_entry
|
|
552
560
|
|
|
553
|
-
await prepare_journal_entry(session, kwargs.get("company_id"), kwargs["data"]
|
|
561
|
+
await prepare_journal_entry(session, kwargs.get("company_id"), kwargs["data"],
|
|
562
|
+
restored=bool((kwargs.get("metadata_") or {}).get("restores")))
|
|
554
563
|
|
|
555
564
|
# Enforce the line rules on every document and List write. Extract the post-change
|
|
556
565
|
# line set by DATA SHAPE so every writer (create, patch, shared_import, update,
|
|
@@ -235,6 +235,7 @@ class ItemWrittenOff(BaseModel):
|
|
|
235
235
|
cost_total: float
|
|
236
236
|
reason: str | None = None
|
|
237
237
|
source_list_id: str | None = None
|
|
238
|
+
doc_number: str | None = None
|
|
238
239
|
|
|
239
240
|
|
|
240
241
|
class ItemReturnedToSupplier(BaseModel):
|
|
@@ -246,6 +247,13 @@ class ItemReturnedToSupplier(BaseModel):
|
|
|
246
247
|
consignment_flag: str | None = None
|
|
247
248
|
|
|
248
249
|
|
|
250
|
+
class ItemSupplierReturnUndone(BaseModel):
|
|
251
|
+
# The supplier credit note a return raised was voided: the goods that went back are in
|
|
252
|
+
# stock again, in the status they had before the return.
|
|
253
|
+
source_doc_id: str
|
|
254
|
+
restored_status: str
|
|
255
|
+
|
|
256
|
+
|
|
249
257
|
class ItemSplit(BaseModel):
|
|
250
258
|
# Aggregate marker on the MOTHER. The projection consumes child_ids/child_skus;
|
|
251
259
|
# children_detail drives the per-child history rows (one row per child).
|
|
@@ -351,8 +359,15 @@ class ItemCostAdjusted(BaseModel):
|
|
|
351
359
|
|
|
352
360
|
class ItemInventoryAccountRecorded(BaseModel):
|
|
353
361
|
# A lot from before lots recorded their inventory account: the account the upgrade
|
|
354
|
-
# placed it on
|
|
362
|
+
# placed it on. Only a lot with no account can take one.
|
|
363
|
+
inventory_account_code: str
|
|
364
|
+
|
|
365
|
+
|
|
366
|
+
class ItemInventoryAccountMoved(BaseModel):
|
|
367
|
+
# Older stock placed automatically, moved to another inventory account (or back, when
|
|
368
|
+
# the move is undone). Applied only while the lot is still on ``from_account``.
|
|
355
369
|
inventory_account_code: str
|
|
370
|
+
from_account: str
|
|
356
371
|
|
|
357
372
|
|
|
358
373
|
class ItemConsignorPayableRecorded(BaseModel):
|
|
@@ -908,6 +923,15 @@ class DocReturnReceived(BaseModel):
|
|
|
908
923
|
notes: str | None = None
|
|
909
924
|
|
|
910
925
|
|
|
926
|
+
class DocSupplierReturnUndone(BaseModel):
|
|
927
|
+
"""A return to the supplier undone by voiding the supplier credit note it raised: the
|
|
928
|
+
document holds the goods again and owes what the return took off it."""
|
|
929
|
+
return_key: str
|
|
930
|
+
supplier_credit_doc_id: str
|
|
931
|
+
payable_credit: float = 0.0
|
|
932
|
+
supplier_credit: float = 0.0
|
|
933
|
+
|
|
934
|
+
|
|
911
935
|
class DocReturnUndone(BaseModel):
|
|
912
936
|
undone_by: str
|
|
913
937
|
undone_at: str = ""
|
|
@@ -1204,6 +1228,39 @@ class SysMigrationApplied(BaseModel):
|
|
|
1204
1228
|
revision: str
|
|
1205
1229
|
|
|
1206
1230
|
|
|
1231
|
+
class SysOlderStockPlaced(BaseModel):
|
|
1232
|
+
# One placement of older stock (lot_origin._place): the account its lots were placed
|
|
1233
|
+
# on, what each inventory account held beyond its stock before (rooms), the value
|
|
1234
|
+
# moved onto the account, recognized as opening stock or left unresolved, the cost
|
|
1235
|
+
# invoices recognized on the lots before with no entry naming its account
|
|
1236
|
+
# (provisional), and the journal entries that booked it.
|
|
1237
|
+
placement: str
|
|
1238
|
+
day: str
|
|
1239
|
+
count: int
|
|
1240
|
+
value: float
|
|
1241
|
+
account: str
|
|
1242
|
+
rooms: dict[str, float]
|
|
1243
|
+
transferred: float
|
|
1244
|
+
recognized: float
|
|
1245
|
+
unresolved: float
|
|
1246
|
+
provisional: float
|
|
1247
|
+
classification: str
|
|
1248
|
+
journal: list[str]
|
|
1249
|
+
|
|
1250
|
+
|
|
1251
|
+
class SysOlderStockCorrected(BaseModel):
|
|
1252
|
+
# A correction of how a placement treated its difference (lot_origin.correct_placements):
|
|
1253
|
+
# ``amount`` booked onto the books (off them when negative), and what the placement
|
|
1254
|
+
# has recognized and left unresolved after it.
|
|
1255
|
+
placement: str
|
|
1256
|
+
kind: str
|
|
1257
|
+
day: str
|
|
1258
|
+
amount: float
|
|
1259
|
+
recognized: float
|
|
1260
|
+
unresolved: float
|
|
1261
|
+
journal: str
|
|
1262
|
+
|
|
1263
|
+
|
|
1207
1264
|
# Subscription schemas - open/permissive since subscription data is user-defined
|
|
1208
1265
|
class SubCreated(BaseModel):
|
|
1209
1266
|
model_config = {"extra": "allow"}
|
|
@@ -1348,6 +1405,7 @@ EVENT_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
|
1348
1405
|
"item.expired": ItemExpired,
|
|
1349
1406
|
"item.written_off": ItemWrittenOff,
|
|
1350
1407
|
"item.returned_to_supplier": ItemReturnedToSupplier,
|
|
1408
|
+
"item.supplier_return_undone": ItemSupplierReturnUndone,
|
|
1351
1409
|
"item.split": ItemSplit,
|
|
1352
1410
|
"item.split_from": ItemSplitFrom,
|
|
1353
1411
|
"item.transform": ItemTransform,
|
|
@@ -1361,6 +1419,7 @@ EVENT_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
|
1361
1419
|
"item.produced": ItemProduced,
|
|
1362
1420
|
"item.cost_adjusted": ItemCostAdjusted,
|
|
1363
1421
|
"item.inventory_account.recorded": ItemInventoryAccountRecorded,
|
|
1422
|
+
"item.inventory_account.moved": ItemInventoryAccountMoved,
|
|
1364
1423
|
"item.consignor_payable.recorded": ItemConsignorPayableRecorded,
|
|
1365
1424
|
"item.consignment.bought": ItemConsignmentBought,
|
|
1366
1425
|
"item.inventory_on_books.recorded": ItemInventoryOnBooksRecorded,
|
|
@@ -1447,6 +1506,7 @@ EVENT_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
|
1447
1506
|
"doc.items_returned": DocItemsReturned,
|
|
1448
1507
|
"doc.return_received": DocReturnReceived,
|
|
1449
1508
|
"doc.return_undone": DocReturnUndone,
|
|
1509
|
+
"doc.supplier_return_undone": DocSupplierReturnUndone,
|
|
1450
1510
|
"doc.receive_undone": DocReceiveUndone,
|
|
1451
1511
|
"doc.fulfillment_reversed": DocFulfillmentReversed,
|
|
1452
1512
|
|
|
@@ -1489,6 +1549,8 @@ EVENT_SCHEMA_MAP: dict[str, type[BaseModel]] = {
|
|
|
1489
1549
|
"sys.api_key.revoked": SysApiKeyRevoked,
|
|
1490
1550
|
"sys.backup.created": SysBackupCreated,
|
|
1491
1551
|
"sys.migration.applied": SysMigrationApplied,
|
|
1552
|
+
"sys.older_stock.placed": SysOlderStockPlaced,
|
|
1553
|
+
"sys.older_stock.corrected": SysOlderStockCorrected,
|
|
1492
1554
|
|
|
1493
1555
|
# Lists
|
|
1494
1556
|
"list.created": ListCreated,
|
|
@@ -17,6 +17,7 @@ class EventType(StrEnum):
|
|
|
17
17
|
ITEM_EXPIRED = "item.expired"
|
|
18
18
|
ITEM_WRITTEN_OFF = "item.written_off"
|
|
19
19
|
ITEM_RETURNED_TO_SUPPLIER = "item.returned_to_supplier"
|
|
20
|
+
ITEM_SUPPLIER_RETURN_UNDONE = "item.supplier_return_undone"
|
|
20
21
|
ITEM_SPLIT = "item.split"
|
|
21
22
|
ITEM_SPLIT_FROM = "item.split_from"
|
|
22
23
|
ITEM_TRANSFORM = "item.transform"
|
|
@@ -26,6 +27,7 @@ class EventType(StrEnum):
|
|
|
26
27
|
ITEM_PRODUCED = "item.produced"
|
|
27
28
|
ITEM_COST_ADJUSTED = "item.cost_adjusted"
|
|
28
29
|
ITEM_INVENTORY_ACCOUNT_RECORDED = "item.inventory_account.recorded"
|
|
30
|
+
ITEM_INVENTORY_ACCOUNT_MOVED = "item.inventory_account.moved"
|
|
29
31
|
ITEM_CONSIGNOR_PAYABLE_RECORDED = "item.consignor_payable.recorded"
|
|
30
32
|
ITEM_CONSIGNMENT_BOUGHT = "item.consignment.bought"
|
|
31
33
|
ITEM_INVENTORY_ON_BOOKS_RECORDED = "item.inventory_on_books.recorded"
|
|
@@ -80,6 +82,7 @@ class EventType(StrEnum):
|
|
|
80
82
|
DOC_CONVERTED = "doc.converted"
|
|
81
83
|
DOC_RECEIVED = "doc.received"
|
|
82
84
|
DOC_ITEMS_RETURNED = "doc.items_returned"
|
|
85
|
+
DOC_SUPPLIER_RETURN_UNDONE = "doc.supplier_return_undone"
|
|
83
86
|
DOC_FILE_ATTACHED = "doc.file_attached"
|
|
84
87
|
DOC_FILE_TAGGED = "doc.file_tagged"
|
|
85
88
|
DOC_FILE_DELETED = "doc.file_deleted"
|
|
@@ -137,3 +140,5 @@ class EventType(StrEnum):
|
|
|
137
140
|
SYS_API_KEY_REVOKED = "sys.api_key.revoked"
|
|
138
141
|
SYS_BACKUP_CREATED = "sys.backup.created"
|
|
139
142
|
SYS_MIGRATION_APPLIED = "sys.migration.applied"
|
|
143
|
+
SYS_OLDER_STOCK_PLACED = "sys.older_stock.placed"
|
|
144
|
+
SYS_OLDER_STOCK_CORRECTED = "sys.older_stock.corrected"
|
|
@@ -48,6 +48,9 @@ _REAP_GRACE = 5 * 60 # seconds
|
|
|
48
48
|
# socket is wedged (a stalled or backpressured peer). Bound every send so it surfaces as an
|
|
49
49
|
# error instead of pinning the proxy task holding a relay slot forever.
|
|
50
50
|
_SEND_DEADLINE = 30 # seconds
|
|
51
|
+
# Anonymous API-app pages a visitor opens from a link: shared documents and pay links.
|
|
52
|
+
# Matched on a segment boundary, so /payments or /shared-thing stay on the UI server.
|
|
53
|
+
_PUBLIC_API_PREFIXES = ("/share", "/pay")
|
|
51
54
|
|
|
52
55
|
|
|
53
56
|
class _SharedProxyTransport(httpx.AsyncHTTPTransport):
|
|
@@ -172,11 +175,11 @@ class GatewayClient:
|
|
|
172
175
|
/api/, which are UI-server endpoints (HTMX fragments, image/barcode
|
|
173
176
|
previews, item & bulk actions), NOT the internal data API. The API
|
|
174
177
|
server is an internal backend the UI calls server-side via api_client.
|
|
175
|
-
The
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
The exceptions are the anonymous API-app pages a visitor opens from a link
|
|
179
|
+
(_PUBLIC_API_PREFIXES): routed to the UI server they 404, so every shared
|
|
180
|
+
document and every pay link would be dead.
|
|
178
181
|
"""
|
|
179
|
-
if path ==
|
|
182
|
+
if any(path == p or path.startswith(p + "/") for p in _PUBLIC_API_PREFIXES):
|
|
180
183
|
return self._api_port
|
|
181
184
|
return self._ui_port
|
|
182
185
|
|
|
@@ -963,6 +966,15 @@ class GatewayClient:
|
|
|
963
966
|
# the same local app), but the original path is forwarded verbatim so the
|
|
964
967
|
# local server performs its own decoding.
|
|
965
968
|
port = self._local_port_for(policy_path)
|
|
969
|
+
# The local server takes a forwarding address from this machine as the visitor's,
|
|
970
|
+
# but the one the relay copies names an edge server or whatever the visitor typed.
|
|
971
|
+
# Without it every proxied visitor arrives from loopback, which names no one.
|
|
972
|
+
# The caller header is likewise trusted from loopback as the visitor the UI
|
|
973
|
+
# server names, so a visitor who sets it would choose whose sign-ins they spend.
|
|
974
|
+
from celerp.services.auth import CALLER_HEADER
|
|
975
|
+
|
|
976
|
+
dropped = {"x-forwarded-for", CALLER_HEADER.lower()}
|
|
977
|
+
headers = {k: v for k, v in headers.items() if k.lower() not in dropped}
|
|
966
978
|
|
|
967
979
|
url = f"http://127.0.0.1:{port}{raw_path}"
|
|
968
980
|
if query:
|
|
@@ -13,15 +13,14 @@ from fastapi import FastAPI, Request
|
|
|
13
13
|
from fastapi.encoders import jsonable_encoder
|
|
14
14
|
from fastapi.exceptions import RequestValidationError
|
|
15
15
|
from fastapi.responses import JSONResponse
|
|
16
|
-
from slowapi import Limiter, _rate_limit_exceeded_handler
|
|
17
16
|
from slowapi.errors import RateLimitExceeded
|
|
18
|
-
from slowapi.util import get_remote_address
|
|
19
17
|
|
|
20
18
|
from celerp import __version__, runtime as _runtime
|
|
21
19
|
_runtime.watch_supervisor_pipe()
|
|
22
20
|
from celerp.db import create_tables, engine, lifecycle_engine, mask_db_credentials
|
|
23
21
|
from celerp.inventory_codes import CodeConflictError
|
|
24
22
|
from celerp.projections.engine import UnhandledEventsError
|
|
23
|
+
from celerp.services.account_roles import PostingRoleError
|
|
25
24
|
from celerp.services.auto_je import UnbalancedJournalEntry
|
|
26
25
|
from celerp.config import settings, assert_secure_jwt, ensure_instance_id, load_cloud_config, load_backup_config
|
|
27
26
|
load_cloud_config()
|
|
@@ -43,7 +42,7 @@ from celerp.held_back import (
|
|
|
43
42
|
module_start_step,
|
|
44
43
|
unowned_error,
|
|
45
44
|
)
|
|
46
|
-
from celerp.middleware import DrainMiddleware, MaxBodySizeMiddleware, ModuleStartupMiddleware, RecoveryMaintenanceMiddleware, SecurityHeadersMiddleware, SlidingTokenRefreshMiddleware, log_unhandled_exception
|
|
45
|
+
from celerp.middleware import DrainMiddleware, MaxBodySizeMiddleware, ModuleStartupMiddleware, OlderStockMiddleware, RecoveryMaintenanceMiddleware, SecurityHeadersMiddleware, SlidingTokenRefreshMiddleware, log_unhandled_exception, notify_refused
|
|
47
46
|
from ui.i18n import I18nMiddleware, t
|
|
48
47
|
|
|
49
48
|
from celerp.routers import auth, companies, company_backup, ledger, migrations
|
|
@@ -641,9 +640,6 @@ async def _serve(_app: FastAPI, held):
|
|
|
641
640
|
logging.basicConfig(level=settings.log_level.upper())
|
|
642
641
|
log = logging.getLogger(__name__)
|
|
643
642
|
|
|
644
|
-
_storage_uri = settings.redis_url or "memory://"
|
|
645
|
-
limiter = Limiter(key_func=get_remote_address, default_limits=["60/minute"], storage_uri=_storage_uri)
|
|
646
|
-
|
|
647
643
|
_OPENAPI_TAGS = [
|
|
648
644
|
{"name": "auth", "description": "Authenticate users and manage sessions and access tokens."},
|
|
649
645
|
{"name": "companies", "description": "Manage companies, members, and roles."},
|
|
@@ -656,7 +652,7 @@ _OPENAPI_TAGS = [
|
|
|
656
652
|
{"name": "manufacturing", "description": "Manage bills of materials and production orders."},
|
|
657
653
|
{"name": "labels", "description": "Manage label templates, barcodes, and printing."},
|
|
658
654
|
{"name": "crm", "description": "Manage contacts, pipeline, and activity."},
|
|
659
|
-
{"name": "subscriptions", "description": "Manage recurring billing and
|
|
655
|
+
{"name": "subscriptions", "description": "Manage recurring billing templates and generate each document when it is due."},
|
|
660
656
|
{"name": "connectors", "description": "Configure and operate external integrations."},
|
|
661
657
|
{"name": "payments", "description": "Manage payment collection."},
|
|
662
658
|
{"name": "backup", "description": "Export and import Celerp data."},
|
|
@@ -703,8 +699,8 @@ def _openapi_settings() -> dict:
|
|
|
703
699
|
|
|
704
700
|
|
|
705
701
|
app = FastAPI(title="Celerp REST API", docs_url=None, redoc_url=None, lifespan=lifespan, **_openapi_settings())
|
|
706
|
-
|
|
707
|
-
app.
|
|
702
|
+
# Innermost, so a request it runs again passes every check below once more.
|
|
703
|
+
app.add_middleware(OlderStockMiddleware)
|
|
708
704
|
app.add_middleware(DrainMiddleware)
|
|
709
705
|
app.add_middleware(RecoveryMaintenanceMiddleware)
|
|
710
706
|
app.add_middleware(ModuleStartupMiddleware)
|
|
@@ -771,6 +767,19 @@ async def unhandled_events_handler(_request: Request, exc: UnhandledEventsError)
|
|
|
771
767
|
return JSONResponse(status_code=409, content={"detail": str(exc)})
|
|
772
768
|
|
|
773
769
|
|
|
770
|
+
@app.exception_handler(PostingRoleError)
|
|
771
|
+
async def posting_refused_handler(request: Request, exc: PostingRoleError):
|
|
772
|
+
# Those who manage accounting are notified of the roles refused (notify_refused);
|
|
773
|
+
# the refusal is returned whether or not that succeeds.
|
|
774
|
+
company_id = getattr(request.state, "company_id", None)
|
|
775
|
+
if company_id is not None:
|
|
776
|
+
try:
|
|
777
|
+
await notify_refused(company_id, [p["params"]["role"] for p in exc.detail["params"]["problems"]])
|
|
778
|
+
except Exception:
|
|
779
|
+
logging.getLogger(__name__).exception("Could not notify a refused posting")
|
|
780
|
+
return JSONResponse(status_code=exc.status_code, content={"detail": exc.detail}, headers=exc.headers)
|
|
781
|
+
|
|
782
|
+
|
|
774
783
|
@app.exception_handler(UnbalancedJournalEntry)
|
|
775
784
|
async def unbalanced_je_handler(_request: Request, exc: UnbalancedJournalEntry):
|
|
776
785
|
# An automatic journal entry that would not balance is refused, and the write that
|
|
@@ -6,8 +6,13 @@ from __future__ import annotations
|
|
|
6
6
|
import json
|
|
7
7
|
import logging
|
|
8
8
|
import time
|
|
9
|
+
from contextvars import ContextVar
|
|
10
|
+
from dataclasses import dataclass, field
|
|
9
11
|
from typing import Callable
|
|
10
12
|
|
|
13
|
+
from sqlalchemy import event
|
|
14
|
+
from sqlalchemy.engine import Engine
|
|
15
|
+
|
|
11
16
|
from starlette.requests import Request
|
|
12
17
|
from starlette.responses import JSONResponse, Response
|
|
13
18
|
from starlette.types import ASGIApp, Receive, Scope, Send
|
|
@@ -321,6 +326,156 @@ class DrainMiddleware:
|
|
|
321
326
|
await self.app(scope, receive, send)
|
|
322
327
|
|
|
323
328
|
|
|
329
|
+
class OlderStockMiddleware:
|
|
330
|
+
"""Run a write request once more after placing older stock it was refused for.
|
|
331
|
+
|
|
332
|
+
A request refused only because a lot it needs records no inventory account yet
|
|
333
|
+
(lot_origin.PLACEABLE_REFUSALS) has ended, rolled back, holding nothing. Its
|
|
334
|
+
company's stock is then placed the one way (lot_origin.place_unplaced_stock) in a
|
|
335
|
+
transaction of its own, and once none waits the request runs again, once, and its
|
|
336
|
+
answer is the one returned. Placing that cannot happen (a posting account or a
|
|
337
|
+
period lock holds it back, each with its own notice) returns the refusal as it was.
|
|
338
|
+
Only a writer marked lot_origin.rerun_after_placing runs again, as nothing it does
|
|
339
|
+
before such a refusal reaches outside the database; and not when it committed any
|
|
340
|
+
write before it was refused (_WRITES), so nothing it wrote is written twice. Any
|
|
341
|
+
other has its stock placed and its refusal returned. The company is the one the
|
|
342
|
+
request was authorised for (auth.get_auth_context)."""
|
|
343
|
+
|
|
344
|
+
_REFUSED = (409, 422)
|
|
345
|
+
|
|
346
|
+
def __init__(self, app: ASGIApp) -> None:
|
|
347
|
+
self.app = app
|
|
348
|
+
|
|
349
|
+
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
|
350
|
+
if scope["type"] != "http" or scope.get("method", "") not in _WRITE_METHODS:
|
|
351
|
+
await self.app(scope, receive, send)
|
|
352
|
+
return
|
|
353
|
+
body, more = [], True
|
|
354
|
+
while more:
|
|
355
|
+
message = await receive()
|
|
356
|
+
if message["type"] != "http.request":
|
|
357
|
+
return # the client went away before sending the request
|
|
358
|
+
body.append(message.get("body", b""))
|
|
359
|
+
more = message.get("more_body", False)
|
|
360
|
+
body = b"".join(body)
|
|
361
|
+
token = _WRITES.set(writes := _Writes())
|
|
362
|
+
try:
|
|
363
|
+
held = await self._run(scope, body, receive, send)
|
|
364
|
+
finally:
|
|
365
|
+
_WRITES.reset(token)
|
|
366
|
+
if held is None:
|
|
367
|
+
return
|
|
368
|
+
company_id = (scope.get("state") or {}).get("company_id")
|
|
369
|
+
if (company_id is not None and _placeable(held) and await _placed(company_id) and not writes.committed
|
|
370
|
+
and _reruns(scope)):
|
|
371
|
+
await self._run(scope, body, receive, send, hold=False)
|
|
372
|
+
return
|
|
373
|
+
for message in held:
|
|
374
|
+
await send(message)
|
|
375
|
+
|
|
376
|
+
async def _run(self, scope: Scope, body: bytes, receive: Receive, send: Send, *,
|
|
377
|
+
hold: bool = True) -> list[dict] | None:
|
|
378
|
+
"""Run the request on ``body``. A refusal is kept and returned instead of sent
|
|
379
|
+
when ``hold``; anything else is sent as it comes and None returned."""
|
|
380
|
+
sent = False
|
|
381
|
+
held: list[dict] = []
|
|
382
|
+
|
|
383
|
+
async def replay() -> dict:
|
|
384
|
+
nonlocal sent
|
|
385
|
+
if sent:
|
|
386
|
+
return await receive()
|
|
387
|
+
sent = True
|
|
388
|
+
return {"type": "http.request", "body": body, "more_body": False}
|
|
389
|
+
|
|
390
|
+
async def keep(message: dict) -> None:
|
|
391
|
+
if held or (hold and message["type"] == "http.response.start" and message["status"] in self._REFUSED):
|
|
392
|
+
held.append(message)
|
|
393
|
+
else:
|
|
394
|
+
await send(message)
|
|
395
|
+
|
|
396
|
+
await self.app(scope, replay, keep)
|
|
397
|
+
return held or None
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
@dataclass
|
|
401
|
+
class _Writes:
|
|
402
|
+
"""What a request run by OlderStockMiddleware wrote: the connections holding a write
|
|
403
|
+
not committed yet (by id), and whether any write was committed."""
|
|
404
|
+
pending: set[int] = field(default_factory=set)
|
|
405
|
+
committed: bool = False
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
# Set while OlderStockMiddleware runs a request the first time. A statement other than
|
|
409
|
+
# a read marks its connection, and that connection's commit marks the request as having
|
|
410
|
+
# kept a write, whether through a session's objects, a text or Core statement, or a
|
|
411
|
+
# connection of its own. A released savepoint is not a commit; a write inside one
|
|
412
|
+
# rolled back still counts, which only ever keeps a request from running again. Only
|
|
413
|
+
# the connection's identity is read, so a connection being invalidated is never touched.
|
|
414
|
+
_WRITES: ContextVar[_Writes | None] = ContextVar("older_stock_writes", default=None)
|
|
415
|
+
_READS = frozenset({"SELECT", "SHOW", "SAVEPOINT", "RELEASE", "ROLLBACK", "BEGIN", "COMMIT", "SET"})
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
@event.listens_for(Engine, "begin")
|
|
419
|
+
@event.listens_for(Engine, "rollback")
|
|
420
|
+
def _discarded(conn) -> None:
|
|
421
|
+
if (writes := _WRITES.get()) is not None:
|
|
422
|
+
writes.pending.discard(id(conn))
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
@event.listens_for(Engine, "after_cursor_execute")
|
|
426
|
+
def _executed(conn, _cursor, statement: str, _parameters, _context, _executemany) -> None:
|
|
427
|
+
writes = _WRITES.get()
|
|
428
|
+
if writes is not None and (statement.split(None, 1) or ["SELECT"])[0].upper() not in _READS:
|
|
429
|
+
writes.pending.add(id(conn))
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
@event.listens_for(Engine, "commit")
|
|
433
|
+
def _committed(conn) -> None:
|
|
434
|
+
if (writes := _WRITES.get()) is not None and id(conn) in writes.pending:
|
|
435
|
+
writes.pending.discard(id(conn))
|
|
436
|
+
writes.committed = True
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
def _reruns(scope: Scope) -> bool:
|
|
440
|
+
"""Whether the request's writer may run again (lot_origin.rerun_after_placing)."""
|
|
441
|
+
from celerp.services.lot_origin import RERUN_AFTER_PLACING
|
|
442
|
+
|
|
443
|
+
return getattr(scope.get("endpoint"), RERUN_AFTER_PLACING, False)
|
|
444
|
+
|
|
445
|
+
|
|
446
|
+
def _placeable(held: list[dict]) -> bool:
|
|
447
|
+
"""Whether a held refusal is one placing older stock can lift."""
|
|
448
|
+
from celerp.services.lot_origin import PLACEABLE_REFUSALS
|
|
449
|
+
|
|
450
|
+
try:
|
|
451
|
+
detail = json.loads(b"".join(m.get("body", b"") for m in held[1:])).get("detail")
|
|
452
|
+
except (ValueError, AttributeError):
|
|
453
|
+
return False
|
|
454
|
+
return isinstance(detail, dict) and detail.get("message_key") in PLACEABLE_REFUSALS
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
async def _placed(company_id) -> bool:
|
|
458
|
+
from celerp.services.lot_origin import place_unplaced_stock
|
|
459
|
+
|
|
460
|
+
async with get_session_ctx() as session:
|
|
461
|
+
await session.rollback() # nothing of the refused request is kept
|
|
462
|
+
placed = await place_unplaced_stock(session, company_id)
|
|
463
|
+
await session.commit()
|
|
464
|
+
return placed
|
|
465
|
+
|
|
466
|
+
|
|
467
|
+
async def notify_refused(company_id, roles: list[str]) -> None:
|
|
468
|
+
"""A posting was refused because ``roles`` have no account that can take it. The
|
|
469
|
+
refused request has rolled back, so those who manage accounting are notified in a
|
|
470
|
+
transaction of its own (posting_readiness.notify_unmapped)."""
|
|
471
|
+
from celerp.services.posting_readiness import notify_unmapped
|
|
472
|
+
|
|
473
|
+
async with get_session_ctx() as session:
|
|
474
|
+
await session.rollback()
|
|
475
|
+
await notify_unmapped(session, company_id, roles)
|
|
476
|
+
await session.commit()
|
|
477
|
+
|
|
478
|
+
|
|
324
479
|
# The anonymous liveness probes, matched exactly: the only routes an unfinished
|
|
325
480
|
# System Recovery still serves. Readiness is refused until the recovery converges,
|
|
326
481
|
# so nothing routes traffic to an installation that answers only 503s. Never a
|