celerp 2.3.6__tar.gz → 2.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (714) hide show
  1. {celerp-2.3.6 → celerp-2.5.0}/PKG-INFO +2 -1
  2. celerp-2.5.0/celerp/ai/batch.py +348 -0
  3. celerp-2.5.0/celerp/ai/conversations.py +665 -0
  4. celerp-2.5.0/celerp/ai/files.py +77 -0
  5. celerp-2.5.0/celerp/ai/llm.py +236 -0
  6. {celerp-2.3.6 → celerp-2.5.0}/celerp/ai/memory.py +1 -1
  7. celerp-2.5.0/celerp/ai/page_count.py +43 -0
  8. celerp-2.5.0/celerp/ai/quota.py +62 -0
  9. celerp-2.5.0/celerp/ai/service.py +483 -0
  10. celerp-2.5.0/celerp/ai/tools.py +434 -0
  11. {celerp-2.3.6 → celerp-2.5.0}/celerp/cli.py +6 -3
  12. celerp-2.5.0/celerp/config.py +801 -0
  13. celerp-2.5.0/celerp/config_store.py +203 -0
  14. celerp-2.5.0/celerp/entitlement_preflight.py +168 -0
  15. {celerp-2.3.6 → celerp-2.5.0}/celerp/events/engine.py +17 -0
  16. celerp-2.5.0/celerp/gateway/bootstrap.py +104 -0
  17. {celerp-2.3.6 → celerp-2.5.0}/celerp/gateway/client.py +41 -27
  18. celerp-2.5.0/celerp/gateway/fixtures/entitlement_flags_fixture.json +43 -0
  19. celerp-2.5.0/celerp/gateway/state.py +1034 -0
  20. celerp-2.5.0/celerp/importers/tabular.py +588 -0
  21. {celerp-2.3.6 → celerp-2.5.0}/celerp/main.py +115 -84
  22. {celerp-2.3.6 → celerp-2.5.0}/celerp/middleware.py +51 -51
  23. celerp-2.5.0/celerp/migrations/versions/f3a4b5c6d7e8_purge_session_registry.py +41 -0
  24. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/api.py +3 -3
  25. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/license.py +3 -1
  26. {celerp-2.3.6 → celerp-2.5.0}/celerp/output/doc_print.py +3 -1
  27. celerp-2.5.0/celerp/routers/attachments.py +42 -0
  28. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/auth.py +252 -129
  29. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/companies.py +155 -114
  30. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/events.py +38 -49
  31. celerp-2.5.0/celerp/routers/health.py +1208 -0
  32. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/search.py +1 -1
  33. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/attachments.py +37 -9
  34. celerp-2.5.0/celerp/services/auth.py +358 -0
  35. celerp-2.5.0/celerp/services/background.py +22 -0
  36. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup_repo.py +16 -7
  37. celerp-2.5.0/celerp/services/cloud_entitlement.py +229 -0
  38. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/payments.py +25 -28
  39. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/session_tracker.py +122 -96
  40. {celerp-2.3.6 → celerp-2.5.0}/celerp/session_gate.py +13 -9
  41. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/PKG-INFO +2 -1
  42. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/SOURCES.txt +28 -3
  43. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/requires.txt +1 -0
  44. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/scm_file_list.json +81 -3
  45. celerp-2.5.0/celerp.egg-info/scm_version.json +8 -0
  46. {celerp-2.3.6 → celerp-2.5.0}/conftest.py +24 -5
  47. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/routes.py +442 -154
  48. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +1 -1
  49. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +1 -1
  50. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +2 -2
  51. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_cash_flow.py +1 -1
  52. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +1 -1
  53. celerp-2.5.0/default_modules/celerp-accounting/tests/test_reconciliation_agent.py +330 -0
  54. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_route_permissions.py +12 -13
  55. celerp-2.5.0/default_modules/celerp-ai/celerp_ai/routes.py +1529 -0
  56. celerp-2.5.0/default_modules/celerp-ai/celerp_ai/ui_routes.py +2170 -0
  57. celerp-2.5.0/default_modules/celerp-ai/tests/_fixtures.py +91 -0
  58. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/error_402.json +6 -0
  59. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/error_409.json +6 -0
  60. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/error_429.json +6 -0
  61. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/mutation_tool_call.json +25 -0
  62. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/read_tool_call.json +25 -0
  63. celerp-2.5.0/default_modules/celerp-ai/tests/fixtures/relay/text_completion.json +15 -0
  64. celerp-2.5.0/default_modules/celerp-ai/tests/test_agent_loop.py +560 -0
  65. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_batch.py +164 -37
  66. celerp-2.5.0/default_modules/celerp-ai/tests/test_commercial_routing.py +203 -0
  67. celerp-2.5.0/default_modules/celerp-ai/tests/test_confirm_race_pg.py +155 -0
  68. celerp-2.5.0/default_modules/celerp-ai/tests/test_conversations.py +779 -0
  69. celerp-2.5.0/default_modules/celerp-ai/tests/test_coverage_gaps.py +409 -0
  70. celerp-2.5.0/default_modules/celerp-ai/tests/test_live_agent.py +161 -0
  71. celerp-2.5.0/default_modules/celerp-ai/tests/test_llm.py +271 -0
  72. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_page_count.py +2 -59
  73. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_quota.py +55 -36
  74. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_router.py +69 -73
  75. celerp-2.5.0/default_modules/celerp-ai/tests/test_routes_coverage.py +958 -0
  76. celerp-2.5.0/default_modules/celerp-ai/tests/test_showcase_claims.py +80 -0
  77. celerp-2.5.0/default_modules/celerp-ai/tests/test_ui_routes.py +785 -0
  78. celerp-2.5.0/default_modules/celerp-ai/tests/test_workflows.py +409 -0
  79. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-backup/celerp_backup/routes.py +5 -3
  80. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/routes.py +65 -22
  81. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/routes.py +296 -123
  82. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/routes_payments.py +2 -0
  83. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_audits.py +1 -1
  84. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_cross_lot_settlement.py +1 -1
  85. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_freight_je.py +1 -1
  86. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_freight_lines.py +1 -1
  87. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +1 -1
  88. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +3 -3
  89. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +1 -1
  90. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +1 -1
  91. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_landed_receive.py +1 -1
  92. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_line_delete_persist.py +1 -1
  93. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_line_identifier.py +1 -1
  94. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_line_page_patch_truncate.py +1 -1
  95. celerp-2.5.0/default_modules/celerp-docs/tests/test_list_ids_filter.py +44 -0
  96. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_page_no_full_state.py +1 -1
  97. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_quantity_integrity.py +1 -1
  98. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_query_pushdown.py +1 -1
  99. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_sell_by_and_reference.py +1 -1
  100. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_close.py +1 -1
  101. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_close_review_fixes.py +1 -1
  102. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_line_labels.py +1 -1
  103. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_unfulfilled_filter.py +1 -1
  104. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_payment_void_activity.py +1 -1
  105. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +1 -1
  106. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_send_visibility.py +1 -1
  107. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_service_lines.py +1 -1
  108. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_sold_label_ordering.py +1 -1
  109. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_void_guards.py +1 -1
  110. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_writeoffs.py +1 -1
  111. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/routes.py +352 -272
  112. celerp-2.5.0/default_modules/celerp-inventory/celerp_inventory/services.py +1181 -0
  113. celerp-2.5.0/default_modules/celerp-inventory/tests/test_import_agent_routes.py +242 -0
  114. celerp-2.5.0/default_modules/celerp-inventory/tests/test_import_service.py +451 -0
  115. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +10 -2
  116. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +1 -1
  117. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +1 -1
  118. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_build_api.py +1 -1
  119. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +1 -1
  120. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +1 -1
  121. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +1 -1
  122. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +1 -1
  123. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +2 -2
  124. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +1 -1
  125. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +1 -1
  126. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_production_order.py +1 -1
  127. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_recost_api.py +1 -1
  128. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_run_records.py +1 -1
  129. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +1 -1
  130. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +1 -1
  131. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/tests/test_reports_full.py +1 -1
  132. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +1 -1
  133. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/routes.py +2 -1
  134. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/tests/test_verticals_routers.py +1 -1
  135. celerp-2.5.0/default_modules/first_party.lock.json +16 -0
  136. {celerp-2.3.6 → celerp-2.5.0}/pyproject.toml +1 -0
  137. {celerp-2.3.6 → celerp-2.5.0}/test_helpers.py +54 -6
  138. {celerp-2.3.6 → celerp-2.5.0}/ui/api_client.py +233 -49
  139. {celerp-2.3.6 → celerp-2.5.0}/ui/app.py +67 -29
  140. {celerp-2.3.6 → celerp-2.5.0}/ui/components/activity.py +8 -3
  141. celerp-2.5.0/ui/components/cloud_gate.py +236 -0
  142. {celerp-2.3.6 → celerp-2.5.0}/ui/components/shell.py +98 -21
  143. {celerp-2.3.6 → celerp-2.5.0}/ui/config.py +66 -11
  144. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/am.json +97 -12
  145. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/ar.json +97 -12
  146. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/de.json +97 -12
  147. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/en.json +102 -17
  148. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/es.json +97 -12
  149. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/fr.json +97 -12
  150. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/id.json +97 -12
  151. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/it.json +97 -12
  152. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/ja.json +97 -12
  153. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/pt.json +97 -12
  154. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/th.json +97 -12
  155. {celerp-2.3.6 → celerp-2.5.0}/ui/locales/vi.json +97 -12
  156. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/account.py +39 -40
  157. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/auth.py +59 -23
  158. celerp-2.5.0/ui/routes/commercial.py +144 -0
  159. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/contacts.py +2 -2
  160. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/csv_import.py +19 -359
  161. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/dashboard.py +1 -1
  162. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/documents.py +16 -9
  163. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/inventory.py +39 -353
  164. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/modules_page.py +3 -4
  165. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings.py +222 -172
  166. celerp-2.5.0/ui/routes/settings_cloud.py +1520 -0
  167. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_connectors.py +9 -22
  168. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_inventory.py +4 -1
  169. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_payments.py +14 -7
  170. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/setup.py +26 -20
  171. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/subscriptions.py +1 -1
  172. {celerp-2.3.6 → celerp-2.5.0}/ui/static/app.css +64 -21
  173. celerp-2.3.6/celerp/ai/batch.py +0 -228
  174. celerp-2.3.6/celerp/ai/commands.py +0 -184
  175. celerp-2.3.6/celerp/ai/conversations.py +0 -234
  176. celerp-2.3.6/celerp/ai/files.py +0 -49
  177. celerp-2.3.6/celerp/ai/llm.py +0 -110
  178. celerp-2.3.6/celerp/ai/page_count.py +0 -67
  179. celerp-2.3.6/celerp/ai/quota.py +0 -63
  180. celerp-2.3.6/celerp/ai/service.py +0 -272
  181. celerp-2.3.6/celerp/ai/tools.py +0 -287
  182. celerp-2.3.6/celerp/config.py +0 -447
  183. celerp-2.3.6/celerp/gateway/state.py +0 -178
  184. celerp-2.3.6/celerp/routers/health.py +0 -749
  185. celerp-2.3.6/celerp/services/auth.py +0 -174
  186. celerp-2.3.6/celerp.egg-info/scm_version.json +0 -8
  187. celerp-2.3.6/default_modules/celerp-ai/celerp_ai/routes.py +0 -747
  188. celerp-2.3.6/default_modules/celerp-ai/celerp_ai/ui_routes.py +0 -1086
  189. celerp-2.3.6/default_modules/celerp-ai/tests/test_conversations.py +0 -324
  190. celerp-2.3.6/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -595
  191. celerp-2.3.6/default_modules/celerp-ai/tests/test_llm.py +0 -158
  192. celerp-2.3.6/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -394
  193. celerp-2.3.6/default_modules/celerp-ai/tests/test_service.py +0 -217
  194. celerp-2.3.6/default_modules/celerp-ai/tests/test_tools.py +0 -354
  195. celerp-2.3.6/default_modules/celerp-inventory/celerp_inventory/services.py +0 -289
  196. celerp-2.3.6/default_modules/first_party.lock.json +0 -16
  197. celerp-2.3.6/ui/components/cloud_gate.py +0 -127
  198. celerp-2.3.6/ui/routes/settings_cloud.py +0 -751
  199. {celerp-2.3.6 → celerp-2.5.0}/CLA.md +0 -0
  200. {celerp-2.3.6 → celerp-2.5.0}/CONTRIBUTING.md +0 -0
  201. {celerp-2.3.6 → celerp-2.5.0}/LICENSE +0 -0
  202. {celerp-2.3.6 → celerp-2.5.0}/LICENSING.md +0 -0
  203. {celerp-2.3.6 → celerp-2.5.0}/MANIFEST.in +0 -0
  204. {celerp-2.3.6 → celerp-2.5.0}/NOTICE +0 -0
  205. {celerp-2.3.6 → celerp-2.5.0}/README.md +0 -0
  206. {celerp-2.3.6 → celerp-2.5.0}/alembic.ini +0 -0
  207. {celerp-2.3.6 → celerp-2.5.0}/celerp/__init__.py +0 -0
  208. {celerp-2.3.6 → celerp-2.5.0}/celerp/__main__.py +0 -0
  209. {celerp-2.3.6 → celerp-2.5.0}/celerp/ai/__init__.py +0 -0
  210. {celerp-2.3.6 → celerp-2.5.0}/celerp/ai/cleanup.py +0 -0
  211. {celerp-2.3.6 → celerp-2.5.0}/celerp/ai/intent.py +0 -0
  212. {celerp-2.3.6 → celerp-2.5.0}/celerp/ai/models.py +0 -0
  213. {celerp-2.3.6 → celerp-2.5.0}/celerp/alembic.ini +0 -0
  214. {celerp-2.3.6 → celerp-2.5.0}/celerp/alembic_config.py +0 -0
  215. {celerp-2.3.6 → celerp-2.5.0}/celerp/capacity.py +0 -0
  216. {celerp-2.3.6 → celerp-2.5.0}/celerp/compat.py +0 -0
  217. {celerp-2.3.6 → celerp-2.5.0}/celerp/compute/__init__.py +0 -0
  218. {celerp-2.3.6 → celerp-2.5.0}/celerp/compute/aggregations.py +0 -0
  219. {celerp-2.3.6 → celerp-2.5.0}/celerp/compute/valuation.py +0 -0
  220. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/__init__.py +0 -0
  221. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/base.py +0 -0
  222. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/daily_scheduler.py +0 -0
  223. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/http.py +0 -0
  224. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/images.py +0 -0
  225. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/quickbooks.py +0 -0
  226. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/registry.py +0 -0
  227. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/relay_token.py +0 -0
  228. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/shopify.py +0 -0
  229. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/sync_runner.py +0 -0
  230. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/upsert.py +0 -0
  231. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/util.py +0 -0
  232. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/webhooks.py +0 -0
  233. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/woocommerce.py +0 -0
  234. {celerp-2.3.6 → celerp-2.5.0}/celerp/connectors/xero.py +0 -0
  235. {celerp-2.3.6 → celerp-2.5.0}/celerp/constants.py +0 -0
  236. {celerp-2.3.6 → celerp-2.5.0}/celerp/db.py +0 -0
  237. {celerp-2.3.6 → celerp-2.5.0}/celerp/embedded_pg.py +0 -0
  238. {celerp-2.3.6 → celerp-2.5.0}/celerp/events/__init__.py +0 -0
  239. {celerp-2.3.6 → celerp-2.5.0}/celerp/events/schemas.py +0 -0
  240. {celerp-2.3.6 → celerp-2.5.0}/celerp/events/types.py +0 -0
  241. {celerp-2.3.6 → celerp-2.5.0}/celerp/gateway/__init__.py +0 -0
  242. {celerp-2.3.6 → celerp-2.5.0}/celerp/importers/__init__.py +0 -0
  243. {celerp-2.3.6 → celerp-2.5.0}/celerp/importers/importer.py +0 -0
  244. {celerp-2.3.6 → celerp-2.5.0}/celerp/importers/schema.py +0 -0
  245. {celerp-2.3.6 → celerp-2.5.0}/celerp/inventory_codes.py +0 -0
  246. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/README.md +0 -0
  247. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/_auto_stamp.py +0 -0
  248. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/_data_reconcile.py +0 -0
  249. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/_json_compat.py +0 -0
  250. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/env.py +0 -0
  251. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/script.py.mako +0 -0
  252. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
  253. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
  254. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
  255. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
  256. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
  257. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/bc0d1e2f3a4b_barcode_unique_index.py +0 -0
  258. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
  259. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
  260. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
  261. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/c9d8e7f6a5b4_seed_shrinkage_writeoff_account.py +0 -0
  262. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
  263. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/d1e2f3a4b5c6_rfid_epc_unique_index.py +0 -0
  264. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
  265. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
  266. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
  267. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
  268. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
  269. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
  270. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
  271. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
  272. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
  273. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
  274. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
  275. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
  276. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
  277. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
  278. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
  279. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
  280. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
  281. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
  282. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
  283. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
  284. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
  285. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
  286. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
  287. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
  288. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
  289. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
  290. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
  291. {celerp-2.3.6 → celerp-2.5.0}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
  292. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/__init__.py +0 -0
  293. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/accounting.py +0 -0
  294. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/ai.py +0 -0
  295. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/auth.py +0 -0
  296. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/base.py +0 -0
  297. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/company.py +0 -0
  298. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/connector_config.py +0 -0
  299. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/import_batch.py +0 -0
  300. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/ledger.py +0 -0
  301. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/marketplace.py +0 -0
  302. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/notification.py +0 -0
  303. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/projections.py +0 -0
  304. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/share.py +0 -0
  305. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/supporter.py +0 -0
  306. {celerp-2.3.6 → celerp-2.5.0}/celerp/models/sync_run.py +0 -0
  307. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/__init__.py +0 -0
  308. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/audit.py +0 -0
  309. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/demotion.py +0 -0
  310. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/importer.py +0 -0
  311. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/loader.py +0 -0
  312. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/meta.py +0 -0
  313. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/migrations_runner.py +0 -0
  314. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/references.py +0 -0
  315. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/registry.py +0 -0
  316. {celerp-2.3.6 → celerp-2.5.0}/celerp/modules/slots.py +0 -0
  317. {celerp-2.3.6 → celerp-2.5.0}/celerp/notifications/__init__.py +0 -0
  318. {celerp-2.3.6 → celerp-2.5.0}/celerp/notifications/service.py +0 -0
  319. {celerp-2.3.6 → celerp-2.5.0}/celerp/notifications/sse.py +0 -0
  320. {celerp-2.3.6 → celerp-2.5.0}/celerp/output/__init__.py +0 -0
  321. {celerp-2.3.6 → celerp-2.5.0}/celerp/output/branding.py +0 -0
  322. {celerp-2.3.6 → celerp-2.5.0}/celerp/output/pdf.py +0 -0
  323. {celerp-2.3.6 → celerp-2.5.0}/celerp/output/share_render.py +0 -0
  324. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/__init__.py +0 -0
  325. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/engine.py +0 -0
  326. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/handlers/__init__.py +0 -0
  327. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/handlers/marketplace.py +0 -0
  328. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/handlers/scanning.py +0 -0
  329. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/handlers/shopify.py +0 -0
  330. {celerp-2.3.6 → celerp-2.5.0}/celerp/projections/handlers/system.py +0 -0
  331. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/__init__.py +0 -0
  332. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/debug.py +0 -0
  333. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/doctor.py +0 -0
  334. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/ledger.py +0 -0
  335. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/notifications.py +0 -0
  336. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/stars.py +0 -0
  337. {celerp-2.3.6 → celerp-2.5.0}/celerp/routers/system.py +0 -0
  338. {celerp-2.3.6 → celerp-2.5.0}/celerp/schemas/__init__.py +0 -0
  339. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/__init__.py +0 -0
  340. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/activity_redaction.py +0 -0
  341. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/auto_je.py +0 -0
  342. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup.py +0 -0
  343. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup_export.py +0 -0
  344. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup_import.py +0 -0
  345. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup_scheduler.py +0 -0
  346. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/backup_state.py +0 -0
  347. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/cogs_backfill.py +0 -0
  348. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/cost_visibility.py +0 -0
  349. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/demo.py +0 -0
  350. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/dev_release_guard.py +0 -0
  351. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/document_lines.py +0 -0
  352. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/email.py +0 -0
  353. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/field_schema.py +0 -0
  354. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/fulfill.py +0 -0
  355. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/holdings.py +0 -0
  356. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/je_keys.py +0 -0
  357. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/landed_cost.py +0 -0
  358. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/line_measures.py +0 -0
  359. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/list_behavior.py +0 -0
  360. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/money.py +0 -0
  361. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/permissions.py +0 -0
  362. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/pick.py +0 -0
  363. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/pricing.py +0 -0
  364. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/relay_share.py +0 -0
  365. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/reorder.py +0 -0
  366. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/runtime_state.py +0 -0
  367. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/shipping.py +0 -0
  368. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/star_cta.py +0 -0
  369. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/status_doc_backfill.py +0 -0
  370. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/supporter_badge.py +0 -0
  371. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/system_health.py +0 -0
  372. {celerp-2.3.6 → celerp-2.5.0}/celerp/services/units.py +0 -0
  373. {celerp-2.3.6 → celerp-2.5.0}/celerp/tax_regimes.py +0 -0
  374. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/dependency_links.txt +0 -0
  375. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/entry_points.txt +0 -0
  376. {celerp-2.3.6 → celerp-2.5.0}/celerp.egg-info/top_level.txt +0 -0
  377. {celerp-2.3.6 → celerp-2.5.0}/conftest_support.py +0 -0
  378. {celerp-2.3.6 → celerp-2.5.0}/default_modules/__init__.py +0 -0
  379. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/LICENSE +0 -0
  380. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/__init__.py +0 -0
  381. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
  382. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
  383. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
  384. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
  385. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
  386. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
  387. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/search.py +0 -0
  388. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
  389. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +0 -0
  390. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +0 -0
  391. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
  392. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
  393. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +0 -0
  394. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +0 -0
  395. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
  396. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
  397. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/journal.html +0 -0
  398. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +0 -0
  399. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +0 -0
  400. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/statement.html +0 -0
  401. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +0 -0
  402. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
  403. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +0 -0
  404. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
  405. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
  406. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +0 -0
  407. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-admin/__init__.py +0 -0
  408. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
  409. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-admin/celerp_admin/routes.py +0 -0
  410. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
  411. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/__init__.py +0 -0
  412. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
  413. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
  414. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/conftest.py +0 -0
  415. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
  416. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_intent.py +0 -0
  417. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_memory.py +0 -0
  418. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-ai/tests/test_models.py +0 -0
  419. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-backup/__init__.py +0 -0
  420. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
  421. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
  422. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/__init__.py +0 -0
  423. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
  424. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
  425. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
  426. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/__init__.py +0 -0
  427. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/conftest.py +0 -0
  428. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
  429. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
  430. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
  431. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
  432. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_images.py +0 -0
  433. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
  434. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
  435. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
  436. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
  437. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
  438. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
  439. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
  440. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
  441. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/LICENSE +0 -0
  442. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/__init__.py +0 -0
  443. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
  444. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/migrations.py +0 -0
  445. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
  446. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/search.py +0 -0
  447. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
  448. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
  449. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-dashboard/LICENSE +0 -0
  450. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-dashboard/__init__.py +0 -0
  451. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
  452. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +0 -0
  453. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
  454. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/LICENSE +0 -0
  455. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/__init__.py +0 -0
  456. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
  457. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/api_setup.py +0 -0
  458. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/doc_constants.py +0 -0
  459. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
  460. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/doc_projections.py +0 -0
  461. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/doc_service.py +0 -0
  462. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
  463. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/routes_share.py +0 -0
  464. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/search.py +0 -0
  465. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/sequences.py +0 -0
  466. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/taxes.py +0 -0
  467. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
  468. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/conftest.py +0 -0
  469. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_bulk_payment_alloc_lock.py +0 -0
  470. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_consolidate_lots.py +0 -0
  471. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_concurrency.py +0 -0
  472. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_list_outcome_concurrency.py +0 -0
  473. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_close_projection.py +0 -0
  474. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-docs/tests/test_memo_lifecycle_concurrency.py +0 -0
  475. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/LICENSE +0 -0
  476. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/__init__.py +0 -0
  477. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
  478. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
  479. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/projections.py +0 -0
  480. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
  481. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/routes_scanning.py +0 -0
  482. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/search.py +0 -0
  483. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
  484. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
  485. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
  486. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +0 -0
  487. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/LICENSE +0 -0
  488. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/__init__.py +0 -0
  489. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
  490. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/am.json +0 -0
  491. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/ar.json +0 -0
  492. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/de.json +0 -0
  493. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/en.json +0 -0
  494. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/es.json +0 -0
  495. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/fr.json +0 -0
  496. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/id.json +0 -0
  497. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/it.json +0 -0
  498. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/ja.json +0 -0
  499. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/pt.json +0 -0
  500. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/th.json +0 -0
  501. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/locales/vi.json +0 -0
  502. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
  503. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
  504. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/routes.py +0 -0
  505. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
  506. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/celerp_labels/ui_routes.py +0 -0
  507. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/requirements.txt +0 -0
  508. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/tests/test_labels.py +0 -0
  509. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
  510. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/LICENSE +0 -0
  511. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/__init__.py +0 -0
  512. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
  513. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
  514. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
  515. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
  516. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
  517. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
  518. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/search.py +0 -0
  519. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
  520. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/requirements.txt +0 -0
  521. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_completion_lock_order.py +0 -0
  522. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
  523. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
  524. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
  525. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
  526. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
  527. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
  528. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/LICENSE +0 -0
  529. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/__init__.py +0 -0
  530. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
  531. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
  532. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/celerp_reports/routes.py +0 -0
  533. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
  534. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-reports/tests/test_reports_unit.py +0 -0
  535. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/LICENSE +0 -0
  536. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/__init__.py +0 -0
  537. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
  538. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +0 -0
  539. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/celerp_subscriptions/search.py +0 -0
  540. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
  541. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
  542. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/LICENSE +0 -0
  543. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/__init__.py +0 -0
  544. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
  545. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
  546. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
  547. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
  548. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
  549. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
  550. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
  551. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
  552. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
  553. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
  554. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
  555. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
  556. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
  557. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
  558. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
  559. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
  560. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
  561. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
  562. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
  563. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
  564. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
  565. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
  566. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
  567. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
  568. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
  569. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
  570. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
  571. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
  572. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
  573. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
  574. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
  575. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
  576. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
  577. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
  578. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
  579. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
  580. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
  581. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
  582. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
  583. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
  584. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
  585. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
  586. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
  587. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
  588. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
  589. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
  590. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
  591. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
  592. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
  593. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
  594. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
  595. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
  596. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
  597. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
  598. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
  599. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
  600. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
  601. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
  602. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
  603. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
  604. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
  605. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
  606. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
  607. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
  608. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
  609. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
  610. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
  611. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
  612. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
  613. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
  614. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
  615. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
  616. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
  617. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
  618. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
  619. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
  620. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
  621. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
  622. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
  623. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
  624. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
  625. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
  626. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
  627. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
  628. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
  629. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
  630. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
  631. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
  632. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
  633. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
  634. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
  635. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
  636. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
  637. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
  638. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
  639. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
  640. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
  641. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
  642. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
  643. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
  644. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +0 -0
  645. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +0 -0
  646. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +0 -0
  647. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +0 -0
  648. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +0 -0
  649. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +0 -0
  650. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +0 -0
  651. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +0 -0
  652. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +0 -0
  653. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +0 -0
  654. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +0 -0
  655. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +0 -0
  656. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +0 -0
  657. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +0 -0
  658. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
  659. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
  660. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +0 -0
  661. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +0 -0
  662. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
  663. {celerp-2.3.6 → celerp-2.5.0}/default_modules/celerp-verticals/tests/test_verticals.py +0 -0
  664. {celerp-2.3.6 → celerp-2.5.0}/legal/OFFICIAL-COMPONENTS.md +0 -0
  665. {celerp-2.3.6 → celerp-2.5.0}/legal/TRADEMARK.md +0 -0
  666. {celerp-2.3.6 → celerp-2.5.0}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
  667. {celerp-2.3.6 → celerp-2.5.0}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
  668. {celerp-2.3.6 → celerp-2.5.0}/packaging/winget/Celerp.Celerp.yaml +0 -0
  669. {celerp-2.3.6 → celerp-2.5.0}/packaging/winget/README.md +0 -0
  670. {celerp-2.3.6 → celerp-2.5.0}/setup.cfg +0 -0
  671. {celerp-2.3.6 → celerp-2.5.0}/ui/__init__.py +0 -0
  672. {celerp-2.3.6 → celerp-2.5.0}/ui/components/__init__.py +0 -0
  673. {celerp-2.3.6 → celerp-2.5.0}/ui/components/attrs.py +0 -0
  674. {celerp-2.3.6 → celerp-2.5.0}/ui/components/backup.py +0 -0
  675. {celerp-2.3.6 → celerp-2.5.0}/ui/components/currency.py +0 -0
  676. {celerp-2.3.6 → celerp-2.5.0}/ui/components/files.py +0 -0
  677. {celerp-2.3.6 → celerp-2.5.0}/ui/components/journal.py +0 -0
  678. {celerp-2.3.6 → celerp-2.5.0}/ui/components/notes.py +0 -0
  679. {celerp-2.3.6 → celerp-2.5.0}/ui/components/phone.py +0 -0
  680. {celerp-2.3.6 → celerp-2.5.0}/ui/components/report_kit.py +0 -0
  681. {celerp-2.3.6 → celerp-2.5.0}/ui/components/table.py +0 -0
  682. {celerp-2.3.6 → celerp-2.5.0}/ui/i18n.py +0 -0
  683. {celerp-2.3.6 → celerp-2.5.0}/ui/marketplace_catalog.py +0 -0
  684. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/__init__.py +0 -0
  685. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/accounting.py +0 -0
  686. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/accounting_import.py +0 -0
  687. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/docs_import.py +0 -0
  688. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/events.py +0 -0
  689. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/financial_reports.py +0 -0
  690. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/lists_import.py +0 -0
  691. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/manufacturing.py +0 -0
  692. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/notifications.py +0 -0
  693. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/reconciliation.py +0 -0
  694. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/reports.py +0 -0
  695. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/search.py +0 -0
  696. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_accounting.py +0 -0
  697. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_contacts.py +0 -0
  698. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_general.py +0 -0
  699. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_import.py +0 -0
  700. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_manufacturing.py +0 -0
  701. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_purchasing.py +0 -0
  702. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/settings_sales.py +0 -0
  703. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/stars.py +0 -0
  704. {celerp-2.3.6 → celerp-2.5.0}/ui/routes/subscriptions_import.py +0 -0
  705. {celerp-2.3.6 → celerp-2.5.0}/ui/security.py +0 -0
  706. {celerp-2.3.6 → celerp-2.5.0}/ui/static/htmx.min.js +0 -0
  707. {celerp-2.3.6 → celerp-2.5.0}/ui/static/icon.png +0 -0
  708. {celerp-2.3.6 → celerp-2.5.0}/ui/static/logo.png +0 -0
  709. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
  710. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
  711. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
  712. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
  713. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
  714. {celerp-2.3.6 → celerp-2.5.0}/ui/static/vendor/intl-tel-input/utils.js +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celerp
3
- Version: 2.3.6
3
+ Version: 2.5.0
4
4
  Summary: Free, self-hosted ERP for small businesses
5
5
  License: Business Source License 1.1
6
6
 
@@ -141,6 +141,7 @@ Requires-Dist: numpy>=1.26
141
141
  Requires-Dist: python-multipart>=0.0.9
142
142
  Requires-Dist: aiofiles>=23.0
143
143
  Requires-Dist: httpx>=0.27
144
+ Requires-Dist: openpyxl<4,>=3.1
144
145
  Requires-Dist: slowapi>=0.1.9
145
146
  Requires-Dist: reportlab>=4.0
146
147
  Requires-Dist: python-fasthtml>=0.14
@@ -0,0 +1,348 @@
1
+ # Copyright (c) 2026 Noah Severs
2
+ # SPDX-License-Identifier: LicenseRef-Proprietary
3
+
4
+ """AI batch processing - the extraction stage for attached receipts and invoices.
5
+
6
+ A batch job reads 1 to MAX_BATCH_FILES files in parallel (at most
7
+ BATCH_CONCURRENCY model calls at once). Each file gets its own model call that
8
+ returns a structured extraction. Nothing is written to the books here: the
9
+ extractions feed the proposal step, and every document is created only after
10
+ the user confirms it.
11
+
12
+ Credits are metered per file from the gateway's usage report, so a job that
13
+ fails halfway charges only for the files it actually read.
14
+
15
+ Usage:
16
+ job = await create_batch_job(session, company_id, user_id, query, file_ids)
17
+ # run_batch runs in the background, reports per-file progress through
18
+ # on_progress, and creates a notification when it finishes.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import asyncio
24
+ import json
25
+ import logging
26
+ import re
27
+ import uuid
28
+ from datetime import datetime, timezone
29
+
30
+ from fastapi import HTTPException
31
+ from sqlalchemy import select
32
+ from sqlalchemy.ext.asyncio import AsyncSession
33
+
34
+ from celerp.ai.files import load_file_for_llm
35
+ from celerp.ai.llm import RelayError, call_llm
36
+ from celerp.ai.models import BULK_EXTRACTION
37
+ from celerp.models.ai import AIBatchJob
38
+
39
+ log = logging.getLogger(__name__)
40
+
41
+ # Keep file decoding/base64 residency aligned with the transport's process-wide
42
+ # model-call concurrency. A larger batch semaphore only lets extra 10 MB files sit
43
+ # expanded in memory while call_llm waits on its own three-call gate.
44
+ BATCH_CONCURRENCY = 3
45
+ MAX_BATCH_FILES = 100
46
+
47
+ INTERRUPTED_ERROR = "This job was interrupted by a restart. Completed file results were kept; resend only files that did not finish."
48
+
49
+ _BATCH_SYSTEM_PROMPT = """\
50
+ You are reading one business document: a receipt, a supplier invoice, a bank or \
51
+ card statement, or something else.
52
+ Extract what is printed on it. Never guess a value that is not on the document; \
53
+ leave it null instead.
54
+
55
+ Output a JSON block:
56
+ ```json
57
+ {
58
+ "document_kind": "receipt|invoice|statement|other",
59
+ "vendor_name": "string or null",
60
+ "date": "YYYY-MM-DD or null",
61
+ "currency": "ISO 4217 code or null",
62
+ "total": 0.00,
63
+ "tax": 0.00,
64
+ "reference": "invoice or receipt number, or null",
65
+ "line_items": [
66
+ {"description": "string", "quantity": 1, "unit_price": 0.00}
67
+ ]
68
+ }
69
+ ```
70
+
71
+ If the document is unreadable, return a one-sentence explanation instead of JSON.
72
+ """
73
+
74
+ _FENCED_JSON = re.compile(r"```(?:json)?\s*(\{.*?\})\s*```", re.DOTALL)
75
+
76
+
77
+ def parse_extraction(answer: str) -> dict | None:
78
+ """Return the JSON object in a model answer, or None when there is none.
79
+
80
+ Tries a fenced ```json block first, then the whole answer, then the first
81
+ balanced object in the text. Anything that is not a JSON object is None.
82
+ """
83
+ candidates: list[str] = []
84
+ fenced = _FENCED_JSON.search(answer)
85
+ if fenced:
86
+ candidates.append(fenced.group(1))
87
+ candidates.append(answer.strip())
88
+ start = answer.find("{")
89
+ if start != -1:
90
+ depth = 0
91
+ for i in range(start, len(answer)):
92
+ if answer[i] == "{":
93
+ depth += 1
94
+ elif answer[i] == "}":
95
+ depth -= 1
96
+ if depth == 0:
97
+ candidates.append(answer[start:i + 1])
98
+ break
99
+ for text in candidates:
100
+ try:
101
+ parsed = json.loads(text)
102
+ except (ValueError, TypeError):
103
+ continue
104
+ if isinstance(parsed, dict):
105
+ return parsed
106
+ return None
107
+
108
+
109
+ def _file_error(exc: BaseException) -> str:
110
+ """The user-facing reason a single file could not be read."""
111
+ if isinstance(exc, HTTPException) and exc.status_code == 402:
112
+ return "You are out of AI credits. Add credits and resend this file."
113
+ if isinstance(exc, RelayError):
114
+ return str(exc)
115
+ if isinstance(exc, asyncio.TimeoutError):
116
+ return "The model did not answer in time for this file. Resend it to try again."
117
+ return "This file could not be read. Check that it is a clear image or PDF and resend it."
118
+
119
+
120
+ async def _process_single_file(
121
+ file_id: str,
122
+ query: str,
123
+ company_id: uuid.UUID,
124
+ user_id: uuid.UUID,
125
+ semaphore: asyncio.Semaphore,
126
+ ) -> dict:
127
+ """Read one file through the model. Never raises; the result dict carries the outcome.
128
+
129
+ File loading/base64 encoding happens inside the concurrency bound so a large
130
+ batch cannot hold every encoded attachment in memory at once.
131
+ """
132
+ async with semaphore:
133
+ try:
134
+ file = load_file_for_llm(file_id, company_id, user_id)
135
+ except (FileNotFoundError, PermissionError):
136
+ return {
137
+ "file_id": file_id,
138
+ "filename": file_id,
139
+ "status": "error",
140
+ "error": "This file is no longer available. Attach it again and resend.",
141
+ }
142
+
143
+ filename = file["filename"]
144
+ files = [file]
145
+ prompt = f"{query}\n\nRead the attached document." if query else "Read the attached document."
146
+
147
+ try:
148
+ result = await call_llm(BULK_EXTRACTION, _BATCH_SYSTEM_PROMPT, prompt, files=files)
149
+ except Exception as exc:
150
+ log.warning("Batch file %s failed: %s", file_id, exc)
151
+ return {
152
+ "file_id": file_id,
153
+ "filename": filename,
154
+ "status": "error",
155
+ "error": _file_error(exc),
156
+ }
157
+
158
+ answer = result.message.get("content") or ""
159
+ return {
160
+ "file_id": file_id,
161
+ "filename": filename,
162
+ "status": "success",
163
+ "answer": answer,
164
+ "extraction": parse_extraction(answer),
165
+ "credits": int(result.usage.get("credits") or 0),
166
+ }
167
+
168
+
169
+ async def create_batch_job(
170
+ session: AsyncSession,
171
+ company_id: uuid.UUID,
172
+ user_id: uuid.UUID,
173
+ query: str,
174
+ file_ids: list[str],
175
+ conversation_id: uuid.UUID | None = None,
176
+ ) -> AIBatchJob:
177
+ """Create a pending batch job record. Credits accrue per file as it runs."""
178
+ file_ids = list(dict.fromkeys(file_ids))
179
+ if not file_ids:
180
+ raise ValueError("Attach at least one file")
181
+ if len(file_ids) > MAX_BATCH_FILES:
182
+ raise ValueError(f"Maximum {MAX_BATCH_FILES} files per batch")
183
+
184
+ job = AIBatchJob(
185
+ company_id=company_id,
186
+ user_id=user_id,
187
+ conversation_id=conversation_id,
188
+ query=query,
189
+ file_ids=file_ids,
190
+ total_files=len(file_ids),
191
+ credits_consumed=0,
192
+ status="pending",
193
+ )
194
+ session.add(job)
195
+ await session.flush()
196
+ return job
197
+
198
+
199
+ async def run_batch(
200
+ job_id: uuid.UUID,
201
+ company_id: uuid.UUID,
202
+ user_id: uuid.UUID,
203
+ query: str,
204
+ file_ids: list[str],
205
+ db_factory,
206
+ on_progress=None,
207
+ ) -> None:
208
+ """Execute a batch job: parallel file extraction with per-file progress.
209
+
210
+ Args:
211
+ db_factory: Callable that returns an AsyncSession context manager.
212
+ on_progress: Optional async callback(job_id, completed, failed, total, result).
213
+ """
214
+ semaphore = asyncio.Semaphore(BATCH_CONCURRENCY)
215
+ results: list[dict] = []
216
+ conversation_id: uuid.UUID | None = None
217
+ completed = 0
218
+ failed = 0
219
+ credits = 0
220
+
221
+ async with db_factory() as session:
222
+ job = await session.get(AIBatchJob, job_id)
223
+ if job:
224
+ conversation_id = job.conversation_id
225
+ job.status = "running"
226
+ session.add(job)
227
+ await session.commit()
228
+
229
+ tasks = [
230
+ _process_single_file(fid, query, company_id, user_id, semaphore)
231
+ for fid in file_ids
232
+ ]
233
+
234
+ for coro in asyncio.as_completed(tasks):
235
+ result = await coro
236
+ results.append(result)
237
+
238
+ if result["status"] == "success":
239
+ completed += 1
240
+ else:
241
+ failed += 1
242
+ credits += result.get("credits", 0)
243
+
244
+ async with db_factory() as session:
245
+ job = await session.get(AIBatchJob, job_id)
246
+ if job:
247
+ persisted = list(((job.results or {}).get("files") or []))
248
+ persisted.append(result)
249
+ # Preserve the user's attachment order even though extraction finishes
250
+ # concurrently. File ids are upload identities; repeated ids, if any,
251
+ # retain their completion order after the first matching position.
252
+ order = {file_id: index for index, file_id in enumerate(file_ids)}
253
+ persisted.sort(key=lambda item: order.get(item.get("file_id"), len(order)))
254
+ job.results = {**(job.results or {}), "files": persisted}
255
+ job.completed_files = completed
256
+ job.failed_files = failed
257
+ job.credits_consumed = credits
258
+ session.add(job)
259
+ await session.commit()
260
+
261
+ if on_progress:
262
+ try:
263
+ await on_progress(job_id, completed, failed, len(file_ids), result)
264
+ except Exception:
265
+ log.debug("on_progress callback failed", exc_info=True)
266
+
267
+ all_failed = failed == len(file_ids)
268
+ final_status = "failed" if all_failed else "completed"
269
+ async with db_factory() as session:
270
+ job = await session.get(AIBatchJob, job_id)
271
+ if job:
272
+ job.status = final_status
273
+ job.credits_consumed = credits
274
+ job.completed_at = datetime.now(timezone.utc)
275
+ if all_failed:
276
+ job.error = "None of the files could be read."
277
+ session.add(job)
278
+ await session.commit()
279
+
280
+ try:
281
+ from celerp.notifications.service import create as create_notification
282
+ async with db_factory() as session:
283
+ if all_failed:
284
+ title = f"Could not read {failed} file(s)"
285
+ body = "None of the attached files could be read. Open the conversation for details."
286
+ else:
287
+ title = f"{completed} of {len(file_ids)} file(s) read"
288
+ body = (
289
+ f"{completed} read, {failed} could not be read. "
290
+ "Open the conversation to review the proposed entries."
291
+ )
292
+ await create_notification(
293
+ session, company_id, "ai", title, body,
294
+ user_id=user_id,
295
+ action_url=(
296
+ f"/ai?conversation={conversation_id}" if conversation_id else "/ai"
297
+ ),
298
+ priority="high",
299
+ )
300
+ await session.commit()
301
+ except Exception:
302
+ log.warning("Failed to create batch notification", exc_info=True)
303
+
304
+
305
+ async def fail_interrupted_jobs(session: AsyncSession) -> int:
306
+ """Mark every pending or running job as failed. Returns how many were marked.
307
+
308
+ Runs at process start: a job can only run inside the process that started
309
+ it, so anything still pending or running at boot was lost to the restart.
310
+ """
311
+ rows = (await session.execute(
312
+ select(AIBatchJob).where(AIBatchJob.status.in_(("pending", "running")))
313
+ )).scalars().all()
314
+ now = datetime.now(timezone.utc)
315
+ for job in rows:
316
+ job.status = "failed"
317
+ job.error = INTERRUPTED_ERROR
318
+ job.completed_at = now
319
+ session.add(job)
320
+ return len(rows)
321
+
322
+
323
+ async def get_batch_job(
324
+ session: AsyncSession,
325
+ job_id: uuid.UUID,
326
+ company_id: uuid.UUID,
327
+ user_id: uuid.UUID,
328
+ ) -> AIBatchJob | None:
329
+ """Get a batch job by ID, scoped to company and owning user."""
330
+ job = await session.get(AIBatchJob, job_id)
331
+ if job is None or job.company_id != company_id or job.user_id != user_id:
332
+ return None
333
+ return job
334
+
335
+
336
+ async def list_conversation_jobs(
337
+ session: AsyncSession,
338
+ conversation_id: uuid.UUID,
339
+ company_id: uuid.UUID,
340
+ user_id: uuid.UUID,
341
+ ) -> list[AIBatchJob]:
342
+ """Every job started from a conversation, oldest first."""
343
+ q = (
344
+ select(AIBatchJob)
345
+ .where(AIBatchJob.conversation_id == conversation_id, AIBatchJob.company_id == company_id, AIBatchJob.user_id == user_id)
346
+ .order_by(AIBatchJob.created_at.asc())
347
+ )
348
+ return list((await session.execute(q)).scalars().all())