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.
Files changed (837) hide show
  1. {celerp-2.5.4 → celerp-2.5.6}/PKG-INFO +16 -15
  2. {celerp-2.5.4 → celerp-2.5.6}/README.md +2 -2
  3. {celerp-2.5.4 → celerp-2.5.6}/celerp/accounting_roles.py +4 -1
  4. {celerp-2.5.4 → celerp-2.5.6}/celerp/config.py +0 -9
  5. {celerp-2.5.4 → celerp-2.5.6}/celerp/events/engine.py +12 -3
  6. {celerp-2.5.4 → celerp-2.5.6}/celerp/events/schemas.py +63 -1
  7. {celerp-2.5.4 → celerp-2.5.6}/celerp/events/types.py +5 -0
  8. {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/client.py +16 -4
  9. {celerp-2.5.4 → celerp-2.5.6}/celerp/main.py +18 -9
  10. {celerp-2.5.4 → celerp-2.5.6}/celerp/middleware.py +155 -0
  11. {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/service.py +23 -0
  12. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/doc_print.py +2 -1
  13. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/pdf.py +2 -0
  14. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/engine.py +9 -4
  15. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/system.py +5 -0
  16. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/auth.py +40 -18
  17. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/companies.py +11 -18
  18. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/company_backup.py +6 -5
  19. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/migrations.py +4 -2
  20. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/notifications.py +7 -3
  21. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/account_roles.py +81 -10
  22. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/auth.py +132 -0
  23. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/auto_je.py +412 -86
  24. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup.py +104 -32
  25. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_export.py +19 -20
  26. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_repo.py +76 -57
  27. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cogs_backfill.py +3 -3
  28. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_backup.py +28 -16
  29. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_settings.py +4 -1
  30. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/doc_balance.py +13 -0
  31. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/document_lines.py +8 -3
  32. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/journal_accounts.py +5 -3
  33. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/list_behavior.py +68 -2
  34. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/locations.py +12 -0
  35. celerp-2.5.6/celerp/services/lot_origin.py +2214 -0
  36. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migrations.py +4 -1
  37. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/posting_readiness.py +71 -28
  38. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/pricing.py +12 -0
  39. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/reorder.py +15 -13
  40. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/terms.py +1 -1
  41. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/update.py +1 -4
  42. {celerp-2.5.4 → celerp-2.5.6}/celerp/tax_regimes.py +78 -0
  43. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/PKG-INFO +16 -15
  44. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/SOURCES.txt +3 -0
  45. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/requires.txt +17 -12
  46. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/scm_file_list.json +31 -1
  47. {celerp-2.5.4 → celerp-2.5.6}/conftest.py +3 -4
  48. {celerp-2.5.4 → celerp-2.5.6}/constraints.txt +14 -12
  49. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/chart_rules.py +29 -4
  50. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/routes.py +265 -68
  51. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +1 -1
  52. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +1 -1
  53. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +1 -1
  54. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +1 -1
  55. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal.html +1 -1
  56. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +1 -1
  57. celerp-2.5.6/default_modules/celerp-accounting/tests/report_goldens/opening-tie-out.html +98 -0
  58. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +1 -1
  59. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/statement.html +1 -1
  60. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +1 -1
  61. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +11 -1
  62. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +23 -0
  63. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_locked_reversal_party.py +1 -1
  64. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +16 -0
  65. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_route_permissions.py +1 -0
  66. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/routes.py +124 -43
  67. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_router.py +0 -2
  68. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -2
  69. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/__init__.py +1 -0
  70. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/consignment_buy.py +6 -4
  71. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_constants.py +19 -12
  72. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_money.py +10 -0
  73. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_projections.py +27 -4
  74. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_service.py +5 -5
  75. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/import_service.py +12 -2
  76. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes.py +891 -280
  77. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/sequences.py +1 -0
  78. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_audits.py +30 -27
  79. celerp-2.5.6/default_modules/celerp-docs/tests/test_doc_scan.py +1068 -0
  80. celerp-2.5.6/default_modules/celerp-docs/tests/test_doc_scan_concurrency.py +166 -0
  81. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_outcome_concurrency.py +6 -6
  82. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_quantity_integrity.py +6 -10
  83. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_reprice.py +1 -1
  84. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/projections.py +25 -2
  85. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/routes.py +3 -180
  86. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/services.py +176 -3
  87. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_import_service.py +1 -1
  88. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/routes.py +58 -134
  89. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/tests/test_reports_unit.py +62 -0
  90. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/__init__.py +1 -1
  91. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +5 -2
  92. {celerp-2.5.4 → celerp-2.5.6}/default_modules/first_party.lock.json +7 -7
  93. {celerp-2.5.4 → celerp-2.5.6}/pyproject.toml +13 -12
  94. {celerp-2.5.4 → celerp-2.5.6}/stock_books.py +16 -5
  95. {celerp-2.5.4 → celerp-2.5.6}/test_helpers.py +21 -0
  96. {celerp-2.5.4 → celerp-2.5.6}/ui/api_client.py +96 -10
  97. {celerp-2.5.4 → celerp-2.5.6}/ui/app.py +5 -0
  98. {celerp-2.5.4 → celerp-2.5.6}/ui/components/activity.py +38 -12
  99. {celerp-2.5.4 → celerp-2.5.6}/ui/components/files.py +2 -2
  100. {celerp-2.5.4 → celerp-2.5.6}/ui/components/shell.py +7 -2
  101. {celerp-2.5.4 → celerp-2.5.6}/ui/components/table.py +68 -13
  102. {celerp-2.5.4 → celerp-2.5.6}/ui/i18n.py +1 -0
  103. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/am.json +252 -29
  104. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/ar.json +253 -30
  105. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/de.json +252 -29
  106. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/en.json +252 -29
  107. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/es.json +1268 -1045
  108. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/fr.json +252 -29
  109. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/id.json +253 -30
  110. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/it.json +252 -29
  111. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/ja.json +253 -30
  112. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/pt.json +255 -32
  113. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/th.json +253 -30
  114. {celerp-2.5.4 → celerp-2.5.6}/ui/locales/vi.json +254 -31
  115. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/contacts.py +1 -1
  116. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/dashboard.py +77 -11
  117. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/docs_import.py +6 -0
  118. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/documents.py +312 -328
  119. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/financial_reports.py +143 -3
  120. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/inventory.py +16 -18
  121. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/manufacturing.py +2 -3
  122. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/reports.py +26 -31
  123. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/search.py +8 -7
  124. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings.py +1 -0
  125. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_accounting.py +420 -66
  126. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/subscriptions.py +4 -4
  127. {celerp-2.5.4 → celerp-2.5.6}/ui/static/app.css +9 -2
  128. celerp-2.5.4/celerp/services/lot_origin.py +0 -1093
  129. {celerp-2.5.4 → celerp-2.5.6}/CLA.md +0 -0
  130. {celerp-2.5.4 → celerp-2.5.6}/CONTRIBUTING.md +0 -0
  131. {celerp-2.5.4 → celerp-2.5.6}/LICENSE +0 -0
  132. {celerp-2.5.4 → celerp-2.5.6}/LICENSING.md +0 -0
  133. {celerp-2.5.4 → celerp-2.5.6}/MANIFEST.in +0 -0
  134. {celerp-2.5.4 → celerp-2.5.6}/NOTICE +0 -0
  135. {celerp-2.5.4 → celerp-2.5.6}/SECURITY.md +0 -0
  136. {celerp-2.5.4 → celerp-2.5.6}/alembic.ini +0 -0
  137. {celerp-2.5.4 → celerp-2.5.6}/celerp/__init__.py +0 -0
  138. {celerp-2.5.4 → celerp-2.5.6}/celerp/__main__.py +0 -0
  139. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/__init__.py +0 -0
  140. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/batch.py +0 -0
  141. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/cleanup.py +0 -0
  142. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/conversations.py +0 -0
  143. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/files.py +0 -0
  144. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/intent.py +0 -0
  145. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/llm.py +0 -0
  146. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/memory.py +0 -0
  147. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/models.py +0 -0
  148. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/page_count.py +0 -0
  149. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/quota.py +0 -0
  150. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/service.py +0 -0
  151. {celerp-2.5.4 → celerp-2.5.6}/celerp/ai/tools.py +0 -0
  152. {celerp-2.5.4 → celerp-2.5.6}/celerp/alembic.ini +0 -0
  153. {celerp-2.5.4 → celerp-2.5.6}/celerp/alembic_config.py +0 -0
  154. {celerp-2.5.4 → celerp-2.5.6}/celerp/capacity.py +0 -0
  155. {celerp-2.5.4 → celerp-2.5.6}/celerp/cli.py +0 -0
  156. {celerp-2.5.4 → celerp-2.5.6}/celerp/compat.py +0 -0
  157. {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/__init__.py +0 -0
  158. {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/aggregations.py +0 -0
  159. {celerp-2.5.4 → celerp-2.5.6}/celerp/compute/valuation.py +0 -0
  160. {celerp-2.5.4 → celerp-2.5.6}/celerp/config_store.py +0 -0
  161. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/__init__.py +0 -0
  162. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/base.py +0 -0
  163. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/daily_scheduler.py +0 -0
  164. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/http.py +0 -0
  165. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/images.py +0 -0
  166. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/outbound_queue.py +0 -0
  167. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/ownership.py +0 -0
  168. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/quickbooks.py +0 -0
  169. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/registry.py +0 -0
  170. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/relay_token.py +0 -0
  171. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/remote_state.py +0 -0
  172. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/shopify.py +0 -0
  173. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/sync_runner.py +0 -0
  174. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/upsert.py +0 -0
  175. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/util.py +0 -0
  176. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/webhooks.py +0 -0
  177. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/woocommerce.py +0 -0
  178. {celerp-2.5.4 → celerp-2.5.6}/celerp/connectors/xero.py +0 -0
  179. {celerp-2.5.4 → celerp-2.5.6}/celerp/constants.py +0 -0
  180. {celerp-2.5.4 → celerp-2.5.6}/celerp/credentials.py +0 -0
  181. {celerp-2.5.4 → celerp-2.5.6}/celerp/db.py +0 -0
  182. {celerp-2.5.4 → celerp-2.5.6}/celerp/db_catalog.py +0 -0
  183. {celerp-2.5.4 → celerp-2.5.6}/celerp/db_url.py +0 -0
  184. {celerp-2.5.4 → celerp-2.5.6}/celerp/desktop_child.py +0 -0
  185. {celerp-2.5.4 → celerp-2.5.6}/celerp/embedded_pg.py +0 -0
  186. {celerp-2.5.4 → celerp-2.5.6}/celerp/entitlement_preflight.py +0 -0
  187. {celerp-2.5.4 → celerp-2.5.6}/celerp/events/__init__.py +0 -0
  188. {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/__init__.py +0 -0
  189. {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/bootstrap.py +0 -0
  190. {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/fixtures/entitlement_flags_fixture.json +0 -0
  191. {celerp-2.5.4 → celerp-2.5.6}/celerp/gateway/state.py +0 -0
  192. {celerp-2.5.4 → celerp-2.5.6}/celerp/held_back.py +0 -0
  193. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/__init__.py +0 -0
  194. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/__init__.py +0 -0
  195. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/base.py +0 -0
  196. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/__init__.py +0 -0
  197. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/adapter.py +0 -0
  198. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/attachments.py +0 -0
  199. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/book.py +0 -0
  200. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/fields.py +0 -0
  201. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/ledger.py +0 -0
  202. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/mappings.py +0 -0
  203. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/protobuf.py +0 -0
  204. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/reconcile.py +0 -0
  205. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/sqlite_reader.py +0 -0
  206. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/manager_io/types.py +0 -0
  207. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/adapters/registry.py +0 -0
  208. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/importer.py +0 -0
  209. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/results.py +0 -0
  210. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sample/__init__.py +0 -0
  211. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sample/sample.manager +0 -0
  212. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/schema.py +0 -0
  213. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/sinks.py +0 -0
  214. {celerp-2.5.4 → celerp-2.5.6}/celerp/importers/tabular.py +0 -0
  215. {celerp-2.5.4 → celerp-2.5.6}/celerp/inventory_codes.py +0 -0
  216. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/README.md +0 -0
  217. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_auto_stamp.py +0 -0
  218. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_data_reconcile.py +0 -0
  219. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/_json_compat.py +0 -0
  220. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/compatibility.py +0 -0
  221. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/env.py +0 -0
  222. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/script.py.mako +0 -0
  223. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
  224. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
  225. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
  226. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
  227. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
  228. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/bc0d1e2f3a4b_barcode_unique_index.py +0 -0
  229. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
  230. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
  231. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
  232. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c7f1a2b3d4e5_seed_cash_flow_sections.py +0 -0
  233. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/c9d8e7f6a5b4_seed_shrinkage_writeoff_account.py +0 -0
  234. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
  235. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d1e2f3a4b5c6_rfid_epc_unique_index.py +0 -0
  236. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
  237. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
  238. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/d8e9f0a1b2c3_notification_i18n.py +0 -0
  239. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
  240. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
  241. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
  242. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/e9f0a1b2c3d4_account_code_generated.py +0 -0
  243. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
  244. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f3a4b5c6d7e8_purge_session_registry.py +0 -0
  245. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
  246. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
  247. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
  248. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
  249. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/g4b5c6d7e8f9_add_install_owner.py +0 -0
  250. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
  251. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/h5c6d7e8f9a0_backfill_install_owner.py +0 -0
  252. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/i6d7e8f9a0b1_add_sync_run_attention.py +0 -0
  253. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
  254. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/j7e8f9a0b1c2_add_connector_sources.py +0 -0
  255. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
  256. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/k8f9a0b1c2d3_drop_physical_code_unique_indexes.py +0 -0
  257. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
  258. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/l9a0b1c2d3e4_fold_list_contact_fields.py +0 -0
  259. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/m0b1c2d3e4f5_migration_runs.py +0 -0
  260. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
  261. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/n1c2d3e4f5a6_migration_lock_date_and_attachment_tasks.py +0 -0
  262. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
  263. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/o2d3e4f5a6b7_add_import_batch_operation_key.py +0 -0
  264. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
  265. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
  266. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/p3e4f5a6b7c8_session_registry_company.py +0 -0
  267. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
  268. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/q4f5a6b7c8d9_payment_closures.py +0 -0
  269. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
  270. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/r5g6b7c8d9e0_unmatched_payment_paid_at.py +0 -0
  271. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
  272. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/s6h7c8d9e0f1_unmatched_refunds.py +0 -0
  273. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
  274. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/t7i8j9k0l1m2_company_modules_from_2_5.py +0 -0
  275. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
  276. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/u8j9k0l1m2n3_unmatched_payment_recorded_on.py +0 -0
  277. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/v0m1n2o3p4q5_import_batch_reversible.py +0 -0
  278. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
  279. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/w1n2o3p4q5r6_notification_reads.py +0 -0
  280. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
  281. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
  282. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
  283. {celerp-2.5.4 → celerp-2.5.6}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
  284. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/__init__.py +0 -0
  285. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/accounting.py +0 -0
  286. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/ai.py +0 -0
  287. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/auth.py +0 -0
  288. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/base.py +0 -0
  289. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/company.py +0 -0
  290. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/connector_config.py +0 -0
  291. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/connector_source.py +0 -0
  292. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/import_batch.py +0 -0
  293. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/ledger.py +0 -0
  294. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/marketplace.py +0 -0
  295. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/migration.py +0 -0
  296. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/notification.py +0 -0
  297. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/payment_closure.py +0 -0
  298. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/projections.py +0 -0
  299. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/share.py +0 -0
  300. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/supporter.py +0 -0
  301. {celerp-2.5.4 → celerp-2.5.6}/celerp/models/sync_run.py +0 -0
  302. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/__init__.py +0 -0
  303. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/api.py +0 -0
  304. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/audit.py +0 -0
  305. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/demotion.py +0 -0
  306. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/importer.py +0 -0
  307. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/license.py +0 -0
  308. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/loader.py +0 -0
  309. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/marketplace_stage.py +0 -0
  310. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/meta.py +0 -0
  311. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/migrations_runner.py +0 -0
  312. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/outcome.py +0 -0
  313. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/references.py +0 -0
  314. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/registry.py +0 -0
  315. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/requirements.py +0 -0
  316. {celerp-2.5.4 → celerp-2.5.6}/celerp/modules/slots.py +0 -0
  317. {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/__init__.py +0 -0
  318. {celerp-2.5.4 → celerp-2.5.6}/celerp/notifications/sse.py +0 -0
  319. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/__init__.py +0 -0
  320. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/branding.py +0 -0
  321. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/document_context.py +0 -0
  322. {celerp-2.5.4 → celerp-2.5.6}/celerp/output/share_render.py +0 -0
  323. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/__init__.py +0 -0
  324. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/__init__.py +0 -0
  325. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/marketplace.py +0 -0
  326. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/handlers/shopify.py +0 -0
  327. {celerp-2.5.4 → celerp-2.5.6}/celerp/projections/retired.py +0 -0
  328. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/__init__.py +0 -0
  329. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/attachments.py +0 -0
  330. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/debug.py +0 -0
  331. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/events.py +0 -0
  332. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/health.py +0 -0
  333. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/ledger.py +0 -0
  334. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/search.py +0 -0
  335. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/stars.py +0 -0
  336. {celerp-2.5.4 → celerp-2.5.6}/celerp/routers/system.py +0 -0
  337. {celerp-2.5.4 → celerp-2.5.6}/celerp/runtime.py +0 -0
  338. {celerp-2.5.4 → celerp-2.5.6}/celerp/schemas/__init__.py +0 -0
  339. {celerp-2.5.4 → celerp-2.5.6}/celerp/schemas/numbers.py +0 -0
  340. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/__init__.py +0 -0
  341. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/activity_redaction.py +0 -0
  342. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/app_paths.py +0 -0
  343. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/attachments.py +0 -0
  344. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/background.py +0 -0
  345. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_import.py +0 -0
  346. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_scheduler.py +0 -0
  347. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/backup_state.py +0 -0
  348. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/bootstrap.py +0 -0
  349. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/business_time.py +0 -0
  350. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/business_type.py +0 -0
  351. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cloud_entitlement.py +0 -0
  352. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_backup_files.py +0 -0
  353. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_files.py +0 -0
  354. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_lifecycle.py +0 -0
  355. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_lock.py +0 -0
  356. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/company_reset.py +0 -0
  357. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/cost_visibility.py +0 -0
  358. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/csv_export.py +0 -0
  359. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/currencies.py +0 -0
  360. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/demo.py +0 -0
  361. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/dev_release_guard.py +0 -0
  362. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/email.py +0 -0
  363. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/field_schema.py +0 -0
  364. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/fulfill.py +0 -0
  365. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/goods_cost.py +0 -0
  366. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/holdings.py +0 -0
  367. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/import_stage.py +0 -0
  368. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/item_erasure.py +0 -0
  369. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/je_keys.py +0 -0
  370. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/landed_cost.py +0 -0
  371. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/ledger_display.py +0 -0
  372. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/line_measures.py +0 -0
  373. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migration_core_sink.py +0 -0
  374. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/migration_scan_store.py +0 -0
  375. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/money.py +0 -0
  376. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/outbound_url.py +0 -0
  377. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/payment_terms.py +0 -0
  378. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/payments.py +0 -0
  379. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/permissions.py +0 -0
  380. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/physical_codes.py +0 -0
  381. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/pick.py +0 -0
  382. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/posting_dates.py +0 -0
  383. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/provisioning.py +0 -0
  384. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/relay_share.py +0 -0
  385. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/runtime_state.py +0 -0
  386. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/session_tracker.py +0 -0
  387. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/shipping.py +0 -0
  388. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/staged_downloads.py +0 -0
  389. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/star_cta.py +0 -0
  390. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/starter_modules.py +0 -0
  391. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/status_doc_backfill.py +0 -0
  392. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/supporter_badge.py +0 -0
  393. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/system_health.py +0 -0
  394. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/units.py +0 -0
  395. {celerp-2.5.4 → celerp-2.5.6}/celerp/services/vertical_presets.py +0 -0
  396. {celerp-2.5.4 → celerp-2.5.6}/celerp/session_gate.py +0 -0
  397. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/dependency_links.txt +0 -0
  398. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/entry_points.txt +0 -0
  399. {celerp-2.5.4 → celerp-2.5.6}/celerp.egg-info/top_level.txt +0 -0
  400. {celerp-2.5.4 → celerp-2.5.6}/conftest_support.py +0 -0
  401. {celerp-2.5.4 → celerp-2.5.6}/default_modules/__init__.py +0 -0
  402. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/LICENSE +0 -0
  403. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/__init__.py +0 -0
  404. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
  405. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/account_tree.py +0 -0
  406. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
  407. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
  408. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/import_service.py +0 -0
  409. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/ledger_accounts.py +0 -0
  410. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
  411. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/migration_sink.py +0 -0
  412. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
  413. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
  414. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/search.py +0 -0
  415. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
  416. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
  417. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
  418. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
  419. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
  420. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_account_mutation_rules.py +0 -0
  421. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
  422. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +0 -0
  423. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +0 -0
  424. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +0 -0
  425. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_bank_chart_accounts.py +0 -0
  426. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_cash_flow.py +0 -0
  427. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_chart_import_batch.py +0 -0
  428. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_account_boundary.py +0 -0
  429. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
  430. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_agent.py +0 -0
  431. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_line_attachments.py +0 -0
  432. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_opening_balance.py +0 -0
  433. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
  434. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/__init__.py +0 -0
  435. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
  436. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
  437. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/__init__.py +0 -0
  438. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
  439. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/routes.py +0 -0
  440. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
  441. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/celerp_ai/ui_routes.py +0 -0
  442. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/_fixtures.py +0 -0
  443. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/conftest.py +0 -0
  444. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_agent_loop.py +0 -0
  445. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_batch.py +0 -0
  446. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
  447. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_commercial_routing.py +0 -0
  448. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_confirm_race_pg.py +0 -0
  449. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_conversations.py +0 -0
  450. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -0
  451. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_intent.py +0 -0
  452. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_live_agent.py +0 -0
  453. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_llm.py +0 -0
  454. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_memory.py +0 -0
  455. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_models.py +0 -0
  456. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_page_count.py +0 -0
  457. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_quota.py +0 -0
  458. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_showcase_claims.py +0 -0
  459. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_ui_routes.py +0 -0
  460. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-ai/tests/test_workflows.py +0 -0
  461. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/__init__.py +0 -0
  462. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
  463. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/routes.py +0 -0
  464. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
  465. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/__init__.py +0 -0
  466. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
  467. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
  468. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
  469. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/__init__.py +0 -0
  470. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/conftest.py +0 -0
  471. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
  472. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
  473. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
  474. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
  475. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_images.py +0 -0
  476. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
  477. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
  478. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
  479. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
  480. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
  481. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
  482. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
  483. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
  484. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/LICENSE +0 -0
  485. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/__init__.py +0 -0
  486. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
  487. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/migration_sink.py +0 -0
  488. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/migrations.py +0 -0
  489. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
  490. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/references.py +0 -0
  491. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/routes.py +0 -0
  492. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/search.py +0 -0
  493. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
  494. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
  495. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/LICENSE +0 -0
  496. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/__init__.py +0 -0
  497. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
  498. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +0 -0
  499. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
  500. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-dashboard/celerp_dashboard/ui_routes.py +0 -0
  501. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/LICENSE +0 -0
  502. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
  503. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/api_setup.py +0 -0
  504. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
  505. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/historical_lots.py +0 -0
  506. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/imported_cutover.py +0 -0
  507. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/legacy_credit_notes.py +0 -0
  508. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/legacy_receipts.py +0 -0
  509. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/migration_sink.py +0 -0
  510. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
  511. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/received.py +0 -0
  512. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/received_legacy.py +0 -0
  513. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes_payments.py +0 -0
  514. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/routes_share.py +0 -0
  515. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/search.py +0 -0
  516. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/taxes.py +0 -0
  517. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
  518. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/conftest.py +0 -0
  519. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_bulk_payment_alloc_lock.py +0 -0
  520. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_cogs_lifecycle_concurrency.py +0 -0
  521. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_consolidate_lots.py +0 -0
  522. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_reference_lifecycle.py +0 -0
  523. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_selection.py +0 -0
  524. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_contact_write_doors.py +0 -0
  525. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_cross_lot_settlement.py +0 -0
  526. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_freight_je.py +0 -0
  527. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_freight_lines.py +0 -0
  528. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +0 -0
  529. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +0 -0
  530. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_historical_receipt.py +0 -0
  531. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +0 -0
  532. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +0 -0
  533. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_landed_receive.py +0 -0
  534. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_delete_persist.py +0 -0
  535. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_identifier.py +0 -0
  536. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_line_page_patch_truncate.py +0 -0
  537. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_concurrency.py +0 -0
  538. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_contact_currency.py +0 -0
  539. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_contact_reference.py +0 -0
  540. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_ids_filter.py +0 -0
  541. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_page_no_full_state.py +0 -0
  542. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_query_pushdown.py +0 -0
  543. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_list_sell_by_and_reference.py +0 -0
  544. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close.py +0 -0
  545. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close_projection.py +0 -0
  546. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_close_review_fixes.py +0 -0
  547. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_lifecycle_concurrency.py +0 -0
  548. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_line_labels.py +0 -0
  549. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_memo_unfulfilled_filter.py +0 -0
  550. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_online_deposit_account_refusal.py +0 -0
  551. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_payment_void_activity.py +0 -0
  552. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +0 -0
  553. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_received_concurrency.py +0 -0
  554. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_send_visibility.py +0 -0
  555. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_service_lines.py +0 -0
  556. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_sold_label_ordering.py +0 -0
  557. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_void_guards.py +0 -0
  558. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-docs/tests/test_writeoffs.py +0 -0
  559. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/LICENSE +0 -0
  560. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/__init__.py +0 -0
  561. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
  562. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/migration_sink.py +0 -0
  563. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
  564. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
  565. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/search.py +0 -0
  566. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
  567. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_import_agent_routes.py +0 -0
  568. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
  569. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
  570. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +0 -0
  571. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-inventory/tests/test_physical_mutation_concurrency.py +0 -0
  572. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/LICENSE +0 -0
  573. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/__init__.py +0 -0
  574. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
  575. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/am.json +0 -0
  576. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/ar.json +0 -0
  577. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/de.json +0 -0
  578. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/en.json +0 -0
  579. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/es.json +0 -0
  580. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/fr.json +0 -0
  581. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/id.json +0 -0
  582. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/it.json +0 -0
  583. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/ja.json +0 -0
  584. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/pt.json +0 -0
  585. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/th.json +0 -0
  586. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/locales/vi.json +0 -0
  587. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
  588. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
  589. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/routes.py +0 -0
  590. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
  591. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/celerp_labels/ui_routes.py +0 -0
  592. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/tests/test_labels.py +0 -0
  593. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
  594. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/LICENSE +0 -0
  595. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/__init__.py +0 -0
  596. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
  597. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
  598. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
  599. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
  600. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
  601. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/movements.py +0 -0
  602. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
  603. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +0 -0
  604. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/run_events.py +0 -0
  605. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/search.py +0 -0
  606. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
  607. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +0 -0
  608. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +0 -0
  609. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_build_api.py +0 -0
  610. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_bulk_run_atomicity.py +0 -0
  611. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_completion_lock_order.py +0 -0
  612. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +0 -0
  613. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +0 -0
  614. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
  615. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +0 -0
  616. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +0 -0
  617. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +0 -0
  618. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +0 -0
  619. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
  620. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_mfg_route_permissions.py +0 -0
  621. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +0 -0
  622. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_production_order.py +0 -0
  623. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
  624. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
  625. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_recost_api.py +0 -0
  626. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_run_records.py +0 -0
  627. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +0 -0
  628. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
  629. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_work_center_wip_location.py +0 -0
  630. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +0 -0
  631. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
  632. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/LICENSE +0 -0
  633. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/__init__.py +0 -0
  634. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
  635. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
  636. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
  637. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-reports/tests/test_reports_full.py +0 -0
  638. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/LICENSE +0 -0
  639. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
  640. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +0 -0
  641. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/search.py +0 -0
  642. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
  643. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
  644. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/LICENSE +0 -0
  645. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/__init__.py +0 -0
  646. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
  647. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
  648. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
  649. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
  650. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
  651. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
  652. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
  653. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
  654. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
  655. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
  656. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
  657. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
  658. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
  659. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
  660. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
  661. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
  662. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
  663. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
  664. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
  665. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
  666. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
  667. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
  668. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
  669. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
  670. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
  671. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
  672. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
  673. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
  674. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
  675. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
  676. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
  677. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
  678. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
  679. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
  680. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
  681. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
  682. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
  683. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
  684. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
  685. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
  686. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
  687. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
  688. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
  689. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
  690. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
  691. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
  692. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
  693. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
  694. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
  695. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
  696. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
  697. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
  698. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
  699. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
  700. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
  701. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
  702. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
  703. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
  704. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
  705. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
  706. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
  707. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
  708. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
  709. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
  710. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
  711. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
  712. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
  713. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
  714. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
  715. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
  716. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
  717. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
  718. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
  719. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
  720. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
  721. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
  722. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
  723. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
  724. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
  725. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
  726. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
  727. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
  728. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
  729. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
  730. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
  731. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
  732. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
  733. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
  734. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
  735. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
  736. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
  737. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
  738. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
  739. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
  740. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
  741. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
  742. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
  743. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
  744. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
  745. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
  746. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +0 -0
  747. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +0 -0
  748. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +0 -0
  749. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +0 -0
  750. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +0 -0
  751. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +0 -0
  752. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +0 -0
  753. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +0 -0
  754. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +0 -0
  755. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +0 -0
  756. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +0 -0
  757. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +0 -0
  758. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +0 -0
  759. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +0 -0
  760. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
  761. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/retail.json +0 -0
  762. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
  763. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +0 -0
  764. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +0 -0
  765. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/routes.py +0 -0
  766. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
  767. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/tests/test_verticals.py +0 -0
  768. {celerp-2.5.4 → celerp-2.5.6}/default_modules/celerp-verticals/tests/test_verticals_routers.py +0 -0
  769. {celerp-2.5.4 → celerp-2.5.6}/legal/OFFICIAL-COMPONENTS.md +0 -0
  770. {celerp-2.5.4 → celerp-2.5.6}/legal/TRADEMARK.md +0 -0
  771. {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
  772. {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
  773. {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/Celerp.Celerp.yaml +0 -0
  774. {celerp-2.5.4 → celerp-2.5.6}/packaging/winget/README.md +0 -0
  775. {celerp-2.5.4 → celerp-2.5.6}/setup.cfg +0 -0
  776. {celerp-2.5.4 → celerp-2.5.6}/ui/__init__.py +0 -0
  777. {celerp-2.5.4 → celerp-2.5.6}/ui/components/__init__.py +0 -0
  778. {celerp-2.5.4 → celerp-2.5.6}/ui/components/attrs.py +0 -0
  779. {celerp-2.5.4 → celerp-2.5.6}/ui/components/backup.py +0 -0
  780. {celerp-2.5.4 → celerp-2.5.6}/ui/components/cloud_gate.py +0 -0
  781. {celerp-2.5.4 → celerp-2.5.6}/ui/components/currency.py +0 -0
  782. {celerp-2.5.4 → celerp-2.5.6}/ui/components/deleted_items.py +0 -0
  783. {celerp-2.5.4 → celerp-2.5.6}/ui/components/demo_items.py +0 -0
  784. {celerp-2.5.4 → celerp-2.5.6}/ui/components/icons.py +0 -0
  785. {celerp-2.5.4 → celerp-2.5.6}/ui/components/import_access.py +0 -0
  786. {celerp-2.5.4 → celerp-2.5.6}/ui/components/journal.py +0 -0
  787. {celerp-2.5.4 → celerp-2.5.6}/ui/components/notes.py +0 -0
  788. {celerp-2.5.4 → celerp-2.5.6}/ui/components/operation_key.py +0 -0
  789. {celerp-2.5.4 → celerp-2.5.6}/ui/components/phone.py +0 -0
  790. {celerp-2.5.4 → celerp-2.5.6}/ui/components/posting_accounts.py +0 -0
  791. {celerp-2.5.4 → celerp-2.5.6}/ui/components/report_kit.py +0 -0
  792. {celerp-2.5.4 → celerp-2.5.6}/ui/components/start_options.py +0 -0
  793. {celerp-2.5.4 → celerp-2.5.6}/ui/config.py +0 -0
  794. {celerp-2.5.4 → celerp-2.5.6}/ui/marketplace_catalog.py +0 -0
  795. {celerp-2.5.4 → celerp-2.5.6}/ui/module_slots.py +0 -0
  796. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/__init__.py +0 -0
  797. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/account.py +0 -0
  798. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/accounting.py +0 -0
  799. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/accounting_import.py +0 -0
  800. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/auth.py +0 -0
  801. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/commercial.py +0 -0
  802. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/company_backup.py +0 -0
  803. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/csv_import.py +0 -0
  804. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/doctor.py +0 -0
  805. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/events.py +0 -0
  806. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/lists_import.py +0 -0
  807. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/migrations.py +0 -0
  808. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/modules_page.py +0 -0
  809. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/notifications.py +0 -0
  810. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/reconciliation.py +0 -0
  811. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_cloud.py +0 -0
  812. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_connectors.py +0 -0
  813. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_contacts.py +0 -0
  814. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_general.py +0 -0
  815. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_import.py +0 -0
  816. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_inventory.py +0 -0
  817. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_manufacturing.py +0 -0
  818. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_payments.py +0 -0
  819. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_purchasing.py +0 -0
  820. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/settings_sales.py +0 -0
  821. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/setup.py +0 -0
  822. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/stars.py +0 -0
  823. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/subscriptions_import.py +0 -0
  824. {celerp-2.5.4 → celerp-2.5.6}/ui/routes/system_update.py +0 -0
  825. {celerp-2.5.4 → celerp-2.5.6}/ui/security.py +0 -0
  826. {celerp-2.5.4 → celerp-2.5.6}/ui/static/apple-touch-icon.png +0 -0
  827. {celerp-2.5.4 → celerp-2.5.6}/ui/static/currency-guess.js +0 -0
  828. {celerp-2.5.4 → celerp-2.5.6}/ui/static/favicon-32x32.png +0 -0
  829. {celerp-2.5.4 → celerp-2.5.6}/ui/static/favicon.ico +0 -0
  830. {celerp-2.5.4 → celerp-2.5.6}/ui/static/htmx.min.js +0 -0
  831. {celerp-2.5.4 → celerp-2.5.6}/ui/static/logo.png +0 -0
  832. {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
  833. {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
  834. {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
  835. {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
  836. {celerp-2.5.4 → celerp-2.5.6}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
  837. {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.4
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.31.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.142.2
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.8.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.3; python_full_version >= "3.12"
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.0
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.0; implementation_name != "PyPy" and platform_python_implementation != "PyPy"
181
- Requires-Dist: pydantic==2.13.5
182
- Requires-Dist: pydantic-core==2.46.5
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.19.0
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.3; python_full_version >= "3.11"
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.4.1; python_full_version < "3.11"
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 with automatic invoicing
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, auto-invoice generation |
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 with automatic invoicing
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, auto-invoice generation |
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 = "/settings/accounting?tab=posting-accounts"
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. No later event may change it: the lot's value
342
- stays on that account for as long as the lot holds stock."""
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, or the one the user picked for it. Only a lot with no account can take one.
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 one exception: public share links (/share/<token>[/bundle]) are
176
- anonymous API-app routes, so they must go to the API port — routed to
177
- the UI server they 404 and every shared link is dead.
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 == "/share" or path.startswith("/share/"):
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 automatic invoicing."},
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
- app.state.limiter = limiter
707
- app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler)
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