@open-mercato/core 0.4.11-develop.1398.4cf8d121e7 → 0.4.11-develop.1409.b9a9ec6681

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 (359) hide show
  1. package/dist/generated/entities/access_log/index.js.map +1 -1
  2. package/dist/generated/entities/action_log/index.js.map +1 -1
  3. package/dist/generated/entities/api_key/index.js.map +1 -1
  4. package/dist/generated/entities/attachment/index.js.map +1 -1
  5. package/dist/generated/entities/attachment_partition/index.js.map +1 -1
  6. package/dist/generated/entities/business_rule/index.js.map +1 -1
  7. package/dist/generated/entities/carrier_shipment/index.js.map +1 -1
  8. package/dist/generated/entities/catalog_offer/index.js.map +1 -1
  9. package/dist/generated/entities/catalog_option_schema_template/index.js.map +1 -1
  10. package/dist/generated/entities/catalog_price_kind/index.js.map +1 -1
  11. package/dist/generated/entities/catalog_product/index.js.map +1 -1
  12. package/dist/generated/entities/catalog_product_category/index.js.map +1 -1
  13. package/dist/generated/entities/catalog_product_category_assignment/index.js.map +1 -1
  14. package/dist/generated/entities/catalog_product_price/index.js.map +1 -1
  15. package/dist/generated/entities/catalog_product_tag/index.js.map +1 -1
  16. package/dist/generated/entities/catalog_product_tag_assignment/index.js.map +1 -1
  17. package/dist/generated/entities/catalog_product_unit_conversion/index.js.map +1 -1
  18. package/dist/generated/entities/catalog_product_variant/index.js.map +1 -1
  19. package/dist/generated/entities/catalog_product_variant_relation/index.js.map +1 -1
  20. package/dist/generated/entities/currency/index.js.map +1 -1
  21. package/dist/generated/entities/currency_fetch_config/index.js.map +1 -1
  22. package/dist/generated/entities/custom_entity/index.js.map +1 -1
  23. package/dist/generated/entities/custom_entity_storage/index.js.map +1 -1
  24. package/dist/generated/entities/custom_field_def/index.js.map +1 -1
  25. package/dist/generated/entities/custom_field_entity_config/index.js.map +1 -1
  26. package/dist/generated/entities/custom_field_value/index.js.map +1 -1
  27. package/dist/generated/entities/customer_activity/index.js.map +1 -1
  28. package/dist/generated/entities/customer_address/index.js.map +1 -1
  29. package/dist/generated/entities/customer_comment/index.js.map +1 -1
  30. package/dist/generated/entities/customer_company_profile/index.js.map +1 -1
  31. package/dist/generated/entities/customer_deal/index.js.map +1 -1
  32. package/dist/generated/entities/customer_deal_company_link/index.js.map +1 -1
  33. package/dist/generated/entities/customer_deal_person_link/index.js.map +1 -1
  34. package/dist/generated/entities/customer_dictionary_entry/index.js.map +1 -1
  35. package/dist/generated/entities/customer_entity/index.js.map +1 -1
  36. package/dist/generated/entities/customer_interaction/index.js.map +1 -1
  37. package/dist/generated/entities/customer_person_profile/index.js.map +1 -1
  38. package/dist/generated/entities/customer_pipeline/index.js.map +1 -1
  39. package/dist/generated/entities/customer_pipeline_stage/index.js.map +1 -1
  40. package/dist/generated/entities/customer_role/index.js.map +1 -1
  41. package/dist/generated/entities/customer_role_acl/index.js.map +1 -1
  42. package/dist/generated/entities/customer_settings/index.js.map +1 -1
  43. package/dist/generated/entities/customer_tag/index.js.map +1 -1
  44. package/dist/generated/entities/customer_tag_assignment/index.js.map +1 -1
  45. package/dist/generated/entities/customer_todo_link/index.js.map +1 -1
  46. package/dist/generated/entities/customer_user/index.js.map +1 -1
  47. package/dist/generated/entities/customer_user_acl/index.js.map +1 -1
  48. package/dist/generated/entities/customer_user_email_verification/index.js.map +1 -1
  49. package/dist/generated/entities/customer_user_invitation/index.js.map +1 -1
  50. package/dist/generated/entities/customer_user_password_reset/index.js.map +1 -1
  51. package/dist/generated/entities/customer_user_role/index.js.map +1 -1
  52. package/dist/generated/entities/customer_user_session/index.js.map +1 -1
  53. package/dist/generated/entities/dashboard_layout/index.js.map +1 -1
  54. package/dist/generated/entities/dashboard_role_widgets/index.js.map +1 -1
  55. package/dist/generated/entities/dashboard_user_widgets/index.js.map +1 -1
  56. package/dist/generated/entities/dictionary/index.js.map +1 -1
  57. package/dist/generated/entities/dictionary_entry/index.js.map +1 -1
  58. package/dist/generated/entities/encryption_map/index.js.map +1 -1
  59. package/dist/generated/entities/entity_index_coverage/index.js.map +1 -1
  60. package/dist/generated/entities/entity_index_job/index.js.map +1 -1
  61. package/dist/generated/entities/entity_index_row/index.js.map +1 -1
  62. package/dist/generated/entities/entity_translation/index.js.map +1 -1
  63. package/dist/generated/entities/exchange_rate/index.js.map +1 -1
  64. package/dist/generated/entities/feature_toggle/index.js.map +1 -1
  65. package/dist/generated/entities/feature_toggle_override/index.js.map +1 -1
  66. package/dist/generated/entities/gateway_transaction/index.js.map +1 -1
  67. package/dist/generated/entities/inbox_discrepancy/index.js.map +1 -1
  68. package/dist/generated/entities/inbox_email/index.js.map +1 -1
  69. package/dist/generated/entities/inbox_proposal/index.js.map +1 -1
  70. package/dist/generated/entities/inbox_proposal_action/index.js.map +1 -1
  71. package/dist/generated/entities/inbox_settings/index.js.map +1 -1
  72. package/dist/generated/entities/indexer_error_log/index.js.map +1 -1
  73. package/dist/generated/entities/indexer_status_log/index.js.map +1 -1
  74. package/dist/generated/entities/integration_credentials/index.js.map +1 -1
  75. package/dist/generated/entities/integration_log/index.js.map +1 -1
  76. package/dist/generated/entities/integration_state/index.js.map +1 -1
  77. package/dist/generated/entities/message/index.js.map +1 -1
  78. package/dist/generated/entities/message_access_token/index.js.map +1 -1
  79. package/dist/generated/entities/message_confirmation/index.js.map +1 -1
  80. package/dist/generated/entities/message_object/index.js.map +1 -1
  81. package/dist/generated/entities/message_recipient/index.js.map +1 -1
  82. package/dist/generated/entities/module_config/index.js.map +1 -1
  83. package/dist/generated/entities/notification/index.js.map +1 -1
  84. package/dist/generated/entities/organization/index.js.map +1 -1
  85. package/dist/generated/entities/password_reset/index.js.map +1 -1
  86. package/dist/generated/entities/perspective/index.js.map +1 -1
  87. package/dist/generated/entities/planner_availability_rule/index.js.map +1 -1
  88. package/dist/generated/entities/planner_availability_rule_set/index.js.map +1 -1
  89. package/dist/generated/entities/progress_job/index.js.map +1 -1
  90. package/dist/generated/entities/resources_resource/index.js.map +1 -1
  91. package/dist/generated/entities/resources_resource_activity/index.js.map +1 -1
  92. package/dist/generated/entities/resources_resource_comment/index.js.map +1 -1
  93. package/dist/generated/entities/resources_resource_tag/index.js.map +1 -1
  94. package/dist/generated/entities/resources_resource_tag_assignment/index.js.map +1 -1
  95. package/dist/generated/entities/resources_resource_type/index.js.map +1 -1
  96. package/dist/generated/entities/role/index.js.map +1 -1
  97. package/dist/generated/entities/role_acl/index.js.map +1 -1
  98. package/dist/generated/entities/role_perspective/index.js.map +1 -1
  99. package/dist/generated/entities/role_sidebar_preference/index.js.map +1 -1
  100. package/dist/generated/entities/rule_execution_log/index.js.map +1 -1
  101. package/dist/generated/entities/rule_set/index.js.map +1 -1
  102. package/dist/generated/entities/rule_set_member/index.js.map +1 -1
  103. package/dist/generated/entities/sales_channel/index.js.map +1 -1
  104. package/dist/generated/entities/sales_credit_memo/index.js.map +1 -1
  105. package/dist/generated/entities/sales_credit_memo_line/index.js.map +1 -1
  106. package/dist/generated/entities/sales_delivery_window/index.js.map +1 -1
  107. package/dist/generated/entities/sales_document_address/index.js.map +1 -1
  108. package/dist/generated/entities/sales_document_sequence/index.js.map +1 -1
  109. package/dist/generated/entities/sales_document_tag/index.js.map +1 -1
  110. package/dist/generated/entities/sales_document_tag_assignment/index.js.map +1 -1
  111. package/dist/generated/entities/sales_invoice/index.js.map +1 -1
  112. package/dist/generated/entities/sales_invoice_line/index.js.map +1 -1
  113. package/dist/generated/entities/sales_note/index.js.map +1 -1
  114. package/dist/generated/entities/sales_order/index.js.map +1 -1
  115. package/dist/generated/entities/sales_order_adjustment/index.js.map +1 -1
  116. package/dist/generated/entities/sales_order_line/index.js.map +1 -1
  117. package/dist/generated/entities/sales_payment/index.js.map +1 -1
  118. package/dist/generated/entities/sales_payment_allocation/index.js.map +1 -1
  119. package/dist/generated/entities/sales_payment_method/index.js.map +1 -1
  120. package/dist/generated/entities/sales_quote/index.js.map +1 -1
  121. package/dist/generated/entities/sales_quote_adjustment/index.js.map +1 -1
  122. package/dist/generated/entities/sales_quote_line/index.js.map +1 -1
  123. package/dist/generated/entities/sales_return/index.js.map +1 -1
  124. package/dist/generated/entities/sales_return_line/index.js.map +1 -1
  125. package/dist/generated/entities/sales_settings/index.js.map +1 -1
  126. package/dist/generated/entities/sales_shipment/index.js.map +1 -1
  127. package/dist/generated/entities/sales_shipment_item/index.js.map +1 -1
  128. package/dist/generated/entities/sales_shipping_method/index.js.map +1 -1
  129. package/dist/generated/entities/sales_tax_rate/index.js.map +1 -1
  130. package/dist/generated/entities/search_token/index.js.map +1 -1
  131. package/dist/generated/entities/session/index.js.map +1 -1
  132. package/dist/generated/entities/staff_leave_request/index.js.map +1 -1
  133. package/dist/generated/entities/staff_team/index.js.map +1 -1
  134. package/dist/generated/entities/staff_team_member/index.js.map +1 -1
  135. package/dist/generated/entities/staff_team_member_activity/index.js.map +1 -1
  136. package/dist/generated/entities/staff_team_member_address/index.js.map +1 -1
  137. package/dist/generated/entities/staff_team_member_comment/index.js.map +1 -1
  138. package/dist/generated/entities/staff_team_member_job_history/index.js.map +1 -1
  139. package/dist/generated/entities/staff_team_role/index.js.map +1 -1
  140. package/dist/generated/entities/step_instance/index.js.map +1 -1
  141. package/dist/generated/entities/sync_cursor/index.js.map +1 -1
  142. package/dist/generated/entities/sync_external_id_mapping/index.js.map +1 -1
  143. package/dist/generated/entities/sync_mapping/index.js.map +1 -1
  144. package/dist/generated/entities/sync_run/index.js.map +1 -1
  145. package/dist/generated/entities/sync_schedule/index.js.map +1 -1
  146. package/dist/generated/entities/tenant/index.js.map +1 -1
  147. package/dist/generated/entities/upgrade_action_run/index.js.map +1 -1
  148. package/dist/generated/entities/user/index.js.map +1 -1
  149. package/dist/generated/entities/user_acl/index.js.map +1 -1
  150. package/dist/generated/entities/user_consent/index.js.map +1 -1
  151. package/dist/generated/entities/user_role/index.js.map +1 -1
  152. package/dist/generated/entities/user_sidebar_preference/index.js.map +1 -1
  153. package/dist/generated/entities/user_task/index.js.map +1 -1
  154. package/dist/generated/entities/webhook_processed_event/index.js.map +1 -1
  155. package/dist/generated/entities/workflow_definition/index.js.map +1 -1
  156. package/dist/generated/entities/workflow_event/index.js.map +1 -1
  157. package/dist/generated/entities/workflow_event_trigger/index.js.map +1 -1
  158. package/dist/generated/entities/workflow_instance/index.js.map +1 -1
  159. package/dist/generated/entities.ids.generated.js +1 -2
  160. package/dist/generated/entities.ids.generated.js.map +2 -2
  161. package/dist/generated/entity-fields-registry.js +2585 -316
  162. package/dist/generated/entity-fields-registry.js.map +2 -2
  163. package/dist/helpers/integration/auth.js +23 -0
  164. package/dist/helpers/integration/auth.js.map +2 -2
  165. package/dist/helpers/integration/salesUi.js +261 -28
  166. package/dist/helpers/integration/salesUi.js.map +3 -3
  167. package/dist/modules/api_docs/frontend/docs/api/page.js +10 -10
  168. package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
  169. package/dist/modules/auth/api/admin/nav.js +5 -3
  170. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  171. package/dist/modules/auth/lib/backendChrome.js +28 -1
  172. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  173. package/dist/modules/catalog/api/products/route.js +23 -6
  174. package/dist/modules/catalog/api/products/route.js.map +2 -2
  175. package/dist/modules/configs/lib/system-status.js +1 -1
  176. package/dist/modules/configs/lib/system-status.js.map +1 -1
  177. package/dist/modules/customers/backend/customers/deals/[id]/page.js +226 -221
  178. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  179. package/dist/modules/customers/commands/companies.js +14 -0
  180. package/dist/modules/customers/commands/companies.js.map +2 -2
  181. package/dist/modules/customers/commands/people.js +18 -1
  182. package/dist/modules/customers/commands/people.js.map +2 -2
  183. package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js +0 -1
  184. package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js.map +2 -2
  185. package/dist/modules/query_index/lib/engine.js +2 -2
  186. package/dist/modules/query_index/lib/engine.js.map +2 -2
  187. package/generated/entities/access_log/index.ts +11 -11
  188. package/generated/entities/action_log/index.ts +20 -20
  189. package/generated/entities/api_key/index.ts +17 -17
  190. package/generated/entities/attachment/index.ts +15 -15
  191. package/generated/entities/attachment_partition/index.ts +11 -11
  192. package/generated/entities/business_rule/index.ts +23 -23
  193. package/generated/entities/carrier_shipment/index.ts +17 -17
  194. package/generated/entities/catalog_offer/index.ts +15 -15
  195. package/generated/entities/catalog_option_schema_template/index.ts +12 -12
  196. package/generated/entities/catalog_price_kind/index.ts +13 -13
  197. package/generated/entities/catalog_product/index.ts +39 -39
  198. package/generated/entities/catalog_product_category/index.ts +19 -19
  199. package/generated/entities/catalog_product_category_assignment/index.ts +8 -8
  200. package/generated/entities/catalog_product_price/index.ts +25 -25
  201. package/generated/entities/catalog_product_tag/index.ts +8 -8
  202. package/generated/entities/catalog_product_tag_assignment/index.ts +7 -7
  203. package/generated/entities/catalog_product_unit_conversion/index.ts +12 -12
  204. package/generated/entities/catalog_product_variant/index.ts +24 -24
  205. package/generated/entities/catalog_product_variant_relation/index.ts +14 -14
  206. package/generated/entities/currency/index.ts +14 -14
  207. package/generated/entities/currency_fetch_config/index.ts +13 -13
  208. package/generated/entities/custom_entity/index.ts +13 -13
  209. package/generated/entities/custom_entity_storage/index.ts +9 -9
  210. package/generated/entities/custom_field_def/index.ts +11 -11
  211. package/generated/entities/custom_field_entity_config/index.ts +9 -9
  212. package/generated/entities/custom_field_value/index.ts +13 -13
  213. package/generated/entities/customer_activity/index.ts +14 -14
  214. package/generated/entities/customer_address/index.ts +20 -20
  215. package/generated/entities/customer_comment/index.ts +12 -12
  216. package/generated/entities/customer_company_profile/index.ts +13 -13
  217. package/generated/entities/customer_deal/index.ts +22 -22
  218. package/generated/entities/customer_deal_company_link/index.ts +4 -4
  219. package/generated/entities/customer_deal_person_link/index.ts +5 -5
  220. package/generated/entities/customer_dictionary_entry/index.ts +11 -11
  221. package/generated/entities/customer_entity/index.ts +32 -32
  222. package/generated/entities/customer_interaction/index.ts +20 -20
  223. package/generated/entities/customer_person_profile/index.ts +16 -16
  224. package/generated/entities/customer_pipeline/index.ts +7 -7
  225. package/generated/entities/customer_pipeline_stage/index.ts +8 -8
  226. package/generated/entities/customer_role/index.ts +12 -12
  227. package/generated/entities/customer_role_acl/index.ts +8 -8
  228. package/generated/entities/customer_settings/index.ts +6 -6
  229. package/generated/entities/customer_tag/index.ts +10 -10
  230. package/generated/entities/customer_tag_assignment/index.ts +6 -6
  231. package/generated/entities/customer_todo_link/index.ts +8 -8
  232. package/generated/entities/customer_user/index.ts +17 -17
  233. package/generated/entities/customer_user_acl/index.ts +8 -8
  234. package/generated/entities/customer_user_email_verification/index.ts +7 -7
  235. package/generated/entities/customer_user_invitation/index.ts +15 -15
  236. package/generated/entities/customer_user_password_reset/index.ts +6 -6
  237. package/generated/entities/customer_user_role/index.ts +5 -5
  238. package/generated/entities/customer_user_session/index.ts +9 -9
  239. package/generated/entities/dashboard_layout/index.ts +8 -8
  240. package/generated/entities/dashboard_role_widgets/index.ts +8 -8
  241. package/generated/entities/dashboard_user_widgets/index.ts +9 -9
  242. package/generated/entities/dictionary/index.ts +12 -12
  243. package/generated/entities/dictionary_entry/index.ts +11 -11
  244. package/generated/entities/encryption_map/index.ts +9 -9
  245. package/generated/entities/entity_index_coverage/index.ts +9 -9
  246. package/generated/entities/entity_index_job/index.ts +12 -12
  247. package/generated/entities/entity_index_row/index.ts +11 -11
  248. package/generated/entities/entity_translation/index.ts +8 -8
  249. package/generated/entities/exchange_rate/index.ts +13 -13
  250. package/generated/entities/feature_toggle/index.ts +10 -10
  251. package/generated/entities/feature_toggle_override/index.ts +6 -6
  252. package/generated/entities/gateway_transaction/index.ts +22 -22
  253. package/generated/entities/inbox_discrepancy/index.ts +15 -15
  254. package/generated/entities/inbox_email/index.ts +26 -26
  255. package/generated/entities/inbox_proposal/index.ts +22 -22
  256. package/generated/entities/inbox_proposal_action/index.ts +23 -23
  257. package/generated/entities/inbox_settings/index.ts +9 -9
  258. package/generated/entities/indexer_error_log/index.ts +11 -11
  259. package/generated/entities/indexer_status_log/index.ts +11 -11
  260. package/generated/entities/integration_credentials/index.ts +8 -8
  261. package/generated/entities/integration_log/index.ts +12 -12
  262. package/generated/entities/integration_state/index.ts +12 -12
  263. package/generated/entities/message/index.ts +31 -31
  264. package/generated/entities/message_access_token/index.ts +8 -8
  265. package/generated/entities/message_confirmation/index.ts +9 -9
  266. package/generated/entities/message_object/index.ts +10 -10
  267. package/generated/entities/message_recipient/index.ts +14 -14
  268. package/generated/entities/module_config/index.ts +6 -6
  269. package/generated/entities/notification/index.ts +27 -27
  270. package/generated/entities/organization/index.ts +15 -15
  271. package/generated/entities/password_reset/index.ts +7 -7
  272. package/generated/entities/perspective/index.ts +11 -11
  273. package/generated/entities/planner_availability_rule/index.ts +15 -15
  274. package/generated/entities/planner_availability_rule_set/index.ts +9 -9
  275. package/generated/entities/progress_job/index.ts +27 -27
  276. package/generated/entities/resources_resource/index.ts +18 -18
  277. package/generated/entities/resources_resource_activity/index.ts +13 -13
  278. package/generated/entities/resources_resource_comment/index.ts +11 -11
  279. package/generated/entities/resources_resource_tag/index.ts +10 -10
  280. package/generated/entities/resources_resource_tag_assignment/index.ts +7 -7
  281. package/generated/entities/resources_resource_type/index.ts +10 -10
  282. package/generated/entities/role/index.ts +5 -5
  283. package/generated/entities/role_acl/index.ts +9 -9
  284. package/generated/entities/role_perspective/index.ts +11 -11
  285. package/generated/entities/role_sidebar_preference/index.ts +8 -8
  286. package/generated/entities/rule_execution_log/index.ts +13 -13
  287. package/generated/entities/rule_set/index.ts +12 -12
  288. package/generated/entities/rule_set_member/index.ts +8 -8
  289. package/generated/entities/sales_channel/index.ts +25 -25
  290. package/generated/entities/sales_credit_memo/index.ts +21 -21
  291. package/generated/entities/sales_credit_memo_line/index.ts +20 -20
  292. package/generated/entities/sales_delivery_window/index.ts +15 -15
  293. package/generated/entities/sales_document_address/index.ts +24 -24
  294. package/generated/entities/sales_document_sequence/index.ts +8 -8
  295. package/generated/entities/sales_document_tag/index.ts +10 -10
  296. package/generated/entities/sales_document_tag_assignment/index.ts +10 -10
  297. package/generated/entities/sales_invoice/index.ts +25 -25
  298. package/generated/entities/sales_invoice_line/index.ts +23 -23
  299. package/generated/entities/sales_note/index.ts +14 -14
  300. package/generated/entities/sales_order/index.ts +71 -71
  301. package/generated/entities/sales_order_adjustment/index.ts +20 -20
  302. package/generated/entities/sales_order_line/index.ts +44 -44
  303. package/generated/entities/sales_payment/index.ts +20 -20
  304. package/generated/entities/sales_payment_allocation/index.ts +9 -9
  305. package/generated/entities/sales_payment_method/index.ts +15 -15
  306. package/generated/entities/sales_quote/index.ts +56 -56
  307. package/generated/entities/sales_quote_adjustment/index.ts +20 -20
  308. package/generated/entities/sales_quote_line/index.ts +37 -37
  309. package/generated/entities/sales_return/index.ts +14 -14
  310. package/generated/entities/sales_return_line/index.ts +13 -13
  311. package/generated/entities/sales_settings/index.ts +10 -10
  312. package/generated/entities/sales_shipment/index.ts +24 -24
  313. package/generated/entities/sales_shipment_item/index.ts +7 -7
  314. package/generated/entities/sales_shipping_method/index.ts +19 -19
  315. package/generated/entities/sales_tax_rate/index.ts +22 -22
  316. package/generated/entities/search_token/index.ts +9 -9
  317. package/generated/entities/session/index.ts +7 -7
  318. package/generated/entities/staff_leave_request/index.ts +18 -18
  319. package/generated/entities/staff_team/index.ts +9 -9
  320. package/generated/entities/staff_team_member/index.ts +14 -14
  321. package/generated/entities/staff_team_member_activity/index.ts +13 -13
  322. package/generated/entities/staff_team_member_address/index.ts +20 -20
  323. package/generated/entities/staff_team_member_comment/index.ts +11 -11
  324. package/generated/entities/staff_team_member_job_history/index.ts +11 -11
  325. package/generated/entities/staff_team_role/index.ts +11 -11
  326. package/generated/entities/step_instance/index.ts +17 -17
  327. package/generated/entities/sync_cursor/index.ts +8 -8
  328. package/generated/entities/sync_external_id_mapping/index.ts +12 -12
  329. package/generated/entities/sync_mapping/index.ts +8 -8
  330. package/generated/entities/sync_run/index.ts +21 -21
  331. package/generated/entities/sync_schedule/index.ts +16 -16
  332. package/generated/entities/tenant/index.ts +7 -7
  333. package/generated/entities/upgrade_action_run/index.ts +7 -7
  334. package/generated/entities/user/index.ts +11 -11
  335. package/generated/entities/user_acl/index.ts +9 -9
  336. package/generated/entities/user_consent/index.ts +14 -14
  337. package/generated/entities/user_role/index.ts +5 -5
  338. package/generated/entities/user_sidebar_preference/index.ts +9 -9
  339. package/generated/entities/user_task/index.ts +22 -22
  340. package/generated/entities/webhook_processed_event/index.ts +7 -7
  341. package/generated/entities/workflow_definition/index.ts +17 -17
  342. package/generated/entities/workflow_event/index.ts +9 -9
  343. package/generated/entities/workflow_event_trigger/index.ts +15 -15
  344. package/generated/entities/workflow_instance/index.ts +22 -22
  345. package/generated/entities.ids.generated.ts +258 -258
  346. package/generated/entity-fields-registry.ts +2587 -319
  347. package/package.json +3 -3
  348. package/src/helpers/integration/auth.ts +22 -0
  349. package/src/helpers/integration/salesUi.ts +397 -29
  350. package/src/modules/api_docs/frontend/docs/api/page.tsx +14 -11
  351. package/src/modules/auth/api/admin/nav.ts +5 -4
  352. package/src/modules/auth/lib/backendChrome.tsx +36 -3
  353. package/src/modules/catalog/api/products/route.ts +25 -6
  354. package/src/modules/configs/lib/system-status.ts +1 -1
  355. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +1 -1
  356. package/src/modules/customers/commands/companies.ts +15 -0
  357. package/src/modules/customers/commands/people.ts +19 -1
  358. package/src/modules/entities/backend/entities/user/[entityId]/records/create/page.tsx +0 -1
  359. package/src/modules/query_index/lib/engine.ts +1 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-mercato/core",
3
- "version": "0.4.11-develop.1398.4cf8d121e7",
3
+ "version": "0.4.11-develop.1409.b9a9ec6681",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "scripts": {
@@ -230,10 +230,10 @@
230
230
  "ts-pattern": "^5.0.0"
231
231
  },
232
232
  "peerDependencies": {
233
- "@open-mercato/shared": "0.4.11-develop.1398.4cf8d121e7"
233
+ "@open-mercato/shared": "0.4.11-develop.1409.b9a9ec6681"
234
234
  },
235
235
  "devDependencies": {
236
- "@open-mercato/shared": "0.4.11-develop.1398.4cf8d121e7",
236
+ "@open-mercato/shared": "0.4.11-develop.1409.b9a9ec6681",
237
237
  "@testing-library/dom": "^10.4.1",
238
238
  "@testing-library/jest-dom": "^6.9.1",
239
239
  "@testing-library/react": "^16.3.1",
@@ -72,6 +72,18 @@ async function acknowledgeGlobalNotices(page: Page): Promise<void> {
72
72
  url: baseUrl,
73
73
  sameSite: 'Lax',
74
74
  },
75
+ {
76
+ name: 'om_feedback_suppress',
77
+ value: '1',
78
+ url: baseUrl,
79
+ sameSite: 'Lax',
80
+ },
81
+ {
82
+ name: 'om_feedback_shown',
83
+ value: new Date().toISOString().slice(0, 10),
84
+ url: baseUrl,
85
+ sameSite: 'Lax',
86
+ },
75
87
  ]);
76
88
  }
77
89
 
@@ -89,6 +101,16 @@ async function dismissGlobalNoticesIfPresent(page: Page): Promise<void> {
89
101
  await dismissButton.click();
90
102
  }
91
103
  }
104
+
105
+ const feedbackDialog = page.getByRole('dialog', { name: /Talk to Open Mercato team/i }).first();
106
+ if (await feedbackDialog.isVisible().catch(() => false)) {
107
+ const closeButton = feedbackDialog.getByRole('button', { name: /close/i }).first();
108
+ if (await closeButton.isVisible().catch(() => false)) {
109
+ await closeButton.click().catch(() => {});
110
+ } else {
111
+ await page.keyboard.press('Escape').catch(() => {});
112
+ }
113
+ }
92
114
  }
93
115
 
94
116
  async function recoverClientSideErrorPageIfPresent(page: Page): Promise<void> {
@@ -8,6 +8,7 @@ type CreateDocumentOptions = {
8
8
  customerQuery?: string;
9
9
  channelQuery?: string;
10
10
  preferApi?: boolean;
11
+ token?: string;
11
12
  };
12
13
 
13
14
  type ChannelListItem = {
@@ -17,6 +18,53 @@ type ChannelListItem = {
17
18
  isActive?: boolean | null;
18
19
  };
19
20
 
21
+ type CustomerAddressListItem = {
22
+ id?: string | null;
23
+ name?: string | null;
24
+ purpose?: string | null;
25
+ company_name?: string | null;
26
+ companyName?: string | null;
27
+ address_line1?: string | null;
28
+ addressLine1?: string | null;
29
+ address_line2?: string | null;
30
+ addressLine2?: string | null;
31
+ building_number?: string | null;
32
+ buildingNumber?: string | null;
33
+ flat_number?: string | null;
34
+ flatNumber?: string | null;
35
+ city?: string | null;
36
+ region?: string | null;
37
+ postal_code?: string | null;
38
+ postalCode?: string | null;
39
+ country?: string | null;
40
+ };
41
+
42
+ type DocumentAddressPayload = {
43
+ customerAddressId?: string;
44
+ name?: string;
45
+ purpose?: string;
46
+ companyName?: string;
47
+ addressLine1: string;
48
+ addressLine2?: string;
49
+ buildingNumber?: string;
50
+ flatNumber?: string;
51
+ city?: string;
52
+ region?: string;
53
+ postalCode?: string;
54
+ country?: string;
55
+ };
56
+
57
+ type SalesOrderLineListItem = {
58
+ id?: string | null;
59
+ };
60
+
61
+ type PaymentMethodListItem = {
62
+ id?: string | null;
63
+ name?: string | null;
64
+ code?: string | null;
65
+ isActive?: boolean | null;
66
+ };
67
+
20
68
  type AddLineOptions = {
21
69
  name: string;
22
70
  quantity: number;
@@ -66,15 +114,38 @@ function readId(payload: unknown, keys: string[]): string | null {
66
114
  return null;
67
115
  }
68
116
 
117
+ function readListItems<T>(payload: { result?: { items?: T[] }; items?: T[] } | null): T[] {
118
+ return Array.isArray(payload?.result?.items)
119
+ ? payload.result.items
120
+ : Array.isArray(payload?.items)
121
+ ? payload.items
122
+ : [];
123
+ }
124
+
125
+ function resolveOrderIdFromPage(page: Page): string | null {
126
+ const match = page.url().match(/\/backend\/sales\/(?:documents|orders)\/([0-9a-f-]{36})/i);
127
+ return match?.[1] ?? null;
128
+ }
129
+
69
130
  async function ensureSalesDocumentFixtures(
70
131
  page: Page,
71
132
  options: CreateDocumentOptions,
72
- ): Promise<{ customerQuery: string; channelQuery: string }> {
133
+ ): Promise<{
134
+ customerQuery: string;
135
+ channelQuery: string;
136
+ customerEntityId?: string | null;
137
+ channelId?: string | null;
138
+ customerAddressId?: string | null;
139
+ authToken?: string | null;
140
+ }> {
73
141
  let customerQuery = options.customerQuery;
74
142
  let channelQuery = options.channelQuery;
143
+ let customerEntityId: string | null = null;
144
+ let channelId: string | null = null;
145
+ let customerAddressId: string | null = null;
75
146
 
76
147
  if (customerQuery && channelQuery) {
77
- return { customerQuery, channelQuery };
148
+ return { customerQuery, channelQuery, authToken: options.token ?? null };
78
149
  }
79
150
 
80
151
  const token = await getAuthToken(page.request, 'admin').catch(() => null);
@@ -102,6 +173,7 @@ async function ensureSalesDocumentFixtures(
102
173
  return {
103
174
  customerQuery,
104
175
  channelQuery,
176
+ authToken: options.token ?? null,
105
177
  };
106
178
  }
107
179
 
@@ -113,12 +185,12 @@ async function ensureSalesDocumentFixtures(
113
185
  }).catch(() => null);
114
186
  if (companyResponse && companyResponse.ok()) {
115
187
  const companyBody = (await companyResponse.json().catch(() => null)) as unknown;
116
- const companyId = readId(companyBody, ['id', 'entityId', 'companyId']);
117
- if (companyId) {
188
+ customerEntityId = readId(companyBody, ['id', 'entityId', 'companyId']);
189
+ if (customerEntityId) {
118
190
  await apiRequest(page.request, 'POST', '/api/customers/addresses', {
119
191
  token,
120
192
  data: {
121
- entityId: companyId,
193
+ entityId: customerEntityId,
122
194
  name: 'Primary',
123
195
  purpose: 'Shipping',
124
196
  addressLine1: '100 QA Street',
@@ -127,6 +199,9 @@ async function ensureSalesDocumentFixtures(
127
199
  country: 'US',
128
200
  isPrimary: true,
129
201
  },
202
+ }).then(async (response) => {
203
+ const body = (await response.json().catch(() => null)) as unknown;
204
+ customerAddressId = readId(body, ['id', 'addressId']);
130
205
  }).catch(() => {});
131
206
  customerQuery = companyName;
132
207
  }
@@ -150,6 +225,7 @@ async function ensureSalesDocumentFixtures(
150
225
  existingChannels.find((item) => item.isActive !== false);
151
226
  if (preferredExistingChannel?.name) {
152
227
  channelQuery = preferredExistingChannel.name;
228
+ channelId = preferredExistingChannel.id ?? null;
153
229
  } else {
154
230
  const timestamp = Date.now();
155
231
  const channelName = `QA Sales Channel ${timestamp}`;
@@ -163,6 +239,8 @@ async function ensureSalesDocumentFixtures(
163
239
  }).catch(() => null);
164
240
  if (channelResponse && channelResponse.ok()) {
165
241
  channelQuery = channelName;
242
+ const channelBody = (await channelResponse.json().catch(() => null)) as unknown;
243
+ channelId = readId(channelBody, ['id', 'channelId']);
166
244
  } else {
167
245
  channelQuery = 'online';
168
246
  }
@@ -172,6 +250,10 @@ async function ensureSalesDocumentFixtures(
172
250
  return {
173
251
  customerQuery: customerQuery ?? 'Copperleaf',
174
252
  channelQuery: channelQuery ?? 'online',
253
+ customerEntityId,
254
+ channelId,
255
+ customerAddressId,
256
+ authToken: token,
175
257
  };
176
258
  }
177
259
 
@@ -284,8 +366,15 @@ async function resolveCustomerEntityId(
284
366
  ): Promise<string | null> {
285
367
  const params = new URLSearchParams({ page: '1', pageSize: '5', search: customerQuery });
286
368
  const response = await apiRequest(page.request, 'GET', `/api/customers/companies?${params.toString()}`, { token }).catch(() => null);
287
- const body = (await response?.json().catch(() => null)) as { result?: { items?: Array<Record<string, unknown>> } } | null;
288
- const items = Array.isArray(body?.result?.items) ? body.result.items : [];
369
+ const body = (await response?.json().catch(() => null)) as {
370
+ result?: { items?: Array<Record<string, unknown>> };
371
+ items?: Array<Record<string, unknown>>;
372
+ } | null;
373
+ const items = Array.isArray(body?.result?.items)
374
+ ? body.result.items
375
+ : Array.isArray(body?.items)
376
+ ? body.items
377
+ : [];
289
378
  const exactMatch = items.find((item) => {
290
379
  const displayName = typeof item.displayName === 'string'
291
380
  ? item.displayName
@@ -297,6 +386,103 @@ async function resolveCustomerEntityId(
297
386
  return exactMatch ? readId(exactMatch, ['id', 'entityId', 'companyId']) : null;
298
387
  }
299
388
 
389
+ function toDocumentAddressPayload(address: CustomerAddressListItem): DocumentAddressPayload | null {
390
+ const addressLine1 = typeof address.addressLine1 === 'string'
391
+ ? address.addressLine1
392
+ : typeof address.address_line1 === 'string'
393
+ ? address.address_line1
394
+ : null;
395
+ if (!addressLine1) return null;
396
+ return {
397
+ customerAddressId: typeof address.id === 'string' ? address.id : undefined,
398
+ name: typeof address.name === 'string' ? address.name : undefined,
399
+ purpose: typeof address.purpose === 'string' ? address.purpose : undefined,
400
+ companyName: typeof address.companyName === 'string'
401
+ ? address.companyName
402
+ : typeof address.company_name === 'string'
403
+ ? address.company_name
404
+ : undefined,
405
+ addressLine1,
406
+ addressLine2: typeof address.addressLine2 === 'string'
407
+ ? address.addressLine2
408
+ : typeof address.address_line2 === 'string'
409
+ ? address.address_line2
410
+ : undefined,
411
+ buildingNumber: typeof address.buildingNumber === 'string'
412
+ ? address.buildingNumber
413
+ : typeof address.building_number === 'string'
414
+ ? address.building_number
415
+ : undefined,
416
+ flatNumber: typeof address.flatNumber === 'string'
417
+ ? address.flatNumber
418
+ : typeof address.flat_number === 'string'
419
+ ? address.flat_number
420
+ : undefined,
421
+ city: typeof address.city === 'string' ? address.city : undefined,
422
+ region: typeof address.region === 'string' ? address.region : undefined,
423
+ postalCode: typeof address.postalCode === 'string'
424
+ ? address.postalCode
425
+ : typeof address.postal_code === 'string'
426
+ ? address.postal_code
427
+ : undefined,
428
+ country: typeof address.country === 'string' ? address.country : undefined,
429
+ };
430
+ }
431
+
432
+ async function ensureCustomerAddressFixture(
433
+ page: Page,
434
+ token: string,
435
+ customerEntityId: string,
436
+ preferredAddressId?: string | null,
437
+ ): Promise<DocumentAddressPayload | null> {
438
+ const existingResponse = await apiRequest(
439
+ page.request,
440
+ 'GET',
441
+ `/api/customers/addresses?page=1&pageSize=20&entityId=${customerEntityId}`,
442
+ { token },
443
+ ).catch(() => null);
444
+ const existingBody = (await existingResponse?.json().catch(() => null)) as {
445
+ result?: { items?: CustomerAddressListItem[] };
446
+ items?: CustomerAddressListItem[];
447
+ } | null;
448
+ const existingItems = Array.isArray(existingBody?.result?.items)
449
+ ? existingBody.result.items
450
+ : Array.isArray(existingBody?.items)
451
+ ? existingBody.items
452
+ : [];
453
+ const preferredAddress = existingItems.find((item) => item.id === preferredAddressId)
454
+ ?? existingItems.find((item) => item.purpose?.toLowerCase() === 'shipping')
455
+ ?? existingItems[0];
456
+ const preferredPayload = preferredAddress ? toDocumentAddressPayload(preferredAddress) : null;
457
+ if (preferredPayload) return preferredPayload;
458
+
459
+ const createResponse = await apiRequest(page.request, 'POST', '/api/customers/addresses', {
460
+ token,
461
+ data: {
462
+ entityId: customerEntityId,
463
+ name: 'Primary',
464
+ purpose: 'Shipping',
465
+ addressLine1: '100 QA Street',
466
+ city: 'Austin',
467
+ postalCode: '78701',
468
+ country: 'US',
469
+ isPrimary: true,
470
+ },
471
+ }).catch(() => null);
472
+ const createBody = (await createResponse?.json().catch(() => null)) as unknown;
473
+ const createdAddressId = readId(createBody, ['id', 'addressId']);
474
+ if (!createResponse?.ok() || !createdAddressId) return null;
475
+ return {
476
+ customerAddressId: createdAddressId,
477
+ name: 'Primary',
478
+ purpose: 'Shipping',
479
+ addressLine1: '100 QA Street',
480
+ city: 'Austin',
481
+ postalCode: '78701',
482
+ country: 'US',
483
+ };
484
+ }
485
+
300
486
  async function resolveSalesChannelId(page: Page, token: string, channelQuery: string): Promise<string | null> {
301
487
  const resolveItems = async (search?: string): Promise<ChannelListItem[]> => {
302
488
  const params = new URLSearchParams({ page: '1', pageSize: '5', isActive: 'true' });
@@ -321,15 +507,126 @@ async function resolveSalesChannelId(page: Page, token: string, channelQuery: st
321
507
  return exactMatch?.id ?? null;
322
508
  }
323
509
 
510
+ async function resolveOrderLineId(page: Page, token: string, orderId: string): Promise<string | null> {
511
+ const response = await apiRequest(page.request, 'GET', `/api/sales/order-lines?page=1&pageSize=20&orderId=${orderId}`, {
512
+ token,
513
+ }).catch(() => null);
514
+ const body = (await response?.json().catch(() => null)) as {
515
+ result?: { items?: SalesOrderLineListItem[] };
516
+ items?: SalesOrderLineListItem[];
517
+ } | null;
518
+ const items = readListItems(body);
519
+ return items.find((item) => typeof item.id === 'string' && item.id.length > 0)?.id ?? null;
520
+ }
521
+
522
+ async function resolveShippingMethodId(page: Page, token: string): Promise<string | null> {
523
+ const response = await apiRequest(
524
+ page.request,
525
+ 'GET',
526
+ '/api/sales/shipping-methods?page=1&pageSize=20&isActive=true',
527
+ { token },
528
+ ).catch(() => null);
529
+ const body = (await response?.json().catch(() => null)) as {
530
+ result?: { items?: ChannelListItem[] };
531
+ items?: ChannelListItem[];
532
+ } | null;
533
+ const items = readListItems(body);
534
+ const preferred = items.find((item) => item.code === 'standard-ground')
535
+ ?? items.find((item) => item.name?.toLowerCase().includes('standard'))
536
+ ?? items[0];
537
+ return preferred?.id ?? null;
538
+ }
539
+
540
+ async function resolvePaymentMethodId(page: Page, token: string): Promise<string | null> {
541
+ const response = await apiRequest(
542
+ page.request,
543
+ 'GET',
544
+ '/api/sales/payment-methods?page=1&pageSize=20&isActive=true',
545
+ { token },
546
+ ).catch(() => null);
547
+ const body = (await response?.json().catch(() => null)) as {
548
+ result?: { items?: PaymentMethodListItem[] };
549
+ items?: PaymentMethodListItem[];
550
+ } | null;
551
+ const items = readListItems(body);
552
+ const preferred = items.find((item) => item.code === 'bank-transfer')
553
+ ?? items.find((item) => item.name?.toLowerCase().includes('bank'))
554
+ ?? items[0];
555
+ return preferred?.id ?? null;
556
+ }
557
+
558
+ async function refreshSalesDocumentPage(page: Page, activeTabName: 'Shipments' | 'Payments'): Promise<void> {
559
+ await page.reload({ waitUntil: 'domcontentloaded' }).catch(() => {});
560
+ await ensureSalesDocumentReady(page);
561
+ const tab = page.getByRole('button', { name: new RegExp(`^${activeTabName}$`, 'i') }).first();
562
+ await waitForStableVisibility(tab, TEST_WAIT_TIMEOUT_MS).catch(() => {});
563
+ await tab.click().catch(() => {});
564
+ }
565
+
566
+ async function addShipmentViaApi(
567
+ page: Page,
568
+ shipmentNumber: string,
569
+ trackingNumber: string,
570
+ ): Promise<boolean> {
571
+ const token = await getAuthToken(page.request, 'admin').catch(() => null);
572
+ const orderId = resolveOrderIdFromPage(page);
573
+ if (!token || !orderId) return false;
574
+ const [orderLineId, shippingMethodId] = await Promise.all([
575
+ resolveOrderLineId(page, token, orderId),
576
+ resolveShippingMethodId(page, token),
577
+ ]);
578
+ if (!orderLineId) return false;
579
+ const response = await apiRequest(page.request, 'POST', '/api/sales/shipments', {
580
+ token,
581
+ data: {
582
+ orderId,
583
+ shipmentNumber,
584
+ ...(shippingMethodId ? { shippingMethodId } : {}),
585
+ trackingNumbers: [trackingNumber],
586
+ shippedAt: new Date().toISOString(),
587
+ currencyCode: 'USD',
588
+ items: [{ orderLineId, quantity: '1' }],
589
+ },
590
+ }).catch(() => null);
591
+ if (!response?.ok()) return false;
592
+ await refreshSalesDocumentPage(page, 'Shipments');
593
+ return true;
594
+ }
595
+
596
+ async function addPaymentViaApi(page: Page, amount: number): Promise<boolean> {
597
+ const token = await getAuthToken(page.request, 'admin').catch(() => null);
598
+ const orderId = resolveOrderIdFromPage(page);
599
+ if (!token || !orderId) return false;
600
+ const paymentMethodId = await resolvePaymentMethodId(page, token);
601
+ const response = await apiRequest(page.request, 'POST', '/api/sales/payments', {
602
+ token,
603
+ data: {
604
+ orderId,
605
+ ...(paymentMethodId ? { paymentMethodId } : {}),
606
+ amount: amount.toFixed(2),
607
+ currencyCode: 'USD',
608
+ receivedAt: new Date().toISOString(),
609
+ },
610
+ }).catch(() => null);
611
+ if (!response?.ok()) return false;
612
+ await refreshSalesDocumentPage(page, 'Payments');
613
+ return true;
614
+ }
615
+
324
616
  async function createSalesDocumentFixture(
325
617
  page: Page,
326
618
  token: string,
327
619
  kind: DocumentKind,
328
620
  customerQuery: string,
329
621
  channelQuery: string,
622
+ ids?: { customerEntityId?: string | null; channelId?: string | null; customerAddressId?: string | null },
330
623
  ): Promise<string> {
331
- const customerEntityId = await resolveCustomerEntityId(page, token, customerQuery);
332
- const channelId = await resolveSalesChannelId(page, token, channelQuery);
624
+ const customerEntityId =
625
+ ids?.customerEntityId ??
626
+ await resolveCustomerEntityId(page, token, customerQuery);
627
+ const channelId =
628
+ ids?.channelId ??
629
+ await resolveSalesChannelId(page, token, channelQuery);
333
630
  const payload: Record<string, unknown> = {
334
631
  currencyCode: 'USD',
335
632
  };
@@ -348,6 +645,21 @@ async function createSalesDocumentFixture(
348
645
  if (!id) {
349
646
  throw new Error(`Missing sales ${kind} id in API fallback response.`);
350
647
  }
648
+
649
+ if (customerEntityId) {
650
+ const address = await ensureCustomerAddressFixture(page, token, customerEntityId, ids?.customerAddressId);
651
+ if (address) {
652
+ await apiRequest(page.request, 'POST', '/api/sales/document-addresses', {
653
+ token,
654
+ data: {
655
+ documentId: id,
656
+ documentKind: kind,
657
+ ...address,
658
+ },
659
+ }).catch(() => {});
660
+ }
661
+ }
662
+
351
663
  return id;
352
664
  }
353
665
 
@@ -471,10 +783,16 @@ export async function createSalesDocument(page: Page, options: CreateDocumentOpt
471
783
  const fixtureContext = await ensureSalesDocumentFixtures(page, options);
472
784
  const customerQuery = fixtureContext.customerQuery;
473
785
  const channelQuery = fixtureContext.channelQuery;
786
+ let fallbackToken: string | null = options.token ?? fixtureContext.authToken ?? null;
787
+ const resolveFallbackToken = async (): Promise<string> => {
788
+ if (fallbackToken) return fallbackToken;
789
+ fallbackToken = await getAuthToken(page.request, 'admin');
790
+ return fallbackToken;
791
+ };
474
792
 
475
793
  if (options.preferApi) {
476
- const token = await getAuthToken(page.request, 'admin');
477
- const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery);
794
+ const token = await resolveFallbackToken();
795
+ const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);
478
796
  await openSalesDocumentPage(page, id, options.kind);
479
797
  return id;
480
798
  }
@@ -496,8 +814,8 @@ export async function createSalesDocument(page: Page, options: CreateDocumentOpt
496
814
  }
497
815
  }
498
816
  if (!createPageReady) {
499
- const token = await getAuthToken(page.request, 'admin');
500
- const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery);
817
+ const token = await resolveFallbackToken();
818
+ const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);
501
819
  await openSalesDocumentPage(page, id, options.kind);
502
820
  return id;
503
821
  }
@@ -510,7 +828,6 @@ export async function createSalesDocument(page: Page, options: CreateDocumentOpt
510
828
  const hasGenerateButton = (await generateButton.count()) > 0;
511
829
  if (hasGenerateButton) {
512
830
  await expect(generateButton).toBeVisible({ timeout: 10_000 });
513
- await expect(generateButton).toBeEnabled({ timeout: 30_000 });
514
831
  }
515
832
 
516
833
  await page.getByText('Document type').click();
@@ -519,20 +836,24 @@ export async function createSalesDocument(page: Page, options: CreateDocumentOpt
519
836
  customerQuery,
520
837
  new RegExp(escapeRegExp(customerQuery), 'i'),
521
838
  );
522
- if (!customerSelected) throw new Error(`Could not select customer "${customerQuery}" while creating sales ${options.kind}.`);
523
-
524
- await selectLookupValue(
839
+ const channelSelected = await selectLookupValue(
525
840
  page.getByRole('textbox', { name: /Select a channel/i }).first(),
526
841
  channelQuery,
527
842
  new RegExp(escapeRegExp(channelQuery), 'i'),
528
843
  );
844
+ if (!customerSelected || !channelSelected) {
845
+ const token = await resolveFallbackToken();
846
+ const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);
847
+ await openSalesDocumentPage(page, id, options.kind);
848
+ return id;
849
+ }
529
850
 
530
851
  await selectFirstAddressIfAvailable(page);
531
852
 
532
853
  const createEnabled = await createButton.isEnabled().catch(() => false);
533
854
  if (!createEnabled) {
534
- const token = await getAuthToken(page.request, 'admin');
535
- const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery);
855
+ const token = await resolveFallbackToken();
856
+ const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);
536
857
  await openSalesDocumentPage(page, id, options.kind);
537
858
  return id;
538
859
  }
@@ -546,8 +867,8 @@ export async function createSalesDocument(page: Page, options: CreateDocumentOpt
546
867
  { timeout: TEST_WAIT_TIMEOUT_MS },
547
868
  ).then(() => true).catch(() => false);
548
869
  if (!navigated) {
549
- const token = await getAuthToken(page.request, 'admin');
550
- const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery);
870
+ const token = await resolveFallbackToken();
871
+ const id = await createSalesDocumentFixture(page, token, options.kind, customerQuery, channelQuery, fixtureContext);
551
872
  await openSalesDocumentPage(page, id, options.kind);
552
873
  return id;
553
874
  }
@@ -857,7 +1178,10 @@ export async function addPayment(page: Page, amount: number): Promise<{ amountLa
857
1178
  await dialog.waitFor({ state: 'hidden', timeout: 1_500 }).catch(() => {});
858
1179
  }
859
1180
  await operationMessage.waitFor({ state: 'visible', timeout: 2_500 }).catch(() => {});
860
- const added = await operationMessage.isVisible().catch(() => false);
1181
+ let added = await operationMessage.isVisible().catch(() => false);
1182
+ if (!added) {
1183
+ added = await addPaymentViaApi(page, amount);
1184
+ }
861
1185
  return { amountLabel, added };
862
1186
  }
863
1187
 
@@ -869,14 +1193,58 @@ export async function addShipment(page: Page): Promise<{ trackingNumber: string;
869
1193
  await shipmentsTab.click();
870
1194
  const trackingNumber = `SHIP-${Date.now()}`;
871
1195
  const shipmentNumber = String(Date.now());
872
- const addShipmentButton = page.getByRole('button', { name: /Add shipment/i }).first();
873
- await waitForStableVisibility(addShipmentButton, TEST_WAIT_TIMEOUT_MS);
874
- await expect(addShipmentButton).toBeEnabled({ timeout: TEST_WAIT_TIMEOUT_MS });
875
- await addShipmentButton.click();
876
-
877
1196
  const dialog = page.getByRole('dialog', { name: /Add shipment/i });
878
- const shipmentNumberInput = dialog.getByRole('textbox').first();
879
- await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments…|Loading shipments\.\.\./i);
1197
+ const openShipmentDialog = async (): Promise<boolean> => {
1198
+ const addShipmentButtons = page.getByRole('button', { name: /Add shipment/i });
1199
+ const buttonCount = await addShipmentButtons.count();
1200
+ for (let index = buttonCount - 1; index >= 0; index -= 1) {
1201
+ const button = addShipmentButtons.nth(index);
1202
+ if (!(await button.isVisible().catch(() => false))) continue;
1203
+ if (!(await button.isEnabled().catch(() => false))) continue;
1204
+ await waitForStableVisibility(button, TEST_WAIT_TIMEOUT_MS).catch(() => {});
1205
+ await button.scrollIntoViewIfNeeded().catch(() => {});
1206
+ await button.click().catch(() => {});
1207
+ const visible = await dialog.waitFor({ state: 'visible', timeout: 2_500 }).then(() => true).catch(() => false);
1208
+ if (visible) return true;
1209
+ }
1210
+ return false;
1211
+ };
1212
+
1213
+ let dialogReady = false;
1214
+ for (let attempt = 0; attempt < 2; attempt += 1) {
1215
+ const opened = await openShipmentDialog();
1216
+ if (!opened) break;
1217
+ await dialog
1218
+ .getByText(/Loading shipments…|Loading shipments\.\.\./i)
1219
+ .first()
1220
+ .waitFor({ state: 'hidden', timeout: 5_000 })
1221
+ .catch(() => {});
1222
+ const shipmentNumberInput = dialog.locator('input, textarea').first();
1223
+ if (await shipmentNumberInput.isVisible().catch(() => false)) {
1224
+ await waitForStableVisibility(shipmentNumberInput, TEST_WAIT_TIMEOUT_MS).catch(() => {});
1225
+ dialogReady = true;
1226
+ break;
1227
+ }
1228
+ await dialog.getByRole('button', { name: /Close/i }).first().click().catch(() => {});
1229
+ await dialog.waitFor({ state: 'hidden', timeout: 2_000 }).catch(() => {});
1230
+ }
1231
+ if (!dialogReady) {
1232
+ const added = await addShipmentViaApi(page, shipmentNumber, trackingNumber);
1233
+ if (!added) {
1234
+ await openShipmentDialog();
1235
+ const shipmentNumberInput = dialog.locator('input, textarea').first();
1236
+ await waitForDialogFieldReady(dialog, shipmentNumberInput, /Loading shipments…|Loading shipments\.\.\./i);
1237
+ } else {
1238
+ const shipmentLabel = page.getByText(new RegExp(`Shipment\\s+${escapeRegExp(shipmentNumber)}`, 'i')).first();
1239
+ const visible = await shipmentLabel
1240
+ .waitFor({ state: 'visible', timeout: TEST_WAIT_TIMEOUT_MS })
1241
+ .then(() => true)
1242
+ .catch(() => false);
1243
+ return { trackingNumber, shipmentNumber, added: visible };
1244
+ }
1245
+ }
1246
+
1247
+ const shipmentNumberInput = dialog.locator('input, textarea').first();
880
1248
  await fillShipmentNumber(dialog, shipmentNumber);
881
1249
  const trackingInput = dialog.getByPlaceholder(/One per line or comma separated/i).first();
882
1250
  await waitForStableVisibility(trackingInput, 4_000).catch(() => {});
@@ -1,8 +1,7 @@
1
1
  import ApiDocsExplorer from './Explorer'
2
- import { getModules } from '@open-mercato/shared/lib/i18n/server'
3
- import { buildOpenApiDocument } from '@open-mercato/shared/lib/openapi'
4
2
  import { resolveApiDocsBaseUrl } from '@open-mercato/core/modules/api_docs/lib/resources'
5
3
  import { APP_VERSION } from '@open-mercato/shared/lib/version'
4
+ import type { OpenApiDocument } from '@open-mercato/shared/lib/openapi'
6
5
 
7
6
  type ExplorerOperation = {
8
7
  id: string
@@ -52,15 +51,19 @@ function buildTagOrder(doc: any, operations: ExplorerOperation[]): string[] {
52
51
 
53
52
  export default async function ApiDocsViewerPage() {
54
53
  const baseUrl = resolveApiDocsBaseUrl()
55
- const modules = getModules()
56
- const doc = buildOpenApiDocument(modules, {
57
- title: 'Open Mercato API',
58
- version: APP_VERSION,
59
- description: 'Auto-generated OpenAPI definition for all enabled modules.',
60
- servers: [{ url: baseUrl, description: 'Default environment' }],
61
- baseUrlForExamples: baseUrl,
62
- defaultSecurity: ['bearerAuth'],
63
- })
54
+ const response = await fetch(`${baseUrl}/docs/openapi`, { cache: 'no-store' })
55
+ const doc = response.ok
56
+ ? await response.json() as OpenApiDocument
57
+ : {
58
+ openapi: '3.1.0',
59
+ info: {
60
+ title: 'Open Mercato API',
61
+ version: APP_VERSION,
62
+ description: 'Auto-generated OpenAPI definition for all enabled modules.',
63
+ },
64
+ servers: [{ url: baseUrl, description: 'Default environment' }],
65
+ paths: {},
66
+ } satisfies OpenApiDocument
64
67
 
65
68
  const operations = collectOperations(doc)
66
69
  const tagOrder = buildTagOrder(doc, operations)