celerp 2.5.2__tar.gz → 2.5.3__tar.gz

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