celerp 2.3.0__tar.gz → 2.3.1__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 (645) hide show
  1. {celerp-2.3.0 → celerp-2.3.1}/PKG-INFO +1 -1
  2. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/field_schema.py +65 -33
  3. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/PKG-INFO +1 -1
  4. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/SOURCES.txt +13 -0
  5. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/scm_file_list.json +62 -0
  6. celerp-2.3.1/celerp.egg-info/scm_version.json +8 -0
  7. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/statement.html +56 -56
  8. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/celerp_ai/ui_routes.py +9 -8
  9. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-backup/celerp_backup/routes.py +1 -1
  10. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/routes.py +9 -1
  11. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/__init__.py +19 -0
  12. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/am.json +11 -0
  13. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/ar.json +11 -0
  14. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/de.json +11 -0
  15. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/en.json +11 -0
  16. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/es.json +11 -0
  17. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/fr.json +11 -0
  18. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/id.json +11 -0
  19. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/it.json +11 -0
  20. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/ja.json +11 -0
  21. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/pt.json +11 -0
  22. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/th.json +11 -0
  23. celerp-2.3.1/default_modules/celerp-labels/celerp_labels/locales/vi.json +11 -0
  24. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/ui_routes.py +10 -9
  25. {celerp-2.3.0 → celerp-2.3.1}/default_modules/first_party.lock.json +5 -5
  26. {celerp-2.3.0 → celerp-2.3.1}/ui/app.py +10 -8
  27. {celerp-2.3.0 → celerp-2.3.1}/ui/components/activity.py +133 -178
  28. {celerp-2.3.0 → celerp-2.3.1}/ui/components/backup.py +13 -8
  29. {celerp-2.3.0 → celerp-2.3.1}/ui/components/cloud_gate.py +12 -9
  30. {celerp-2.3.0 → celerp-2.3.1}/ui/components/currency.py +1 -1
  31. {celerp-2.3.0 → celerp-2.3.1}/ui/components/files.py +10 -5
  32. {celerp-2.3.0 → celerp-2.3.1}/ui/components/notes.py +2 -2
  33. {celerp-2.3.0 → celerp-2.3.1}/ui/components/report_kit.py +7 -7
  34. {celerp-2.3.0 → celerp-2.3.1}/ui/components/shell.py +194 -69
  35. {celerp-2.3.0 → celerp-2.3.1}/ui/components/table.py +183 -63
  36. {celerp-2.3.0 → celerp-2.3.1}/ui/i18n.py +14 -0
  37. celerp-2.3.1/ui/locales/am.json +3049 -0
  38. celerp-2.3.1/ui/locales/ar.json +3049 -0
  39. celerp-2.3.1/ui/locales/de.json +3049 -0
  40. {celerp-2.3.0 → celerp-2.3.1}/ui/locales/en.json +1430 -2
  41. celerp-2.3.1/ui/locales/es.json +3049 -0
  42. celerp-2.3.1/ui/locales/fr.json +3049 -0
  43. celerp-2.3.1/ui/locales/id.json +3049 -0
  44. celerp-2.3.1/ui/locales/it.json +3049 -0
  45. celerp-2.3.1/ui/locales/ja.json +3049 -0
  46. celerp-2.3.1/ui/locales/pt.json +3049 -0
  47. celerp-2.3.1/ui/locales/th.json +3049 -0
  48. celerp-2.3.1/ui/locales/vi.json +3049 -0
  49. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/account.py +2 -4
  50. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/accounting.py +4 -4
  51. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/accounting_import.py +20 -19
  52. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/auth.py +70 -82
  53. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/contacts.py +125 -111
  54. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/csv_import.py +77 -52
  55. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/dashboard.py +175 -47
  56. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/docs_import.py +18 -18
  57. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/documents.py +386 -336
  58. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/financial_reports.py +24 -24
  59. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/inventory.py +366 -345
  60. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/lists_import.py +18 -18
  61. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/manufacturing.py +122 -110
  62. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/modules_page.py +2 -2
  63. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/reconciliation.py +40 -47
  64. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/reports.py +72 -66
  65. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/search.py +28 -10
  66. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings.py +169 -177
  67. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_accounting.py +73 -71
  68. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_cloud.py +22 -22
  69. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_connectors.py +56 -29
  70. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_contacts.py +12 -12
  71. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_general.py +5 -5
  72. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_import.py +53 -52
  73. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_inventory.py +63 -70
  74. celerp-2.3.1/ui/routes/settings_manufacturing.py +153 -0
  75. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_payments.py +6 -5
  76. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_purchasing.py +6 -6
  77. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/settings_sales.py +48 -36
  78. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/setup.py +17 -18
  79. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/stars.py +12 -5
  80. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/subscriptions.py +24 -25
  81. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/subscriptions_import.py +18 -18
  82. {celerp-2.3.0 → celerp-2.3.1}/ui/static/app.css +3 -2
  83. celerp-2.3.0/celerp.egg-info/scm_version.json +0 -8
  84. celerp-2.3.0/ui/locales/ar.json +0 -1520
  85. celerp-2.3.0/ui/locales/de.json +0 -1520
  86. celerp-2.3.0/ui/locales/es.json +0 -1520
  87. celerp-2.3.0/ui/locales/fr.json +0 -1520
  88. celerp-2.3.0/ui/locales/id.json +0 -1520
  89. celerp-2.3.0/ui/locales/it.json +0 -1520
  90. celerp-2.3.0/ui/locales/ja.json +0 -1520
  91. celerp-2.3.0/ui/locales/pt.json +0 -1520
  92. celerp-2.3.0/ui/locales/th.json +0 -1520
  93. celerp-2.3.0/ui/locales/vi.json +0 -1520
  94. celerp-2.3.0/ui/routes/settings_manufacturing.py +0 -152
  95. {celerp-2.3.0 → celerp-2.3.1}/CLA.md +0 -0
  96. {celerp-2.3.0 → celerp-2.3.1}/CONTRIBUTING.md +0 -0
  97. {celerp-2.3.0 → celerp-2.3.1}/LICENSE +0 -0
  98. {celerp-2.3.0 → celerp-2.3.1}/LICENSING.md +0 -0
  99. {celerp-2.3.0 → celerp-2.3.1}/MANIFEST.in +0 -0
  100. {celerp-2.3.0 → celerp-2.3.1}/NOTICE +0 -0
  101. {celerp-2.3.0 → celerp-2.3.1}/README.md +0 -0
  102. {celerp-2.3.0 → celerp-2.3.1}/alembic.ini +0 -0
  103. {celerp-2.3.0 → celerp-2.3.1}/celerp/__init__.py +0 -0
  104. {celerp-2.3.0 → celerp-2.3.1}/celerp/__main__.py +0 -0
  105. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/__init__.py +0 -0
  106. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/batch.py +0 -0
  107. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/cleanup.py +0 -0
  108. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/commands.py +0 -0
  109. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/conversations.py +0 -0
  110. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/files.py +0 -0
  111. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/intent.py +0 -0
  112. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/llm.py +0 -0
  113. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/memory.py +0 -0
  114. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/models.py +0 -0
  115. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/page_count.py +0 -0
  116. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/quota.py +0 -0
  117. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/service.py +0 -0
  118. {celerp-2.3.0 → celerp-2.3.1}/celerp/ai/tools.py +0 -0
  119. {celerp-2.3.0 → celerp-2.3.1}/celerp/alembic.ini +0 -0
  120. {celerp-2.3.0 → celerp-2.3.1}/celerp/alembic_config.py +0 -0
  121. {celerp-2.3.0 → celerp-2.3.1}/celerp/cli.py +0 -0
  122. {celerp-2.3.0 → celerp-2.3.1}/celerp/compat.py +0 -0
  123. {celerp-2.3.0 → celerp-2.3.1}/celerp/compute/__init__.py +0 -0
  124. {celerp-2.3.0 → celerp-2.3.1}/celerp/compute/aggregations.py +0 -0
  125. {celerp-2.3.0 → celerp-2.3.1}/celerp/compute/valuation.py +0 -0
  126. {celerp-2.3.0 → celerp-2.3.1}/celerp/config.py +0 -0
  127. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/__init__.py +0 -0
  128. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/base.py +0 -0
  129. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/daily_scheduler.py +0 -0
  130. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/http.py +0 -0
  131. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/images.py +0 -0
  132. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/quickbooks.py +0 -0
  133. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/registry.py +0 -0
  134. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/relay_token.py +0 -0
  135. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/shopify.py +0 -0
  136. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/sync_runner.py +0 -0
  137. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/upsert.py +0 -0
  138. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/util.py +0 -0
  139. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/webhooks.py +0 -0
  140. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/woocommerce.py +0 -0
  141. {celerp-2.3.0 → celerp-2.3.1}/celerp/connectors/xero.py +0 -0
  142. {celerp-2.3.0 → celerp-2.3.1}/celerp/constants.py +0 -0
  143. {celerp-2.3.0 → celerp-2.3.1}/celerp/db.py +0 -0
  144. {celerp-2.3.0 → celerp-2.3.1}/celerp/embedded_pg.py +0 -0
  145. {celerp-2.3.0 → celerp-2.3.1}/celerp/events/__init__.py +0 -0
  146. {celerp-2.3.0 → celerp-2.3.1}/celerp/events/engine.py +0 -0
  147. {celerp-2.3.0 → celerp-2.3.1}/celerp/events/schemas.py +0 -0
  148. {celerp-2.3.0 → celerp-2.3.1}/celerp/events/types.py +0 -0
  149. {celerp-2.3.0 → celerp-2.3.1}/celerp/gateway/__init__.py +0 -0
  150. {celerp-2.3.0 → celerp-2.3.1}/celerp/gateway/client.py +0 -0
  151. {celerp-2.3.0 → celerp-2.3.1}/celerp/gateway/state.py +0 -0
  152. {celerp-2.3.0 → celerp-2.3.1}/celerp/importers/__init__.py +0 -0
  153. {celerp-2.3.0 → celerp-2.3.1}/celerp/importers/importer.py +0 -0
  154. {celerp-2.3.0 → celerp-2.3.1}/celerp/importers/schema.py +0 -0
  155. {celerp-2.3.0 → celerp-2.3.1}/celerp/main.py +0 -0
  156. {celerp-2.3.0 → celerp-2.3.1}/celerp/middleware.py +0 -0
  157. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/README.md +0 -0
  158. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/_auto_stamp.py +0 -0
  159. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/_data_reconcile.py +0 -0
  160. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/_json_compat.py +0 -0
  161. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/env.py +0 -0
  162. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/script.py.mako +0 -0
  163. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/a0b1c2d3e4f5_seed_landed_cost_clearing_accounts.py +0 -0
  164. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/a1b2c3d4e5f6_add_doc_share_tokens.py +0 -0
  165. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/b1c2d3e4f5a6_add_supporter_badges.py +0 -0
  166. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/b2c3d4e5f6a7_add_import_batches.py +0 -0
  167. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/b3c4d5e6f7a8_expand_role_permissions_to_role_grants.py +0 -0
  168. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/c1d2e3f4a5b6_add_marketplace.py +0 -0
  169. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/c2d3e4f5a6b7_add_is_sync_to_shopify.py +0 -0
  170. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/c4d5e6f7a8b9_account_cash_flow_category.py +0 -0
  171. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/d0e1f2a3b4c5_add_share_token_expiry.py +0 -0
  172. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/d2e3f4a5b6c7_add_password_reset_token.py +0 -0
  173. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/d5e6f7a8b9c0_rename_fx_rounding_to_fx_difference.py +0 -0
  174. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/e3f4a5b6c7d8_add_company_is_active.py +0 -0
  175. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/e4f5a6b7c8d9_backfill_connector_idempotency_key.py +0 -0
  176. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/e7c9a1b3d5f2_work_center_default_columns.py +0 -0
  177. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/f1a2b3c4d5e6_move_accounts_marketplace_to_modules.py +0 -0
  178. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/f6a7b8c9d0e1_seed_fx_rounding_account.py +0 -0
  179. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/f8a9b0c1d2e3_work_center_default_backfill.py +0 -0
  180. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/fd5de461e14e_initial_schema.py +0 -0
  181. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/g1h2i3j4k5l6_add_consignment_flag.py +0 -0
  182. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/h2i3j4k5l6m7_add_bank_accounts_and_reconciliation.py +0 -0
  183. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/j4k5l6m7n8o9_labels_db_persistence.py +0 -0
  184. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/k5l6m7n8o9p0_add_reconciliation_v2.py +0 -0
  185. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/l6m7n8o9p0q1_add_sync_runs_table.py +0 -0
  186. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/m7n8o9p0q1r2_add_connector_configs_and_outbound_queue.py +0 -0
  187. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/n8o9p0q1r2s3_backfill_payment_date.py +0 -0
  188. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/o9p0q1r2s3t4_backfill_item_price_fields.py +0 -0
  189. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/p1q2r3s4t5u6_add_session_registry_and_user_auth_state.py +0 -0
  190. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/q2r3s4t5u6v7_add_system_runtime_state.py +0 -0
  191. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/r3s4t5u6v7w8_add_projections_company_entity_type_index.py +0 -0
  192. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/s4t5u6v7w8x9_drop_user_company_id_role.py +0 -0
  193. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/t5u6v7w8x9y0_seed_inventory_sub_accounts.py +0 -0
  194. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/u6v7w8x9y0z1_backfill_item_prices_from_attributes.py +0 -0
  195. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/v7w8x9y0z1a2_backfill_purchase_unit_defaults.py +0 -0
  196. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/w8x9y0z1a2b3_backfill_category_unit_defaults.py +0 -0
  197. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/x7y8z9a0b1c2_add_projection_created_at.py +0 -0
  198. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/y8z9a0b1c2d3_per_company_ledger_idempotency.py +0 -0
  199. {celerp-2.3.0 → celerp-2.3.1}/celerp/migrations/versions/z9a0b1c2d3e4_work_centers.py +0 -0
  200. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/__init__.py +0 -0
  201. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/accounting.py +0 -0
  202. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/ai.py +0 -0
  203. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/auth.py +0 -0
  204. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/base.py +0 -0
  205. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/company.py +0 -0
  206. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/connector_config.py +0 -0
  207. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/import_batch.py +0 -0
  208. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/ledger.py +0 -0
  209. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/marketplace.py +0 -0
  210. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/notification.py +0 -0
  211. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/projections.py +0 -0
  212. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/share.py +0 -0
  213. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/supporter.py +0 -0
  214. {celerp-2.3.0 → celerp-2.3.1}/celerp/models/sync_run.py +0 -0
  215. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/__init__.py +0 -0
  216. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/api.py +0 -0
  217. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/audit.py +0 -0
  218. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/demotion.py +0 -0
  219. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/importer.py +0 -0
  220. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/license.py +0 -0
  221. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/loader.py +0 -0
  222. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/meta.py +0 -0
  223. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/migrations_runner.py +0 -0
  224. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/references.py +0 -0
  225. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/registry.py +0 -0
  226. {celerp-2.3.0 → celerp-2.3.1}/celerp/modules/slots.py +0 -0
  227. {celerp-2.3.0 → celerp-2.3.1}/celerp/notifications/__init__.py +0 -0
  228. {celerp-2.3.0 → celerp-2.3.1}/celerp/notifications/service.py +0 -0
  229. {celerp-2.3.0 → celerp-2.3.1}/celerp/notifications/sse.py +0 -0
  230. {celerp-2.3.0 → celerp-2.3.1}/celerp/output/__init__.py +0 -0
  231. {celerp-2.3.0 → celerp-2.3.1}/celerp/output/branding.py +0 -0
  232. {celerp-2.3.0 → celerp-2.3.1}/celerp/output/doc_print.py +0 -0
  233. {celerp-2.3.0 → celerp-2.3.1}/celerp/output/pdf.py +0 -0
  234. {celerp-2.3.0 → celerp-2.3.1}/celerp/output/share_render.py +0 -0
  235. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/__init__.py +0 -0
  236. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/engine.py +0 -0
  237. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/handlers/__init__.py +0 -0
  238. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/handlers/marketplace.py +0 -0
  239. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/handlers/scanning.py +0 -0
  240. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/handlers/shopify.py +0 -0
  241. {celerp-2.3.0 → celerp-2.3.1}/celerp/projections/handlers/system.py +0 -0
  242. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/__init__.py +0 -0
  243. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/auth.py +0 -0
  244. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/companies.py +0 -0
  245. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/debug.py +0 -0
  246. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/doctor.py +0 -0
  247. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/events.py +0 -0
  248. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/health.py +0 -0
  249. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/ledger.py +0 -0
  250. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/notifications.py +0 -0
  251. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/stars.py +0 -0
  252. {celerp-2.3.0 → celerp-2.3.1}/celerp/routers/system.py +0 -0
  253. {celerp-2.3.0 → celerp-2.3.1}/celerp/schemas/__init__.py +0 -0
  254. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/__init__.py +0 -0
  255. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/activity_redaction.py +0 -0
  256. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/attachments.py +0 -0
  257. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/auth.py +0 -0
  258. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/auto_je.py +0 -0
  259. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup.py +0 -0
  260. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup_export.py +0 -0
  261. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup_import.py +0 -0
  262. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup_repo.py +0 -0
  263. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup_scheduler.py +0 -0
  264. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/backup_state.py +0 -0
  265. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/cogs_backfill.py +0 -0
  266. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/cost_visibility.py +0 -0
  267. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/demo.py +0 -0
  268. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/dev_release_guard.py +0 -0
  269. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/email.py +0 -0
  270. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/fulfill.py +0 -0
  271. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/holdings.py +0 -0
  272. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/je_keys.py +0 -0
  273. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/landed_cost.py +0 -0
  274. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/line_measures.py +0 -0
  275. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/list_behavior.py +0 -0
  276. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/money.py +0 -0
  277. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/payments.py +0 -0
  278. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/permissions.py +0 -0
  279. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/pick.py +0 -0
  280. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/pricing.py +0 -0
  281. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/relay_share.py +0 -0
  282. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/reorder.py +0 -0
  283. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/runtime_state.py +0 -0
  284. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/session_tracker.py +0 -0
  285. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/shipping.py +0 -0
  286. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/star_cta.py +0 -0
  287. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/status_doc_backfill.py +0 -0
  288. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/supporter_badge.py +0 -0
  289. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/system_health.py +0 -0
  290. {celerp-2.3.0 → celerp-2.3.1}/celerp/services/units.py +0 -0
  291. {celerp-2.3.0 → celerp-2.3.1}/celerp/session_gate.py +0 -0
  292. {celerp-2.3.0 → celerp-2.3.1}/celerp/tax_regimes.py +0 -0
  293. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/dependency_links.txt +0 -0
  294. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/entry_points.txt +0 -0
  295. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/requires.txt +0 -0
  296. {celerp-2.3.0 → celerp-2.3.1}/celerp.egg-info/top_level.txt +0 -0
  297. {celerp-2.3.0 → celerp-2.3.1}/conftest.py +0 -0
  298. {celerp-2.3.0 → celerp-2.3.1}/conftest_support.py +0 -0
  299. {celerp-2.3.0 → celerp-2.3.1}/default_modules/__init__.py +0 -0
  300. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/LICENSE +0 -0
  301. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/__init__.py +0 -0
  302. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/__init__.py +0 -0
  303. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/api_setup.py +0 -0
  304. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/csv_parser.py +0 -0
  305. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/matcher.py +0 -0
  306. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/models.py +0 -0
  307. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/projections.py +0 -0
  308. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/routes.py +0 -0
  309. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/celerp_accounting/ui_routes.py +0 -0
  310. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/balance-sheet.html +0 -0
  311. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/cash-flow.html +0 -0
  312. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-csv.csv +0 -0
  313. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/extended-journal-print.html +0 -0
  314. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/extended-journal.html +0 -0
  315. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/general-ledger.html +0 -0
  316. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/journal-csv.csv +0 -0
  317. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/journal-print.html +0 -0
  318. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/journal.html +0 -0
  319. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/ledger.html +0 -0
  320. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/pnl.html +0 -0
  321. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/report_goldens/trial-balance.html +0 -0
  322. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_accounting_banking.py +0 -0
  323. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_accounting_banking_routers.py +0 -0
  324. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_accounting_gaps.py +0 -0
  325. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_accounting_import_idempotency.py +0 -0
  326. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_cash_flow.py +0 -0
  327. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_financial_reports_ui.py +0 -0
  328. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_journal_gl_soa.py +0 -0
  329. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_journal_gl_soa_ui.py +0 -0
  330. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_reconciliation_v2.py +0 -0
  331. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_reports_end_to_end.py +0 -0
  332. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-accounting/tests/test_route_permissions.py +0 -0
  333. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-admin/__init__.py +0 -0
  334. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-admin/celerp_admin/__init__.py +0 -0
  335. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-admin/celerp_admin/routes.py +0 -0
  336. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-admin/celerp_admin/setup.py +0 -0
  337. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/__init__.py +0 -0
  338. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/celerp_ai/__init__.py +0 -0
  339. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/celerp_ai/routes.py +0 -0
  340. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/celerp_ai/setup.py +0 -0
  341. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/conftest.py +0 -0
  342. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_batch.py +0 -0
  343. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_cleanup.py +0 -0
  344. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_conversations.py +0 -0
  345. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_coverage_gaps.py +0 -0
  346. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_intent.py +0 -0
  347. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_llm.py +0 -0
  348. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_memory.py +0 -0
  349. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_models.py +0 -0
  350. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_page_count.py +0 -0
  351. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_quota.py +0 -0
  352. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_router.py +0 -0
  353. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_routes_coverage.py +0 -0
  354. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_service.py +0 -0
  355. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-ai/tests/test_tools.py +0 -0
  356. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-backup/__init__.py +0 -0
  357. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-backup/celerp_backup/__init__.py +0 -0
  358. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-backup/celerp_backup/setup.py +0 -0
  359. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/__init__.py +0 -0
  360. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/celerp_connectors/__init__.py +0 -0
  361. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/celerp_connectors/models.py +0 -0
  362. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/celerp_connectors/routes.py +0 -0
  363. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/__init__.py +0 -0
  364. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/conftest.py +0 -0
  365. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_compliance.py +0 -0
  366. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_connector_correctness.py +0 -0
  367. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_connectors.py +0 -0
  368. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_credentials_routes.py +0 -0
  369. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_images.py +0 -0
  370. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_outbound.py +0 -0
  371. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_quickbooks.py +0 -0
  372. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_rate_limiting.py +0 -0
  373. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_shopify.py +0 -0
  374. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_wiring.py +0 -0
  375. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_woocommerce.py +0 -0
  376. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_woocommerce_webhooks.py +0 -0
  377. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-connectors/tests/test_xero.py +0 -0
  378. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/LICENSE +0 -0
  379. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/__init__.py +0 -0
  380. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/__init__.py +0 -0
  381. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/migrations.py +0 -0
  382. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/projections.py +0 -0
  383. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/routes.py +0 -0
  384. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/services.py +0 -0
  385. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-contacts/celerp_contacts/ui_routes.py +0 -0
  386. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-dashboard/LICENSE +0 -0
  387. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-dashboard/__init__.py +0 -0
  388. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-dashboard/celerp_dashboard/__init__.py +0 -0
  389. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-dashboard/celerp_dashboard/routes.py +0 -0
  390. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-dashboard/celerp_dashboard/setup.py +0 -0
  391. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/LICENSE +0 -0
  392. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/__init__.py +0 -0
  393. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/__init__.py +0 -0
  394. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/api_setup.py +0 -0
  395. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/doc_constants.py +0 -0
  396. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/doc_email.py +0 -0
  397. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/doc_projections.py +0 -0
  398. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/doc_service.py +0 -0
  399. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/models_share.py +0 -0
  400. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/routes.py +0 -0
  401. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/routes_payments.py +0 -0
  402. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/routes_share.py +0 -0
  403. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/sequences.py +0 -0
  404. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/taxes.py +0 -0
  405. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/celerp_docs/ui_routes.py +0 -0
  406. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/conftest.py +0 -0
  407. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_audits.py +0 -0
  408. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_consolidate_lots.py +0 -0
  409. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_freight_je.py +0 -0
  410. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_freight_lines.py +0 -0
  411. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_fulfill_no_split.py +0 -0
  412. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_fulfillment_activity.py +0 -0
  413. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_inbound_je_lifecycle.py +0 -0
  414. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_inventory_account_reconciliation.py +0 -0
  415. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_landed_receive.py +0 -0
  416. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_line_delete_persist.py +0 -0
  417. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_line_identifier.py +0 -0
  418. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_payment_void_activity.py +0 -0
  419. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_receive_sku_batch.py +0 -0
  420. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_send_visibility.py +0 -0
  421. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_service_lines.py +0 -0
  422. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_void_guards.py +0 -0
  423. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-docs/tests/test_writeoffs.py +0 -0
  424. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/LICENSE +0 -0
  425. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/__init__.py +0 -0
  426. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/__init__.py +0 -0
  427. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/models_import_batch.py +0 -0
  428. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/projections.py +0 -0
  429. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/routes_attachments.py +0 -0
  430. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/routes_scanning.py +0 -0
  431. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/services.py +0 -0
  432. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/celerp_inventory/ui_routes.py +0 -0
  433. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/tests/test_item_recipe_projection.py +0 -0
  434. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/tests/test_item_workflow_projection.py +0 -0
  435. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-inventory/tests/test_landed_cost_projection.py +0 -0
  436. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/LICENSE +0 -0
  437. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/__init__.py +0 -0
  438. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/models.py +0 -0
  439. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/presets.py +0 -0
  440. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/routes.py +0 -0
  441. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/celerp_labels/service.py +0 -0
  442. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/requirements.txt +0 -0
  443. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/tests/test_labels.py +0 -0
  444. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-labels/tests/test_labels_module.py +0 -0
  445. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/LICENSE +0 -0
  446. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/__init__.py +0 -0
  447. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/__init__.py +0 -0
  448. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/costing.py +0 -0
  449. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/expansion.py +0 -0
  450. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/labor.py +0 -0
  451. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/migrations.py +0 -0
  452. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/projection_handler.py +0 -0
  453. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/routes.py +0 -0
  454. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/celerp_manufacturing/ui_routes.py +0 -0
  455. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/requirements.txt +0 -0
  456. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_auto_complete_on_finalize.py +0 -0
  457. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_bom_removed.py +0 -0
  458. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_build_api.py +0 -0
  459. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_item_recipe_api.py +0 -0
  460. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_item_workflow_api.py +0 -0
  461. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_labor_providers.py +0 -0
  462. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_manufacture_from_doc.py +0 -0
  463. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_manufacturing.py +0 -0
  464. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_manufacturing_import_idempotency.py +0 -0
  465. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_manufacturing_module.py +0 -0
  466. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_mfg_events.py +0 -0
  467. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_phase2_manufacturing_validations.py +0 -0
  468. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_production_order.py +0 -0
  469. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_recipe_costing.py +0 -0
  470. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_recipe_expansion.py +0 -0
  471. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_recost_api.py +0 -0
  472. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_run_records.py +0 -0
  473. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_to_make_allocation.py +0 -0
  474. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_where_used.py +0 -0
  475. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_work_centers_and_settings.py +0 -0
  476. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-manufacturing/tests/test_workflow_time.py +0 -0
  477. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/LICENSE +0 -0
  478. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/__init__.py +0 -0
  479. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/celerp_reports/__init__.py +0 -0
  480. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/celerp_reports/api_setup.py +0 -0
  481. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/celerp_reports/routes.py +0 -0
  482. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/celerp_reports/ui_routes.py +0 -0
  483. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/tests/test_reports_full.py +0 -0
  484. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-reports/tests/test_reports_unit.py +0 -0
  485. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/LICENSE +0 -0
  486. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/__init__.py +0 -0
  487. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/celerp_subscriptions/__init__.py +0 -0
  488. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/celerp_subscriptions/routes.py +0 -0
  489. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/celerp_subscriptions/ui_routes.py +0 -0
  490. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/tests/test_subscriptions.py +0 -0
  491. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-subscriptions/tests/test_subscriptions_ui.py +0 -0
  492. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/LICENSE +0 -0
  493. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/__init__.py +0 -0
  494. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/__init__.py +0 -0
  495. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/accessory_fashion.json +0 -0
  496. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/activewear.json +0 -0
  497. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/art_photography.json +0 -0
  498. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/audio_equipment.json +0 -0
  499. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/bag_handbag.json +0 -0
  500. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/banknote.json +0 -0
  501. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/beauty_tool.json +0 -0
  502. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/bed_bedroom.json +0 -0
  503. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/beer.json +0 -0
  504. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/beverage_nonalc.json +0 -0
  505. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/body_part_auto.json +0 -0
  506. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/book.json +0 -0
  507. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/bottoms.json +0 -0
  508. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/brake_suspension.json +0 -0
  509. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/bullion_coin.json +0 -0
  510. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/camera.json +0 -0
  511. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/colored_stone.json +0 -0
  512. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/comic.json +0 -0
  513. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/commercial_space.json +0 -0
  514. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/component_part.json +0 -0
  515. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/confectionery.json +0 -0
  516. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/consulting_service.json +0 -0
  517. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/decorative_art.json +0 -0
  518. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/diamond.json +0 -0
  519. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/drawing.json +0 -0
  520. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/dress_jumpsuit.json +0 -0
  521. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_auto.json +0 -0
  522. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/electrical_component.json +0 -0
  523. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/emerald.json +0 -0
  524. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/engine_part.json +0 -0
  525. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fastener.json +0 -0
  526. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fertilizer_chemical.json +0 -0
  527. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/film_video.json +0 -0
  528. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fine_writing_instrument.json +0 -0
  529. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fluid_lubricant.json +0 -0
  530. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/footwear.json +0 -0
  531. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fragrance.json +0 -0
  532. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_food.json +0 -0
  533. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/fresh_produce.json +0 -0
  534. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/frozen_food.json +0 -0
  535. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/gaming_console.json +0 -0
  536. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/gold_bullion.json +0 -0
  537. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/grain_cereal.json +0 -0
  538. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/haircare.json +0 -0
  539. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/hand_tool.json +0 -0
  540. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/ingredient_bulk.json +0 -0
  541. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/interior_part.json +0 -0
  542. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/jewelry.json +0 -0
  543. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/kitchen_dining.json +0 -0
  544. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/laptop.json +0 -0
  545. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/lighting.json +0 -0
  546. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/livestock_feed.json +0 -0
  547. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/makeup.json +0 -0
  548. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/measuring_instrument.json +0 -0
  549. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/medal_token.json +0 -0
  550. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/mineral_specimen.json +0 -0
  551. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/mobile_phone.json +0 -0
  552. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/music_cd.json +0 -0
  553. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/music_vinyl.json +0 -0
  554. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/nail.json +0 -0
  555. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/numismatic_coin.json +0 -0
  556. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/outdoor_furniture.json +0 -0
  557. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/outerwear.json +0 -0
  558. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/packaged_food.json +0 -0
  559. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/painting.json +0 -0
  560. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/parking_bay.json +0 -0
  561. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/pearl.json +0 -0
  562. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/personal_care.json +0 -0
  563. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/pipe_plumbing.json +0 -0
  564. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/platinum_bullion.json +0 -0
  565. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/power_tool.json +0 -0
  566. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/print_edition.json +0 -0
  567. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/residential_unit.json +0 -0
  568. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/rough_gemstone.json +0 -0
  569. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/ruby.json +0 -0
  570. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/saas_plan.json +0 -0
  571. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/safety_ppe.json +0 -0
  572. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/sapphire.json +0 -0
  573. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/sculpture.json +0 -0
  574. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/seating.json +0 -0
  575. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/seeds.json +0 -0
  576. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/silver_bullion.json +0 -0
  577. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/skincare.json +0 -0
  578. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/soft_furnishing.json +0 -0
  579. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/software_addon.json +0 -0
  580. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/software_license.json +0 -0
  581. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/spirit.json +0 -0
  582. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/storage_furniture.json +0 -0
  583. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/swimwear.json +0 -0
  584. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/table_desk.json +0 -0
  585. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/tablet.json +0 -0
  586. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/tire_wheel.json +0 -0
  587. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/tops.json +0 -0
  588. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/trading_card.json +0 -0
  589. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/tv_display.json +0 -0
  590. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/video_game.json +0 -0
  591. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/watch.json +0 -0
  592. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/watch_strap.json +0 -0
  593. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/categories/wine.json +0 -0
  594. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/agricultural.json +0 -0
  595. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/artwork.json +0 -0
  596. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/automotive.json +0 -0
  597. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/blank.json +0 -0
  598. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/books_media.json +0 -0
  599. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/coins_precious_metals.json +0 -0
  600. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/consulting.json +0 -0
  601. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/cosmetics.json +0 -0
  602. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/electronics.json +0 -0
  603. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/fashion.json +0 -0
  604. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/food_beverage.json +0 -0
  605. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/furniture.json +0 -0
  606. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/gemstones.json +0 -0
  607. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/hardware.json +0 -0
  608. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/property_rental.json +0 -0
  609. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/saas.json +0 -0
  610. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/watches.json +0 -0
  611. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/presets/wine_spirits.json +0 -0
  612. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/routes.py +0 -0
  613. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/celerp_verticals/ui_routes.py +0 -0
  614. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/tests/test_verticals.py +0 -0
  615. {celerp-2.3.0 → celerp-2.3.1}/default_modules/celerp-verticals/tests/test_verticals_routers.py +0 -0
  616. {celerp-2.3.0 → celerp-2.3.1}/legal/OFFICIAL-COMPONENTS.md +0 -0
  617. {celerp-2.3.0 → celerp-2.3.1}/legal/TRADEMARK.md +0 -0
  618. {celerp-2.3.0 → celerp-2.3.1}/packaging/winget/Celerp.Celerp.installer.yaml +0 -0
  619. {celerp-2.3.0 → celerp-2.3.1}/packaging/winget/Celerp.Celerp.locale.en-US.yaml +0 -0
  620. {celerp-2.3.0 → celerp-2.3.1}/packaging/winget/Celerp.Celerp.yaml +0 -0
  621. {celerp-2.3.0 → celerp-2.3.1}/packaging/winget/README.md +0 -0
  622. {celerp-2.3.0 → celerp-2.3.1}/pyproject.toml +0 -0
  623. {celerp-2.3.0 → celerp-2.3.1}/setup.cfg +0 -0
  624. {celerp-2.3.0 → celerp-2.3.1}/test_helpers.py +0 -0
  625. {celerp-2.3.0 → celerp-2.3.1}/ui/__init__.py +0 -0
  626. {celerp-2.3.0 → celerp-2.3.1}/ui/api_client.py +0 -0
  627. {celerp-2.3.0 → celerp-2.3.1}/ui/components/__init__.py +0 -0
  628. {celerp-2.3.0 → celerp-2.3.1}/ui/components/attrs.py +0 -0
  629. {celerp-2.3.0 → celerp-2.3.1}/ui/components/journal.py +0 -0
  630. {celerp-2.3.0 → celerp-2.3.1}/ui/components/phone.py +0 -0
  631. {celerp-2.3.0 → celerp-2.3.1}/ui/config.py +0 -0
  632. {celerp-2.3.0 → celerp-2.3.1}/ui/marketplace_catalog.py +0 -0
  633. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/__init__.py +0 -0
  634. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/events.py +0 -0
  635. {celerp-2.3.0 → celerp-2.3.1}/ui/routes/notifications.py +0 -0
  636. {celerp-2.3.0 → celerp-2.3.1}/ui/security.py +0 -0
  637. {celerp-2.3.0 → celerp-2.3.1}/ui/static/htmx.min.js +0 -0
  638. {celerp-2.3.0 → celerp-2.3.1}/ui/static/icon.png +0 -0
  639. {celerp-2.3.0 → celerp-2.3.1}/ui/static/logo.png +0 -0
  640. {celerp-2.3.0 → celerp-2.3.1}/ui/static/vendor/intl-tel-input/img/flags.webp +0 -0
  641. {celerp-2.3.0 → celerp-2.3.1}/ui/static/vendor/intl-tel-input/img/flags@2x.webp +0 -0
  642. {celerp-2.3.0 → celerp-2.3.1}/ui/static/vendor/intl-tel-input/intlTelInput.min.css +0 -0
  643. {celerp-2.3.0 → celerp-2.3.1}/ui/static/vendor/intl-tel-input/intlTelInput.min.js +0 -0
  644. {celerp-2.3.0 → celerp-2.3.1}/ui/static/vendor/intl-tel-input/intlTelInputWithUtils.min.js +0 -0
  645. {celerp-2.3.0 → celerp-2.3.1}/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.0
3
+ Version: 2.3.1
4
4
  Summary: Free, self-hosted ERP for small businesses
5
5
  License: Business Source License 1.1
6
6
 
@@ -44,42 +44,74 @@ _DEFAULT_PRICE_LISTS: list[dict] = [
44
44
 
45
45
  # Base schema fields (without price columns - those are injected dynamically)
46
46
  _BASE_FIELDS: list[dict] = [
47
- {"key": "sku", "label": "SKU", "type": "text", "editable": True, "required": True, "options": [], "visible_to_roles": [], "position": 0, "show_in_table": True},
48
- {"key": "name", "label": "Name", "type": "text", "editable": True, "required": True, "options": [], "visible_to_roles": [], "position": 1, "show_in_table": True},
49
- {"key": "category", "label": "Category", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 2, "show_in_table": True},
50
- {"key": "quantity", "label": "Qty", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3, "show_in_table": True, "tooltip_key": "field.tooltip.quantity"},
51
- {"key": "sell_by", "label": "Sell Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.05,"show_in_table": False, "tooltip_key": "field.tooltip.sell_by"},
52
- {"key": "weight", "label": "Net Weight", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.02, "show_in_table": True, "tooltip_key": "field.tooltip.weight"},
53
- {"key": "weight_unit", "label": "Net Weight Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.15,"show_in_table": False, "tooltip_key": "field.tooltip.weight_unit"},
54
- {"key": "pieces", "label": "Pieces", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.06,"show_in_table": True, "tooltip_key": "field.tooltip.pieces"},
55
- {"key": "reorder_point", "label": "Reorder Point", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.7, "show_in_table": False, "tooltip_key": "field.tooltip.reorder_point"},
56
- {"key": "reorder_qty", "label": "Reorder Qty", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.72,"show_in_table": False, "tooltip_key": "field.tooltip.reorder_qty"},
57
- {"key": "gross_weight", "label": "Gross Weight", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.25,"show_in_table": False, "tooltip_key": "field.tooltip.gross_weight"},
58
- {"key": "gross_weight_unit", "label": "Gross Weight Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.3, "show_in_table": False, "tooltip_key": "field.tooltip.gross_weight_unit"},
59
- {"key": "inventory_type", "label": "Inventory Type", "type": "select", "editable": True, "required": False, "options": ["stocked", "component", "non_stocked", "service", "freight"], "visible_to_roles": [], "position": 4.2, "show_in_table": False, "tooltip_key": "field.tooltip.inventory_type"},
60
- {"key": "allow_splitting", "label": "Allow Splitting", "type": "bool", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 4.5, "show_in_table": False, "tooltip_key": "field.tooltip.allow_splitting"},
61
- {"key": "pick_method", "label": "Stock Cutting", "type": "select", "editable": True, "required": False, "options": ["default", "fifo", "fefo", "lifo"], "visible_to_roles": [], "position": 4.6, "show_in_table": False, "tooltip_key": "field.tooltip.pick_method"},
62
- {"key": "location_name", "label": "Location", "type": "text", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 5, "show_in_table": True, "tooltip_key": "field.tooltip.location_name"},
47
+ {"key": "sku", "label": "SKU", "type": "text", "editable": True, "required": True, "options": [], "visible_to_roles": [], "position": 0, "show_in_table": True, "label_key": "field.label.sku"},
48
+ {"key": "name", "label": "Name", "type": "text", "editable": True, "required": True, "options": [], "visible_to_roles": [], "position": 1, "show_in_table": True, "label_key": "field.label.name"},
49
+ {"key": "category", "label": "Category", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 2, "show_in_table": True, "label_key": "field.label.category"},
50
+ {"key": "quantity", "label": "Qty", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3, "show_in_table": True, "tooltip_key": "field.tooltip.quantity", "label_key": "field.label.quantity"},
51
+ {"key": "sell_by", "label": "Sell Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.05,"show_in_table": False, "tooltip_key": "field.tooltip.sell_by", "label_key": "field.label.sell_by"},
52
+ {"key": "weight", "label": "Net Weight", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.02, "show_in_table": True, "tooltip_key": "field.tooltip.weight", "label_key": "field.label.weight"},
53
+ {"key": "weight_unit", "label": "Net Weight Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.15,"show_in_table": False, "tooltip_key": "field.tooltip.weight_unit", "label_key": "field.label.weight_unit"},
54
+ {"key": "pieces", "label": "Pieces", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.06,"show_in_table": True, "tooltip_key": "field.tooltip.pieces", "label_key": "field.label.pieces"},
55
+ {"key": "reorder_point", "label": "Reorder Point", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.7, "show_in_table": False, "tooltip_key": "field.tooltip.reorder_point", "label_key": "field.label.reorder_point"},
56
+ {"key": "reorder_qty", "label": "Reorder Qty", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.72,"show_in_table": False, "tooltip_key": "field.tooltip.reorder_qty", "label_key": "field.label.reorder_qty"},
57
+ {"key": "gross_weight", "label": "Gross Weight", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.25,"show_in_table": False, "tooltip_key": "field.tooltip.gross_weight", "label_key": "field.label.gross_weight"},
58
+ {"key": "gross_weight_unit", "label": "Gross Weight Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 3.3, "show_in_table": False, "tooltip_key": "field.tooltip.gross_weight_unit", "label_key": "field.label.gross_weight_unit"},
59
+ {"key": "inventory_type", "label": "Inventory Type", "type": "select", "editable": True, "required": False, "options": ["stocked", "component", "non_stocked", "service", "freight"], "visible_to_roles": [], "position": 4.2, "show_in_table": False, "tooltip_key": "field.tooltip.inventory_type", "label_key": "field.label.inventory_type"},
60
+ {"key": "allow_splitting", "label": "Allow Splitting", "type": "bool", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 4.5, "show_in_table": False, "tooltip_key": "field.tooltip.allow_splitting", "label_key": "field.label.allow_splitting"},
61
+ {"key": "pick_method", "label": "Stock Cutting", "type": "select", "editable": True, "required": False, "options": ["default", "fifo", "fefo", "lifo"], "visible_to_roles": [], "position": 4.6, "show_in_table": False, "tooltip_key": "field.tooltip.pick_method", "label_key": "field.label.pick_method"},
62
+ {"key": "location_name", "label": "Location", "type": "text", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 5, "show_in_table": True, "tooltip_key": "field.tooltip.location_name", "label_key": "field.label.location_name"},
63
63
  # Price columns are injected dynamically at position 6+ by _inject_price_columns()
64
64
  # Read-only: status changes only through dedicated actions (Make Available, Revert
65
65
  # to Draft), never a free-form dropdown edit - same convention as document status.
66
- {"key": "status", "label": "Status", "type": "status", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 100, "show_in_table": True},
67
- {"key": "short_description", "label": "Short Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 101, "show_in_table": False},
68
- {"key": "description", "label": "Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 102, "show_in_table": False},
69
- {"key": "notes", "label": "Notes", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 103, "show_in_table": False},
70
- {"key": "barcode", "label": "Barcode", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104, "show_in_table": True, "tooltip_key": "field.tooltip.barcode"},
71
- {"key": "hs_code", "label": "HS Code", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.5, "show_in_table": False, "tooltip_key": "field.tooltip.hs_code"},
72
- {"key": "country_of_origin", "label": "Country of Origin", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.52,"show_in_table": False, "tooltip_key": "field.tooltip.country_of_origin"},
73
- {"key": "preferred_supplier","label": "Preferred Supplier","type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.54,"show_in_table": False, "tooltip_key": "field.tooltip.preferred_supplier"},
74
- {"key": "batch_no", "label": "Batch / Lot No", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.55,"show_in_table": False, "tooltip_key": "field.tooltip.batch_no"},
75
- {"key": "purchase_sku", "label": "Purchase SKU", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.6, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_sku"},
76
- {"key": "purchase_name", "label": "Purchase Name", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.7, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_name"},
77
- {"key": "purchase_unit", "label": "Purchase Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.8, "show_in_table": True, "tooltip_key": "field.tooltip.purchase_unit"},
78
- {"key": "purchase_conversion_factor","label": "Conversion Factor", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.9, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_conversion_factor"},
79
- {"key": "created_at", "label": "Created", "type": "date", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 107, "show_in_table": False},
80
- {"key": "updated_at", "label": "Updated", "type": "date", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 108, "show_in_table": False},
66
+ {"key": "status", "label": "Status", "type": "status", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 100, "show_in_table": True, "label_key": "field.label.status"},
67
+ {"key": "short_description", "label": "Short Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 101, "show_in_table": False, "label_key": "field.label.short_description"},
68
+ {"key": "description", "label": "Description", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 102, "show_in_table": False, "label_key": "field.label.description"},
69
+ {"key": "notes", "label": "Notes", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 103, "show_in_table": False, "label_key": "field.label.notes"},
70
+ {"key": "barcode", "label": "Barcode", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104, "show_in_table": True, "tooltip_key": "field.tooltip.barcode", "label_key": "field.label.barcode"},
71
+ {"key": "hs_code", "label": "HS Code", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.5, "show_in_table": False, "tooltip_key": "field.tooltip.hs_code", "label_key": "field.label.hs_code"},
72
+ {"key": "country_of_origin", "label": "Country of Origin", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.52,"show_in_table": False, "tooltip_key": "field.tooltip.country_of_origin", "label_key": "field.label.country_of_origin"},
73
+ {"key": "preferred_supplier","label": "Preferred Supplier","type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.54,"show_in_table": False, "tooltip_key": "field.tooltip.preferred_supplier", "label_key": "field.label.preferred_supplier"},
74
+ {"key": "batch_no", "label": "Batch / Lot No", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.55,"show_in_table": False, "tooltip_key": "field.tooltip.batch_no", "label_key": "field.label.batch_no"},
75
+ {"key": "purchase_sku", "label": "Purchase SKU", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.6, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_sku", "label_key": "field.label.purchase_sku"},
76
+ {"key": "purchase_name", "label": "Purchase Name", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.7, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_name", "label_key": "field.label.purchase_name"},
77
+ {"key": "purchase_unit", "label": "Purchase Unit", "type": "text", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.8, "show_in_table": True, "tooltip_key": "field.tooltip.purchase_unit", "label_key": "field.label.purchase_unit"},
78
+ {"key": "purchase_conversion_factor","label": "Conversion Factor", "type": "number", "editable": True, "required": False, "options": [], "visible_to_roles": [], "position": 104.9, "show_in_table": False, "tooltip_key": "field.tooltip.purchase_conversion_factor", "label_key": "field.label.purchase_conversion_factor"},
79
+ {"key": "created_at", "label": "Created", "type": "date", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 107, "show_in_table": False, "label_key": "field.label.created_at"},
80
+ {"key": "updated_at", "label": "Updated", "type": "date", "editable": False, "required": False, "options": [], "visible_to_roles": [], "position": 108, "show_in_table": False, "label_key": "field.label.updated_at"},
81
81
  ]
82
82
 
83
+ # Built-in fields keyed for O(1) lookup when rehydrating stripped metadata.
84
+ _BASE_FIELD_BY_KEY: dict[str, dict] = {f["key"]: f for f in _BASE_FIELDS}
85
+
86
+
87
+ def _rehydrate_builtin_metadata(schema: list[dict]) -> list[dict]:
88
+ """Reattach canonical label_key/tooltip_key to built-in fields.
89
+
90
+ The item schema PATCH model does not carry label_key or tooltip_key, so a
91
+ company that customizes its schema stores built-in fields stripped of both.
92
+ Reattach them from _BASE_FIELDS, keyed strictly on built-in membership so
93
+ custom fields and dynamic price columns are never touched. label_key is
94
+ restored only when the stored label still equals the canonical English label
95
+ (a user-renamed built-in keeps its literal label and is never translated);
96
+ tooltip_key is restored for every built-in key, since there is no
97
+ custom-tooltip edit path. Idempotent: a field that already carries a key is
98
+ left as-is."""
99
+ out: list[dict] = []
100
+ for f in schema:
101
+ base = _BASE_FIELD_BY_KEY.get(f.get("key"))
102
+ if base is None:
103
+ out.append(f)
104
+ continue
105
+ updated = dict(f)
106
+ if ("label_key" not in updated and base.get("label_key")
107
+ and updated.get("label") == base.get("label")):
108
+ updated["label_key"] = base["label_key"]
109
+ if "tooltip_key" not in updated and base.get("tooltip_key"):
110
+ updated["tooltip_key"] = base["tooltip_key"]
111
+ out.append(updated)
112
+ return out
113
+
114
+
83
115
  def _inject_price_columns(base: list[dict], price_lists: list[dict]) -> list[dict]:
84
116
  """Insert a money column for each price list after position 5 (location).
85
117
 
@@ -190,5 +222,5 @@ async def get_effective_field_schema(
190
222
  keys_in_cat = {f["key"] for f in cat_fields}
191
223
  merged = [f for f in base_schema if f["key"] not in keys_in_cat]
192
224
  merged.extend(cat_fields)
193
- return merged
194
- return base_schema
225
+ return _rehydrate_builtin_metadata(merged)
226
+ return _rehydrate_builtin_metadata(base_schema)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: celerp
3
- Version: 2.3.0
3
+ Version: 2.3.1
4
4
  Summary: Free, self-hosted ERP for small businesses
5
5
  License: Business Source License 1.1
6
6
 
@@ -360,6 +360,18 @@ default_modules/celerp-labels/celerp_labels/presets.py
360
360
  default_modules/celerp-labels/celerp_labels/routes.py
361
361
  default_modules/celerp-labels/celerp_labels/service.py
362
362
  default_modules/celerp-labels/celerp_labels/ui_routes.py
363
+ default_modules/celerp-labels/celerp_labels/locales/am.json
364
+ default_modules/celerp-labels/celerp_labels/locales/ar.json
365
+ default_modules/celerp-labels/celerp_labels/locales/de.json
366
+ default_modules/celerp-labels/celerp_labels/locales/en.json
367
+ default_modules/celerp-labels/celerp_labels/locales/es.json
368
+ default_modules/celerp-labels/celerp_labels/locales/fr.json
369
+ default_modules/celerp-labels/celerp_labels/locales/id.json
370
+ default_modules/celerp-labels/celerp_labels/locales/it.json
371
+ default_modules/celerp-labels/celerp_labels/locales/ja.json
372
+ default_modules/celerp-labels/celerp_labels/locales/pt.json
373
+ default_modules/celerp-labels/celerp_labels/locales/th.json
374
+ default_modules/celerp-labels/celerp_labels/locales/vi.json
363
375
  default_modules/celerp-labels/tests/test_labels.py
364
376
  default_modules/celerp-labels/tests/test_labels_module.py
365
377
  default_modules/celerp-manufacturing/LICENSE
@@ -559,6 +571,7 @@ ui/components/phone.py
559
571
  ui/components/report_kit.py
560
572
  ui/components/shell.py
561
573
  ui/components/table.py
574
+ ui/locales/am.json
562
575
  ui/locales/ar.json
563
576
  ui/locales/de.json
564
577
  ui/locales/en.json
@@ -361,6 +361,18 @@
361
361
  "default_modules/celerp-labels/LICENSE",
362
362
  "default_modules/celerp-labels/__init__.py",
363
363
  "default_modules/celerp-labels/celerp_labels/__init__.py",
364
+ "default_modules/celerp-labels/celerp_labels/locales/am.json",
365
+ "default_modules/celerp-labels/celerp_labels/locales/ar.json",
366
+ "default_modules/celerp-labels/celerp_labels/locales/de.json",
367
+ "default_modules/celerp-labels/celerp_labels/locales/en.json",
368
+ "default_modules/celerp-labels/celerp_labels/locales/es.json",
369
+ "default_modules/celerp-labels/celerp_labels/locales/fr.json",
370
+ "default_modules/celerp-labels/celerp_labels/locales/id.json",
371
+ "default_modules/celerp-labels/celerp_labels/locales/it.json",
372
+ "default_modules/celerp-labels/celerp_labels/locales/ja.json",
373
+ "default_modules/celerp-labels/celerp_labels/locales/pt.json",
374
+ "default_modules/celerp-labels/celerp_labels/locales/th.json",
375
+ "default_modules/celerp-labels/celerp_labels/locales/vi.json",
364
376
  "default_modules/celerp-labels/celerp_labels/models.py",
365
377
  "default_modules/celerp-labels/celerp_labels/presets.py",
366
378
  "default_modules/celerp-labels/celerp_labels/routes.py",
@@ -718,6 +730,7 @@
718
730
  "scripts/download-python.sh",
719
731
  "scripts/extract_i18n.py",
720
732
  "scripts/gen_first_party_lock.py",
733
+ "scripts/i18n_allowlist.json",
721
734
  "scripts/licenses.py",
722
735
  "scripts/module_setup.py",
723
736
  "scripts/publish_pypi.sh",
@@ -728,6 +741,8 @@
728
741
  "tests/fixtures/modules/celerp-testlang/locales/xr.json",
729
742
  "tests/fixtures/modules/celerp-testlang/locales/xx.json",
730
743
  "tests/helpers.py",
744
+ "tests/i18n_source_identical_allowlist.json",
745
+ "tests/test_activity_i18n.py",
731
746
  "tests/test_alembic_config.py",
732
747
  "tests/test_attachments.py",
733
748
  "tests/test_attr_stored_in_attributes.py",
@@ -847,12 +862,14 @@
847
862
  "tests/test_embedded_pg_manager.py",
848
863
  "tests/test_embedded_pg_modes.py",
849
864
  "tests/test_entity_files.py",
865
+ "tests/test_error_pages_i18n.py",
850
866
  "tests/test_event_schema_registry.py",
851
867
  "tests/test_events/test_item_events.py",
852
868
  "tests/test_events/test_item_file_events.py",
853
869
  "tests/test_events/test_other_events.py",
854
870
  "tests/test_events/test_phase2_events.py",
855
871
  "tests/test_events/test_phase2_projection_branches.py",
872
+ "tests/test_field_label_persistence.py",
856
873
  "tests/test_file_activity.py",
857
874
  "tests/test_fulfillment.py",
858
875
  "tests/test_gateway/__init__.py",
@@ -864,6 +881,49 @@
864
881
  "tests/test_gateway/test_state.py",
865
882
  "tests/test_holdings.py",
866
883
  "tests/test_i18n.py",
884
+ "tests/test_i18n_account.py",
885
+ "tests/test_i18n_accounting.py",
886
+ "tests/test_i18n_accounting_import.py",
887
+ "tests/test_i18n_auth.py",
888
+ "tests/test_i18n_backup.py",
889
+ "tests/test_i18n_cloud_gate.py",
890
+ "tests/test_i18n_contacts.py",
891
+ "tests/test_i18n_csv_import.py",
892
+ "tests/test_i18n_dashboard.py",
893
+ "tests/test_i18n_docs_import.py",
894
+ "tests/test_i18n_documents.py",
895
+ "tests/test_i18n_field_labels.py",
896
+ "tests/test_i18n_files.py",
897
+ "tests/test_i18n_financial_reports.py",
898
+ "tests/test_i18n_hardcoded_scan.py",
899
+ "tests/test_i18n_inventory.py",
900
+ "tests/test_i18n_journal.py",
901
+ "tests/test_i18n_lists_import.py",
902
+ "tests/test_i18n_manufacturing.py",
903
+ "tests/test_i18n_modules_page.py",
904
+ "tests/test_i18n_notes_phone.py",
905
+ "tests/test_i18n_reconciliation.py",
906
+ "tests/test_i18n_report_kit.py",
907
+ "tests/test_i18n_reports.py",
908
+ "tests/test_i18n_search.py",
909
+ "tests/test_i18n_settings.py",
910
+ "tests/test_i18n_settings_accounting.py",
911
+ "tests/test_i18n_settings_cloud.py",
912
+ "tests/test_i18n_settings_connectors.py",
913
+ "tests/test_i18n_settings_contacts.py",
914
+ "tests/test_i18n_settings_general.py",
915
+ "tests/test_i18n_settings_import.py",
916
+ "tests/test_i18n_settings_inventory.py",
917
+ "tests/test_i18n_settings_manufacturing.py",
918
+ "tests/test_i18n_settings_payments.py",
919
+ "tests/test_i18n_settings_sales.py",
920
+ "tests/test_i18n_setup.py",
921
+ "tests/test_i18n_shell.py",
922
+ "tests/test_i18n_small_mixed.py",
923
+ "tests/test_i18n_stars.py",
924
+ "tests/test_i18n_subscriptions.py",
925
+ "tests/test_i18n_subscriptions_import.py",
926
+ "tests/test_i18n_table.py",
867
927
  "tests/test_idempotency_per_company.py",
868
928
  "tests/test_import_history.py",
869
929
  "tests/test_import_relay_i1.py",
@@ -906,6 +966,7 @@
906
966
  "tests/test_module_i18n_seam.py",
907
967
  "tests/test_module_importer.py",
908
968
  "tests/test_module_load_errors.py",
969
+ "tests/test_module_locales.py",
909
970
  "tests/test_modules/__init__.py",
910
971
  "tests/test_modules/test_audit.py",
911
972
  "tests/test_modules/test_demotion.py",
@@ -1065,6 +1126,7 @@
1065
1126
  "ui/components/table.py",
1066
1127
  "ui/config.py",
1067
1128
  "ui/i18n.py",
1129
+ "ui/locales/am.json",
1068
1130
  "ui/locales/ar.json",
1069
1131
  "ui/locales/de.json",
1070
1132
  "ui/locales/en.json",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "2.3.1",
3
+ "distance": 0,
4
+ "node": "g17e6ebc8d420aa80646e630643710626ef87a06e",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-24"
8
+ }
@@ -16,67 +16,67 @@
16
16
  <button type="submit" class="btn btn--secondary btn--sm">Apply</button><script>(function(){var f=document.getElementById('dfb-from'),t=document.getElementById('dfb-to');if(!f||!t)return;f.addEventListener('change',function(){if(f.value)t.min=f.value;});t.addEventListener('change',function(){if(t.value)f.max=t.value;});})();</script></form><a href="/settings/general?tab=company" class="settings-gear" title="Related settings">⚙</a> </div>
17
17
  <div>
18
18
  <form enctype="multipart/form-data" method="get" action="/reports/statement" class="flex-row gap-sm"><label class="form-label">Account</label> <div data-multiple="true" data-count-label="{n} selected" data-empty-label="Search customers, suppliers and accounts" data-search-url="1" hx-get="/reports/statement/subject-options?account=c%3Acontact%3A<uuid>&amp;account=a%3A1120" hx-trigger="input from:.combobox-input changed delay:300ms" hx-swap="innerHTML" hx-include="find .combobox-input" hx-target="find .combobox-list" class="combobox-wrap">
19
- <input type="text" value="2 selected" placeholder="Search customers, suppliers and accounts" autocomplete="off" name="q" class="combobox-input">
19
+ <input type="text" value="2 selected" placeholder="Search customers, suppliers and accounts" autocomplete="off" name="q" role="combobox" aria-expanded="false" aria-haspopup="listbox" aria-autocomplete="list" class="combobox-input">
20
20
  <input type="hidden" data-name="account" value="">
21
21
  <div class="combobox-selected">
22
22
  <input type="hidden" name="account" value="c:contact:<uuid>" data-label="Riverside Supplies (customer)">
23
23
  <input type="hidden" name="account" value="a:1120" data-label="1120 Accounts Receivable">
24
24
  </div>
25
- <div class="combobox-list">
26
- <div data-value="c:contact:<uuid>" class="combobox-option">Owner (both)</div>
27
- <div data-value="c:contact:<uuid>" class="combobox-option combobox-option--selected">Riverside Supplies (customer)</div>
28
- <div data-value="a:1000" class="combobox-option">1000 Assets</div>
29
- <div data-value="a:1100" class="combobox-option">1100 Current Assets</div>
30
- <div data-value="a:1110" class="combobox-option">1110 Cash and Cash Equivalents</div>
31
- <div data-value="a:1111" class="combobox-option">1111 Default Bank Account (Checking)</div>
32
- <div data-value="a:1120" class="combobox-option combobox-option--selected">1120 Accounts Receivable</div>
33
- <div data-value="a:1130" class="combobox-option">1130 Inventory</div>
34
- <div data-value="a:1130-DTY" class="combobox-option">1130-DTY Inventory - Import Duty Clearing</div>
35
- <div data-value="a:1130-FRT" class="combobox-option">1130-FRT Inventory - Freight Clearing</div>
36
- <div data-value="a:1130-INS" class="combobox-option">1130-INS Inventory - Insurance Clearing</div>
37
- <div data-value="a:1130-IVT" class="combobox-option">1130-IVT Inventory - Non-Recoverable Import VAT Clearing</div>
38
- <div data-value="a:1130-OB" class="combobox-option">1130-OB Inventory - Opening Balance</div>
39
- <div data-value="a:1130-P" class="combobox-option">1130-P Inventory - Purchased</div>
40
- <div data-value="a:1140" class="combobox-option">1140 Prepaid Expenses</div>
41
- <div data-value="a:1150" class="combobox-option">1150 VAT Receivable (Input VAT)</div>
42
- <div data-value="a:1200" class="combobox-option">1200 Non-Current Assets</div>
43
- <div data-value="a:1210" class="combobox-option">1210 Property, Plant and Equipment</div>
44
- <div data-value="a:1220" class="combobox-option">1220 Accumulated Depreciation</div>
45
- <div data-value="a:1230" class="combobox-option">1230 Intangible Assets</div>
46
- <div data-value="a:2000" class="combobox-option">2000 Liabilities</div>
47
- <div data-value="a:2100" class="combobox-option">2100 Current Liabilities</div>
48
- <div data-value="a:2110" class="combobox-option">2110 Accounts Payable</div>
49
- <div data-value="a:2120" class="combobox-option">2120 VAT Payable (Output VAT)</div>
50
- <div data-value="a:2130" class="combobox-option">2130 Withholding Tax Payable</div>
51
- <div data-value="a:2140" class="combobox-option">2140 Accrued Expenses</div>
52
- <div data-value="a:2150" class="combobox-option">2150 Social Security Payable</div>
53
- <div data-value="a:2200" class="combobox-option">2200 Non-Current Liabilities</div>
54
- <div data-value="a:2210" class="combobox-option">2210 Long-term Loans</div>
55
- <div data-value="a:3000" class="combobox-option">3000 Equity</div>
56
- <div data-value="a:3100" class="combobox-option">3100 Registered Capital</div>
57
- <div data-value="a:3200" class="combobox-option">3200 Retained Earnings</div>
58
- <div data-value="a:3300" class="combobox-option">3300 Current Year Earnings</div>
59
- <div data-value="a:4000" class="combobox-option">4000 Revenue</div>
60
- <div data-value="a:4100" class="combobox-option">4100 Sales Revenue</div>
61
- <div data-value="a:4200" class="combobox-option">4200 Service Revenue</div>
62
- <div data-value="a:4300" class="combobox-option">4300 Other Income</div>
63
- <div data-value="a:4400" class="combobox-option">4400 Interest Income</div>
64
- <div data-value="a:5000" class="combobox-option">5000 Cost of Goods Sold</div>
65
- <div data-value="a:5100" class="combobox-option">5100 Cost of Goods Sold</div>
66
- <div data-value="a:5200" class="combobox-option">5200 Direct Labor</div>
67
- <div data-value="a:5300" class="combobox-option">5300 Manufacturing Overhead</div>
68
- <div data-value="a:6000" class="combobox-option">6000 Operating Expenses</div>
69
- <div data-value="a:6100" class="combobox-option">6100 Salaries and Wages</div>
70
- <div data-value="a:6200" class="combobox-option">6200 Rent</div>
71
- <div data-value="a:6300" class="combobox-option">6300 Utilities</div>
72
- <div data-value="a:6400" class="combobox-option">6400 Depreciation</div>
73
- <div data-value="a:6500" class="combobox-option">6500 Professional Fees</div>
74
- <div data-value="a:6600" class="combobox-option">6600 Marketing and Advertising</div>
75
- <div data-value="a:6700" class="combobox-option">6700 Insurance</div>
76
- <div data-value="a:6800" class="combobox-option">6800 Office Supplies</div>
77
- <div data-value="a:6900" class="combobox-option">6900 Travel and Transportation</div>
78
- <div data-value="a:6950" class="combobox-option">6950 Miscellaneous Expenses</div>
79
- <div data-value="a:6960" class="combobox-option">6960 Foreign Exchange Difference</div>
25
+ <div role="listbox" class="combobox-list">
26
+ <div data-value="c:contact:<uuid>" role="option" class="combobox-option">Owner (both)</div>
27
+ <div data-value="c:contact:<uuid>" role="option" class="combobox-option combobox-option--selected">Riverside Supplies (customer)</div>
28
+ <div data-value="a:1000" role="option" class="combobox-option">1000 Assets</div>
29
+ <div data-value="a:1100" role="option" class="combobox-option">1100 Current Assets</div>
30
+ <div data-value="a:1110" role="option" class="combobox-option">1110 Cash and Cash Equivalents</div>
31
+ <div data-value="a:1111" role="option" class="combobox-option">1111 Default Bank Account (Checking)</div>
32
+ <div data-value="a:1120" role="option" class="combobox-option combobox-option--selected">1120 Accounts Receivable</div>
33
+ <div data-value="a:1130" role="option" class="combobox-option">1130 Inventory</div>
34
+ <div data-value="a:1130-DTY" role="option" class="combobox-option">1130-DTY Inventory - Import Duty Clearing</div>
35
+ <div data-value="a:1130-FRT" role="option" class="combobox-option">1130-FRT Inventory - Freight Clearing</div>
36
+ <div data-value="a:1130-INS" role="option" class="combobox-option">1130-INS Inventory - Insurance Clearing</div>
37
+ <div data-value="a:1130-IVT" role="option" class="combobox-option">1130-IVT Inventory - Non-Recoverable Import VAT Clearing</div>
38
+ <div data-value="a:1130-OB" role="option" class="combobox-option">1130-OB Inventory - Opening Balance</div>
39
+ <div data-value="a:1130-P" role="option" class="combobox-option">1130-P Inventory - Purchased</div>
40
+ <div data-value="a:1140" role="option" class="combobox-option">1140 Prepaid Expenses</div>
41
+ <div data-value="a:1150" role="option" class="combobox-option">1150 VAT Receivable (Input VAT)</div>
42
+ <div data-value="a:1200" role="option" class="combobox-option">1200 Non-Current Assets</div>
43
+ <div data-value="a:1210" role="option" class="combobox-option">1210 Property, Plant and Equipment</div>
44
+ <div data-value="a:1220" role="option" class="combobox-option">1220 Accumulated Depreciation</div>
45
+ <div data-value="a:1230" role="option" class="combobox-option">1230 Intangible Assets</div>
46
+ <div data-value="a:2000" role="option" class="combobox-option">2000 Liabilities</div>
47
+ <div data-value="a:2100" role="option" class="combobox-option">2100 Current Liabilities</div>
48
+ <div data-value="a:2110" role="option" class="combobox-option">2110 Accounts Payable</div>
49
+ <div data-value="a:2120" role="option" class="combobox-option">2120 VAT Payable (Output VAT)</div>
50
+ <div data-value="a:2130" role="option" class="combobox-option">2130 Withholding Tax Payable</div>
51
+ <div data-value="a:2140" role="option" class="combobox-option">2140 Accrued Expenses</div>
52
+ <div data-value="a:2150" role="option" class="combobox-option">2150 Social Security Payable</div>
53
+ <div data-value="a:2200" role="option" class="combobox-option">2200 Non-Current Liabilities</div>
54
+ <div data-value="a:2210" role="option" class="combobox-option">2210 Long-term Loans</div>
55
+ <div data-value="a:3000" role="option" class="combobox-option">3000 Equity</div>
56
+ <div data-value="a:3100" role="option" class="combobox-option">3100 Registered Capital</div>
57
+ <div data-value="a:3200" role="option" class="combobox-option">3200 Retained Earnings</div>
58
+ <div data-value="a:3300" role="option" class="combobox-option">3300 Current Year Earnings</div>
59
+ <div data-value="a:4000" role="option" class="combobox-option">4000 Revenue</div>
60
+ <div data-value="a:4100" role="option" class="combobox-option">4100 Sales Revenue</div>
61
+ <div data-value="a:4200" role="option" class="combobox-option">4200 Service Revenue</div>
62
+ <div data-value="a:4300" role="option" class="combobox-option">4300 Other Income</div>
63
+ <div data-value="a:4400" role="option" class="combobox-option">4400 Interest Income</div>
64
+ <div data-value="a:5000" role="option" class="combobox-option">5000 Cost of Goods Sold</div>
65
+ <div data-value="a:5100" role="option" class="combobox-option">5100 Cost of Goods Sold</div>
66
+ <div data-value="a:5200" role="option" class="combobox-option">5200 Direct Labor</div>
67
+ <div data-value="a:5300" role="option" class="combobox-option">5300 Manufacturing Overhead</div>
68
+ <div data-value="a:6000" role="option" class="combobox-option">6000 Operating Expenses</div>
69
+ <div data-value="a:6100" role="option" class="combobox-option">6100 Salaries and Wages</div>
70
+ <div data-value="a:6200" role="option" class="combobox-option">6200 Rent</div>
71
+ <div data-value="a:6300" role="option" class="combobox-option">6300 Utilities</div>
72
+ <div data-value="a:6400" role="option" class="combobox-option">6400 Depreciation</div>
73
+ <div data-value="a:6500" role="option" class="combobox-option">6500 Professional Fees</div>
74
+ <div data-value="a:6600" role="option" class="combobox-option">6600 Marketing and Advertising</div>
75
+ <div data-value="a:6700" role="option" class="combobox-option">6700 Insurance</div>
76
+ <div data-value="a:6800" role="option" class="combobox-option">6800 Office Supplies</div>
77
+ <div data-value="a:6900" role="option" class="combobox-option">6900 Travel and Transportation</div>
78
+ <div data-value="a:6950" role="option" class="combobox-option">6950 Miscellaneous Expenses</div>
79
+ <div data-value="a:6960" role="option" class="combobox-option">6960 Foreign Exchange Difference</div>
80
80
  <div class="combobox-option combobox-option--empty" style="display:none">No results</div>
81
81
  </div>
82
82
  </div>
@@ -280,7 +280,7 @@ def setup_ui_routes(app) -> None:
280
280
  Button(t("btn.clear_all_memory"), cls="btn btn--danger btn--sm",
281
281
  hx_delete="/ai/memory-clear",
282
282
  hx_target="#ai-memory-content",
283
- hx_confirm="Clear all AI memory for this company?",
283
+ hx_confirm=t("ai.clear_memory_confirm"),
284
284
  ),
285
285
  cls="ai-memory__actions",
286
286
  ),
@@ -347,7 +347,7 @@ def setup_ui_routes(app) -> None:
347
347
  count = result.get("count", 0)
348
348
  return Div(
349
349
  _msg_bubble("ai", f"\u2705 {feedback}"),
350
- P(f"{count} draft bill(s) created. View them in Documents.", cls="ai-bills__done"),
350
+ P(t("ai.draft_bills_created", count=count), cls="ai-bills__done"),
351
351
  cls="ai-bills__confirmed",
352
352
  )
353
353
  except APIError as e:
@@ -411,7 +411,7 @@ async def _quota_section(token: str, session_token: str) -> FT:
411
411
  cls="ai-settings__stat",
412
412
  ),
413
413
  Div(
414
- Span("Top-up credits", cls="ai-settings__stat-label"),
414
+ Span(t("ai.top_up_credits"), cls="ai-settings__stat-label"),
415
415
  Span(str(topup), cls="ai-settings__stat-value"),
416
416
  cls="ai-settings__stat",
417
417
  ),
@@ -519,7 +519,8 @@ def _bill_preview(bills: list[dict]) -> FT:
519
519
 
520
520
  bills_json = json.dumps(bills)
521
521
  return Div(
522
- H4(f"{len(bills)} Draft Bill{'s' if len(bills) != 1 else ''} Ready", cls="ai-bills__title"),
522
+ H4(t("ai.draft_bills_ready_one" if len(bills) == 1 else "ai.draft_bills_ready_other",
523
+ n=len(bills)), cls="ai-bills__title"),
523
524
  Div(*rows, cls="ai-bills__list"),
524
525
  Div(
525
526
  Form(
@@ -664,7 +665,7 @@ def _chat_view() -> FT:
664
665
  "☰",
665
666
  cls="ai-sidebar__toggle",
666
667
  id="ai-sidebar-toggle",
667
- title="Toggle sidebar",
668
+ title=t("ai.toggle_sidebar"),
668
669
  onclick="celerpAiToggleSidebar()",
669
670
  ),
670
671
  # Expanded action buttons (stacked vertically)
@@ -691,7 +692,7 @@ def _chat_view() -> FT:
691
692
  Button(
692
693
  "+",
693
694
  cls="ai-sidebar__icon-btn",
694
- title="New Conversation",
695
+ title=t("ai.new_conversation"),
695
696
  hx_post="/ai/conversations",
696
697
  hx_target="#ai-history",
697
698
  hx_swap="afterbegin",
@@ -700,7 +701,7 @@ def _chat_view() -> FT:
700
701
  Button(
701
702
  "🧠",
702
703
  cls="ai-sidebar__icon-btn",
703
- title="Memory",
704
+ title=t("ai.memory"),
704
705
  hx_get="/ai/memory-panel",
705
706
  hx_target="#ai-memory-content",
706
707
  hx_swap="innerHTML",
@@ -758,7 +759,7 @@ def _chat_view() -> FT:
758
759
  type="text",
759
760
  name="query",
760
761
  id="ai-query-input",
761
- placeholder="Ask anything about your business data…",
762
+ placeholder=t("msg.ask_anything_about_your_business_data"),
762
763
  cls="ai-input__field",
763
764
  autocomplete="off",
764
765
  ),
@@ -119,7 +119,7 @@ def _backup_table(items: list[dict]):
119
119
  Button(
120
120
  t("btn.restore"),
121
121
  hx_post=f"/backup/restore/{item['id']}",
122
- hx_confirm="This will replace your current database. Type RESTORE to confirm.",
122
+ hx_confirm=t("bak.restore_type_confirm"),
123
123
  hx_target="#backup-flash",
124
124
  hx_swap="outerHTML",
125
125
  cls="btn btn--xs btn--outline btn--danger",
@@ -210,6 +210,7 @@ class ItemCreate(BaseModel):
210
210
  description: str | None = None
211
211
  unit: str | None = None
212
212
  barcode: str | None = None # digits only if provided
213
+ auto_barcode: bool = False # duplicate/clone: mint a fresh unique barcode from the shared sequence, never inherit one
213
214
  hs_code: str | None = None # Harmonized System code for trade/customs
214
215
  tax_codes: list[str] = Field(default_factory=list)
215
216
  purchase_sku: str | None = None # vendor's SKU / part number
@@ -1248,13 +1249,19 @@ async def post_item(payload: ItemCreate, company_id=Depends(get_current_company_
1248
1249
  if not payload.sku:
1249
1250
  payload = payload.model_copy(update={"sku": str(await _next_seq(session, company_id)).zfill(6)})
1250
1251
 
1252
+ # Duplicate/clone: mint a fresh unique barcode from the shared SKU/barcode
1253
+ # sequence and discard any inherited one. Mirrors the split child, which
1254
+ # resets barcode for the same reason - a new entity needs a new unique
1255
+ # barcode (barcode is globally unique, so a copy must never carry the source's).
1256
+ if payload.auto_barcode:
1257
+ payload = payload.model_copy(update={"barcode": str(await _next_seq(session, company_id)).zfill(6)})
1251
1258
  # Auto-copy SKU to barcode when barcode omitted and SKU is purely numeric.
1252
1259
  # SKU is now a (possibly repeated) product-type, so gate the copy on collision:
1253
1260
  # if another item already uses that barcode (e.g. a second item deliberately
1254
1261
  # sharing a numeric SKU), assign a fresh sequential barcode instead so the
1255
1262
  # duplicate-SKU create does not 409 on barcode. Single-SKU behaviour is
1256
1263
  # unchanged (the first/only item still gets barcode == sku).
1257
- if payload.barcode is None and payload.sku.isdigit():
1264
+ elif payload.barcode is None and payload.sku.isdigit():
1258
1265
  clash = (await session.execute(
1259
1266
  select(Projection).where(
1260
1267
  Projection.company_id == company_id,
@@ -1283,6 +1290,7 @@ async def post_item(payload: ItemCreate, company_id=Depends(get_current_company_
1283
1290
 
1284
1291
  entity_id = f"item:{uuid.uuid4()}"
1285
1292
  data = payload.model_dump(exclude_none=True)
1293
+ data.pop("auto_barcode", None) # request-only signal; never persisted onto the item
1286
1294
  if payload.location_id is not None:
1287
1295
  data["location_id"] = str(payload.location_id)
1288
1296