@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.
- package/dist/generated/entities/access_log/index.js.map +1 -1
- package/dist/generated/entities/action_log/index.js.map +1 -1
- package/dist/generated/entities/api_key/index.js.map +1 -1
- package/dist/generated/entities/attachment/index.js.map +1 -1
- package/dist/generated/entities/attachment_partition/index.js.map +1 -1
- package/dist/generated/entities/business_rule/index.js.map +1 -1
- package/dist/generated/entities/carrier_shipment/index.js.map +1 -1
- package/dist/generated/entities/catalog_offer/index.js.map +1 -1
- package/dist/generated/entities/catalog_option_schema_template/index.js.map +1 -1
- package/dist/generated/entities/catalog_price_kind/index.js.map +1 -1
- package/dist/generated/entities/catalog_product/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_category/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_category_assignment/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_price/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_tag/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_tag_assignment/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_unit_conversion/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_variant/index.js.map +1 -1
- package/dist/generated/entities/catalog_product_variant_relation/index.js.map +1 -1
- package/dist/generated/entities/currency/index.js.map +1 -1
- package/dist/generated/entities/currency_fetch_config/index.js.map +1 -1
- package/dist/generated/entities/custom_entity/index.js.map +1 -1
- package/dist/generated/entities/custom_entity_storage/index.js.map +1 -1
- package/dist/generated/entities/custom_field_def/index.js.map +1 -1
- package/dist/generated/entities/custom_field_entity_config/index.js.map +1 -1
- package/dist/generated/entities/custom_field_value/index.js.map +1 -1
- package/dist/generated/entities/customer_activity/index.js.map +1 -1
- package/dist/generated/entities/customer_address/index.js.map +1 -1
- package/dist/generated/entities/customer_comment/index.js.map +1 -1
- package/dist/generated/entities/customer_company_profile/index.js.map +1 -1
- package/dist/generated/entities/customer_deal/index.js.map +1 -1
- package/dist/generated/entities/customer_deal_company_link/index.js.map +1 -1
- package/dist/generated/entities/customer_deal_person_link/index.js.map +1 -1
- package/dist/generated/entities/customer_dictionary_entry/index.js.map +1 -1
- package/dist/generated/entities/customer_entity/index.js.map +1 -1
- package/dist/generated/entities/customer_interaction/index.js.map +1 -1
- package/dist/generated/entities/customer_person_profile/index.js.map +1 -1
- package/dist/generated/entities/customer_pipeline/index.js.map +1 -1
- package/dist/generated/entities/customer_pipeline_stage/index.js.map +1 -1
- package/dist/generated/entities/customer_role/index.js.map +1 -1
- package/dist/generated/entities/customer_role_acl/index.js.map +1 -1
- package/dist/generated/entities/customer_settings/index.js.map +1 -1
- package/dist/generated/entities/customer_tag/index.js.map +1 -1
- package/dist/generated/entities/customer_tag_assignment/index.js.map +1 -1
- package/dist/generated/entities/customer_todo_link/index.js.map +1 -1
- package/dist/generated/entities/customer_user/index.js.map +1 -1
- package/dist/generated/entities/customer_user_acl/index.js.map +1 -1
- package/dist/generated/entities/customer_user_email_verification/index.js.map +1 -1
- package/dist/generated/entities/customer_user_invitation/index.js.map +1 -1
- package/dist/generated/entities/customer_user_password_reset/index.js.map +1 -1
- package/dist/generated/entities/customer_user_role/index.js.map +1 -1
- package/dist/generated/entities/customer_user_session/index.js.map +1 -1
- package/dist/generated/entities/dashboard_layout/index.js.map +1 -1
- package/dist/generated/entities/dashboard_role_widgets/index.js.map +1 -1
- package/dist/generated/entities/dashboard_user_widgets/index.js.map +1 -1
- package/dist/generated/entities/dictionary/index.js.map +1 -1
- package/dist/generated/entities/dictionary_entry/index.js.map +1 -1
- package/dist/generated/entities/encryption_map/index.js.map +1 -1
- package/dist/generated/entities/entity_index_coverage/index.js.map +1 -1
- package/dist/generated/entities/entity_index_job/index.js.map +1 -1
- package/dist/generated/entities/entity_index_row/index.js.map +1 -1
- package/dist/generated/entities/entity_translation/index.js.map +1 -1
- package/dist/generated/entities/exchange_rate/index.js.map +1 -1
- package/dist/generated/entities/feature_toggle/index.js.map +1 -1
- package/dist/generated/entities/feature_toggle_override/index.js.map +1 -1
- package/dist/generated/entities/gateway_transaction/index.js.map +1 -1
- package/dist/generated/entities/inbox_discrepancy/index.js.map +1 -1
- package/dist/generated/entities/inbox_email/index.js.map +1 -1
- package/dist/generated/entities/inbox_proposal/index.js.map +1 -1
- package/dist/generated/entities/inbox_proposal_action/index.js.map +1 -1
- package/dist/generated/entities/inbox_settings/index.js.map +1 -1
- package/dist/generated/entities/indexer_error_log/index.js.map +1 -1
- package/dist/generated/entities/indexer_status_log/index.js.map +1 -1
- package/dist/generated/entities/integration_credentials/index.js.map +1 -1
- package/dist/generated/entities/integration_log/index.js.map +1 -1
- package/dist/generated/entities/integration_state/index.js.map +1 -1
- package/dist/generated/entities/message/index.js.map +1 -1
- package/dist/generated/entities/message_access_token/index.js.map +1 -1
- package/dist/generated/entities/message_confirmation/index.js.map +1 -1
- package/dist/generated/entities/message_object/index.js.map +1 -1
- package/dist/generated/entities/message_recipient/index.js.map +1 -1
- package/dist/generated/entities/module_config/index.js.map +1 -1
- package/dist/generated/entities/notification/index.js.map +1 -1
- package/dist/generated/entities/organization/index.js.map +1 -1
- package/dist/generated/entities/password_reset/index.js.map +1 -1
- package/dist/generated/entities/perspective/index.js.map +1 -1
- package/dist/generated/entities/planner_availability_rule/index.js.map +1 -1
- package/dist/generated/entities/planner_availability_rule_set/index.js.map +1 -1
- package/dist/generated/entities/progress_job/index.js.map +1 -1
- package/dist/generated/entities/resources_resource/index.js.map +1 -1
- package/dist/generated/entities/resources_resource_activity/index.js.map +1 -1
- package/dist/generated/entities/resources_resource_comment/index.js.map +1 -1
- package/dist/generated/entities/resources_resource_tag/index.js.map +1 -1
- package/dist/generated/entities/resources_resource_tag_assignment/index.js.map +1 -1
- package/dist/generated/entities/resources_resource_type/index.js.map +1 -1
- package/dist/generated/entities/role/index.js.map +1 -1
- package/dist/generated/entities/role_acl/index.js.map +1 -1
- package/dist/generated/entities/role_perspective/index.js.map +1 -1
- package/dist/generated/entities/role_sidebar_preference/index.js.map +1 -1
- package/dist/generated/entities/rule_execution_log/index.js.map +1 -1
- package/dist/generated/entities/rule_set/index.js.map +1 -1
- package/dist/generated/entities/rule_set_member/index.js.map +1 -1
- package/dist/generated/entities/sales_channel/index.js.map +1 -1
- package/dist/generated/entities/sales_credit_memo/index.js.map +1 -1
- package/dist/generated/entities/sales_credit_memo_line/index.js.map +1 -1
- package/dist/generated/entities/sales_delivery_window/index.js.map +1 -1
- package/dist/generated/entities/sales_document_address/index.js.map +1 -1
- package/dist/generated/entities/sales_document_sequence/index.js.map +1 -1
- package/dist/generated/entities/sales_document_tag/index.js.map +1 -1
- package/dist/generated/entities/sales_document_tag_assignment/index.js.map +1 -1
- package/dist/generated/entities/sales_invoice/index.js.map +1 -1
- package/dist/generated/entities/sales_invoice_line/index.js.map +1 -1
- package/dist/generated/entities/sales_note/index.js.map +1 -1
- package/dist/generated/entities/sales_order/index.js.map +1 -1
- package/dist/generated/entities/sales_order_adjustment/index.js.map +1 -1
- package/dist/generated/entities/sales_order_line/index.js.map +1 -1
- package/dist/generated/entities/sales_payment/index.js.map +1 -1
- package/dist/generated/entities/sales_payment_allocation/index.js.map +1 -1
- package/dist/generated/entities/sales_payment_method/index.js.map +1 -1
- package/dist/generated/entities/sales_quote/index.js.map +1 -1
- package/dist/generated/entities/sales_quote_adjustment/index.js.map +1 -1
- package/dist/generated/entities/sales_quote_line/index.js.map +1 -1
- package/dist/generated/entities/sales_return/index.js.map +1 -1
- package/dist/generated/entities/sales_return_line/index.js.map +1 -1
- package/dist/generated/entities/sales_settings/index.js.map +1 -1
- package/dist/generated/entities/sales_shipment/index.js.map +1 -1
- package/dist/generated/entities/sales_shipment_item/index.js.map +1 -1
- package/dist/generated/entities/sales_shipping_method/index.js.map +1 -1
- package/dist/generated/entities/sales_tax_rate/index.js.map +1 -1
- package/dist/generated/entities/search_token/index.js.map +1 -1
- package/dist/generated/entities/session/index.js.map +1 -1
- package/dist/generated/entities/staff_leave_request/index.js.map +1 -1
- package/dist/generated/entities/staff_team/index.js.map +1 -1
- package/dist/generated/entities/staff_team_member/index.js.map +1 -1
- package/dist/generated/entities/staff_team_member_activity/index.js.map +1 -1
- package/dist/generated/entities/staff_team_member_address/index.js.map +1 -1
- package/dist/generated/entities/staff_team_member_comment/index.js.map +1 -1
- package/dist/generated/entities/staff_team_member_job_history/index.js.map +1 -1
- package/dist/generated/entities/staff_team_role/index.js.map +1 -1
- package/dist/generated/entities/step_instance/index.js.map +1 -1
- package/dist/generated/entities/sync_cursor/index.js.map +1 -1
- package/dist/generated/entities/sync_external_id_mapping/index.js.map +1 -1
- package/dist/generated/entities/sync_mapping/index.js.map +1 -1
- package/dist/generated/entities/sync_run/index.js.map +1 -1
- package/dist/generated/entities/sync_schedule/index.js.map +1 -1
- package/dist/generated/entities/tenant/index.js.map +1 -1
- package/dist/generated/entities/upgrade_action_run/index.js.map +1 -1
- package/dist/generated/entities/user/index.js.map +1 -1
- package/dist/generated/entities/user_acl/index.js.map +1 -1
- package/dist/generated/entities/user_consent/index.js.map +1 -1
- package/dist/generated/entities/user_role/index.js.map +1 -1
- package/dist/generated/entities/user_sidebar_preference/index.js.map +1 -1
- package/dist/generated/entities/user_task/index.js.map +1 -1
- package/dist/generated/entities/webhook_processed_event/index.js.map +1 -1
- package/dist/generated/entities/workflow_definition/index.js.map +1 -1
- package/dist/generated/entities/workflow_event/index.js.map +1 -1
- package/dist/generated/entities/workflow_event_trigger/index.js.map +1 -1
- package/dist/generated/entities/workflow_instance/index.js.map +1 -1
- package/dist/generated/entities.ids.generated.js +1 -2
- package/dist/generated/entities.ids.generated.js.map +2 -2
- package/dist/generated/entity-fields-registry.js +2585 -316
- package/dist/generated/entity-fields-registry.js.map +2 -2
- package/dist/helpers/integration/auth.js +23 -0
- package/dist/helpers/integration/auth.js.map +2 -2
- package/dist/helpers/integration/salesUi.js +261 -28
- package/dist/helpers/integration/salesUi.js.map +3 -3
- package/dist/modules/api_docs/frontend/docs/api/page.js +10 -10
- package/dist/modules/api_docs/frontend/docs/api/page.js.map +2 -2
- package/dist/modules/auth/api/admin/nav.js +5 -3
- package/dist/modules/auth/api/admin/nav.js.map +2 -2
- package/dist/modules/auth/lib/backendChrome.js +28 -1
- package/dist/modules/auth/lib/backendChrome.js.map +2 -2
- package/dist/modules/catalog/api/products/route.js +23 -6
- package/dist/modules/catalog/api/products/route.js.map +2 -2
- package/dist/modules/configs/lib/system-status.js +1 -1
- package/dist/modules/configs/lib/system-status.js.map +1 -1
- package/dist/modules/customers/backend/customers/deals/[id]/page.js +226 -221
- package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
- package/dist/modules/customers/commands/companies.js +14 -0
- package/dist/modules/customers/commands/companies.js.map +2 -2
- package/dist/modules/customers/commands/people.js +18 -1
- package/dist/modules/customers/commands/people.js.map +2 -2
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js +0 -1
- package/dist/modules/entities/backend/entities/user/[entityId]/records/create/page.js.map +2 -2
- package/dist/modules/query_index/lib/engine.js +2 -2
- package/dist/modules/query_index/lib/engine.js.map +2 -2
- package/generated/entities/access_log/index.ts +11 -11
- package/generated/entities/action_log/index.ts +20 -20
- package/generated/entities/api_key/index.ts +17 -17
- package/generated/entities/attachment/index.ts +15 -15
- package/generated/entities/attachment_partition/index.ts +11 -11
- package/generated/entities/business_rule/index.ts +23 -23
- package/generated/entities/carrier_shipment/index.ts +17 -17
- package/generated/entities/catalog_offer/index.ts +15 -15
- package/generated/entities/catalog_option_schema_template/index.ts +12 -12
- package/generated/entities/catalog_price_kind/index.ts +13 -13
- package/generated/entities/catalog_product/index.ts +39 -39
- package/generated/entities/catalog_product_category/index.ts +19 -19
- package/generated/entities/catalog_product_category_assignment/index.ts +8 -8
- package/generated/entities/catalog_product_price/index.ts +25 -25
- package/generated/entities/catalog_product_tag/index.ts +8 -8
- package/generated/entities/catalog_product_tag_assignment/index.ts +7 -7
- package/generated/entities/catalog_product_unit_conversion/index.ts +12 -12
- package/generated/entities/catalog_product_variant/index.ts +24 -24
- package/generated/entities/catalog_product_variant_relation/index.ts +14 -14
- package/generated/entities/currency/index.ts +14 -14
- package/generated/entities/currency_fetch_config/index.ts +13 -13
- package/generated/entities/custom_entity/index.ts +13 -13
- package/generated/entities/custom_entity_storage/index.ts +9 -9
- package/generated/entities/custom_field_def/index.ts +11 -11
- package/generated/entities/custom_field_entity_config/index.ts +9 -9
- package/generated/entities/custom_field_value/index.ts +13 -13
- package/generated/entities/customer_activity/index.ts +14 -14
- package/generated/entities/customer_address/index.ts +20 -20
- package/generated/entities/customer_comment/index.ts +12 -12
- package/generated/entities/customer_company_profile/index.ts +13 -13
- package/generated/entities/customer_deal/index.ts +22 -22
- package/generated/entities/customer_deal_company_link/index.ts +4 -4
- package/generated/entities/customer_deal_person_link/index.ts +5 -5
- package/generated/entities/customer_dictionary_entry/index.ts +11 -11
- package/generated/entities/customer_entity/index.ts +32 -32
- package/generated/entities/customer_interaction/index.ts +20 -20
- package/generated/entities/customer_person_profile/index.ts +16 -16
- package/generated/entities/customer_pipeline/index.ts +7 -7
- package/generated/entities/customer_pipeline_stage/index.ts +8 -8
- package/generated/entities/customer_role/index.ts +12 -12
- package/generated/entities/customer_role_acl/index.ts +8 -8
- package/generated/entities/customer_settings/index.ts +6 -6
- package/generated/entities/customer_tag/index.ts +10 -10
- package/generated/entities/customer_tag_assignment/index.ts +6 -6
- package/generated/entities/customer_todo_link/index.ts +8 -8
- package/generated/entities/customer_user/index.ts +17 -17
- package/generated/entities/customer_user_acl/index.ts +8 -8
- package/generated/entities/customer_user_email_verification/index.ts +7 -7
- package/generated/entities/customer_user_invitation/index.ts +15 -15
- package/generated/entities/customer_user_password_reset/index.ts +6 -6
- package/generated/entities/customer_user_role/index.ts +5 -5
- package/generated/entities/customer_user_session/index.ts +9 -9
- package/generated/entities/dashboard_layout/index.ts +8 -8
- package/generated/entities/dashboard_role_widgets/index.ts +8 -8
- package/generated/entities/dashboard_user_widgets/index.ts +9 -9
- package/generated/entities/dictionary/index.ts +12 -12
- package/generated/entities/dictionary_entry/index.ts +11 -11
- package/generated/entities/encryption_map/index.ts +9 -9
- package/generated/entities/entity_index_coverage/index.ts +9 -9
- package/generated/entities/entity_index_job/index.ts +12 -12
- package/generated/entities/entity_index_row/index.ts +11 -11
- package/generated/entities/entity_translation/index.ts +8 -8
- package/generated/entities/exchange_rate/index.ts +13 -13
- package/generated/entities/feature_toggle/index.ts +10 -10
- package/generated/entities/feature_toggle_override/index.ts +6 -6
- package/generated/entities/gateway_transaction/index.ts +22 -22
- package/generated/entities/inbox_discrepancy/index.ts +15 -15
- package/generated/entities/inbox_email/index.ts +26 -26
- package/generated/entities/inbox_proposal/index.ts +22 -22
- package/generated/entities/inbox_proposal_action/index.ts +23 -23
- package/generated/entities/inbox_settings/index.ts +9 -9
- package/generated/entities/indexer_error_log/index.ts +11 -11
- package/generated/entities/indexer_status_log/index.ts +11 -11
- package/generated/entities/integration_credentials/index.ts +8 -8
- package/generated/entities/integration_log/index.ts +12 -12
- package/generated/entities/integration_state/index.ts +12 -12
- package/generated/entities/message/index.ts +31 -31
- package/generated/entities/message_access_token/index.ts +8 -8
- package/generated/entities/message_confirmation/index.ts +9 -9
- package/generated/entities/message_object/index.ts +10 -10
- package/generated/entities/message_recipient/index.ts +14 -14
- package/generated/entities/module_config/index.ts +6 -6
- package/generated/entities/notification/index.ts +27 -27
- package/generated/entities/organization/index.ts +15 -15
- package/generated/entities/password_reset/index.ts +7 -7
- package/generated/entities/perspective/index.ts +11 -11
- package/generated/entities/planner_availability_rule/index.ts +15 -15
- package/generated/entities/planner_availability_rule_set/index.ts +9 -9
- package/generated/entities/progress_job/index.ts +27 -27
- package/generated/entities/resources_resource/index.ts +18 -18
- package/generated/entities/resources_resource_activity/index.ts +13 -13
- package/generated/entities/resources_resource_comment/index.ts +11 -11
- package/generated/entities/resources_resource_tag/index.ts +10 -10
- package/generated/entities/resources_resource_tag_assignment/index.ts +7 -7
- package/generated/entities/resources_resource_type/index.ts +10 -10
- package/generated/entities/role/index.ts +5 -5
- package/generated/entities/role_acl/index.ts +9 -9
- package/generated/entities/role_perspective/index.ts +11 -11
- package/generated/entities/role_sidebar_preference/index.ts +8 -8
- package/generated/entities/rule_execution_log/index.ts +13 -13
- package/generated/entities/rule_set/index.ts +12 -12
- package/generated/entities/rule_set_member/index.ts +8 -8
- package/generated/entities/sales_channel/index.ts +25 -25
- package/generated/entities/sales_credit_memo/index.ts +21 -21
- package/generated/entities/sales_credit_memo_line/index.ts +20 -20
- package/generated/entities/sales_delivery_window/index.ts +15 -15
- package/generated/entities/sales_document_address/index.ts +24 -24
- package/generated/entities/sales_document_sequence/index.ts +8 -8
- package/generated/entities/sales_document_tag/index.ts +10 -10
- package/generated/entities/sales_document_tag_assignment/index.ts +10 -10
- package/generated/entities/sales_invoice/index.ts +25 -25
- package/generated/entities/sales_invoice_line/index.ts +23 -23
- package/generated/entities/sales_note/index.ts +14 -14
- package/generated/entities/sales_order/index.ts +71 -71
- package/generated/entities/sales_order_adjustment/index.ts +20 -20
- package/generated/entities/sales_order_line/index.ts +44 -44
- package/generated/entities/sales_payment/index.ts +20 -20
- package/generated/entities/sales_payment_allocation/index.ts +9 -9
- package/generated/entities/sales_payment_method/index.ts +15 -15
- package/generated/entities/sales_quote/index.ts +56 -56
- package/generated/entities/sales_quote_adjustment/index.ts +20 -20
- package/generated/entities/sales_quote_line/index.ts +37 -37
- package/generated/entities/sales_return/index.ts +14 -14
- package/generated/entities/sales_return_line/index.ts +13 -13
- package/generated/entities/sales_settings/index.ts +10 -10
- package/generated/entities/sales_shipment/index.ts +24 -24
- package/generated/entities/sales_shipment_item/index.ts +7 -7
- package/generated/entities/sales_shipping_method/index.ts +19 -19
- package/generated/entities/sales_tax_rate/index.ts +22 -22
- package/generated/entities/search_token/index.ts +9 -9
- package/generated/entities/session/index.ts +7 -7
- package/generated/entities/staff_leave_request/index.ts +18 -18
- package/generated/entities/staff_team/index.ts +9 -9
- package/generated/entities/staff_team_member/index.ts +14 -14
- package/generated/entities/staff_team_member_activity/index.ts +13 -13
- package/generated/entities/staff_team_member_address/index.ts +20 -20
- package/generated/entities/staff_team_member_comment/index.ts +11 -11
- package/generated/entities/staff_team_member_job_history/index.ts +11 -11
- package/generated/entities/staff_team_role/index.ts +11 -11
- package/generated/entities/step_instance/index.ts +17 -17
- package/generated/entities/sync_cursor/index.ts +8 -8
- package/generated/entities/sync_external_id_mapping/index.ts +12 -12
- package/generated/entities/sync_mapping/index.ts +8 -8
- package/generated/entities/sync_run/index.ts +21 -21
- package/generated/entities/sync_schedule/index.ts +16 -16
- package/generated/entities/tenant/index.ts +7 -7
- package/generated/entities/upgrade_action_run/index.ts +7 -7
- package/generated/entities/user/index.ts +11 -11
- package/generated/entities/user_acl/index.ts +9 -9
- package/generated/entities/user_consent/index.ts +14 -14
- package/generated/entities/user_role/index.ts +5 -5
- package/generated/entities/user_sidebar_preference/index.ts +9 -9
- package/generated/entities/user_task/index.ts +22 -22
- package/generated/entities/webhook_processed_event/index.ts +7 -7
- package/generated/entities/workflow_definition/index.ts +17 -17
- package/generated/entities/workflow_event/index.ts +9 -9
- package/generated/entities/workflow_event_trigger/index.ts +15 -15
- package/generated/entities/workflow_instance/index.ts +22 -22
- package/generated/entities.ids.generated.ts +258 -258
- package/generated/entity-fields-registry.ts +2587 -319
- package/package.json +3 -3
- package/src/helpers/integration/auth.ts +22 -0
- package/src/helpers/integration/salesUi.ts +397 -29
- package/src/modules/api_docs/frontend/docs/api/page.tsx +14 -11
- package/src/modules/auth/api/admin/nav.ts +5 -4
- package/src/modules/auth/lib/backendChrome.tsx +36 -3
- package/src/modules/catalog/api/products/route.ts +25 -6
- package/src/modules/configs/lib/system-status.ts +1 -1
- package/src/modules/customers/backend/customers/deals/[id]/page.tsx +1 -1
- package/src/modules/customers/commands/companies.ts +15 -0
- package/src/modules/customers/commands/people.ts +19 -1
- package/src/modules/entities/backend/entities/user/[entityId]/records/create/page.tsx +0 -1
- 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.
|
|
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.
|
|
233
|
+
"@open-mercato/shared": "0.4.11-develop.1409.b9a9ec6681"
|
|
234
234
|
},
|
|
235
235
|
"devDependencies": {
|
|
236
|
-
"@open-mercato/shared": "0.4.11-develop.
|
|
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<{
|
|
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
|
-
|
|
117
|
-
if (
|
|
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:
|
|
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 {
|
|
288
|
-
|
|
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 =
|
|
332
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
879
|
-
|
|
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
|
|
56
|
-
const doc =
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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)
|